#include <stdio.h>
struct Person {
int i;
int height;
int weight;
int age;
double bmi;
};
int main(void)
{
struct Person dt[3];
{
data[0].height = 172;
data[0].weight = 43;
data[0].age = 21;
data[0].bmi = data[0].height / (data[0].weight*data[0].weight);
data[1].height = 142;
data[1].weight = 53;
data[1].age = 17;
data[1].bmi = data[1].height / (data[1].weight*data[1].weight);
data[1] = data[20];
data[2].height = 158;
data[2].weight = 57;
data[2].age = 47;
data[2].bmi = data[2].height / (data[2].weight*data[2].weight);
for (i = 0; i < 3; ++i){
printf("height=%d\n", data.height);
printf("weight=%d\n", data.weight);
printf("age=%d\n", data.age);
printf("BMI=%f\n", data.bmi);
}
printf("身長が一番高いのは、%d番目の方です。\n", data[0].height);
printf("体重が一番軽いのは、%d番目の方です。\n", data[0].weight);
printf("年齢が一番若い方は、%d番目の方です。\n", data[1]);
printf("BMIが一番低い方は、%d番目の方です。\n", data[0].bmi);
return 0;
}
自分なりに作ってみたのですがエラーが出て出力されません。どこがダメなのか教えていただけないでしょうか。
配列のデータを基にその中での最大最小値を表示するプログラム
Re: 配列のデータを基にその中での最大最小値を表示するプログラム
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
さらに、dataがstruct Person型の要素を十分な数もつ配列であると仮定すると、致命的(未定義動作)になる間違いは
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
とりあえずコンパイラのエラーメッセージを見るだけで、えーす さんが書きました:自分なりに作ってみたのですがエラーが出て出力されません。どこがダメなのか教えていただけないでしょうか。
- (使われていない変数dtは定義されているのに)使われている変数dataが定義されていない
- 使われている変数iが定義されていない
- int main(void)の後の{に対応する}が無い
さらに、dataがstruct Person型の要素を十分な数もつ配列であると仮定すると、致命的(未定義動作)になる間違いは
- printf("年齢が一番若い方は、%d番目の方です。\n", data[1]);において、int型のデータを要求する%dにstruct Person型のデータを渡している
- printf("BMIが一番低い方は、%d番目の方です。\n", data[0].bmi);において、double型のデータを渡している先がint型のデータを要求する%dである
- bmiの計算を実数(浮動小数点数)ではなく整数の割り算で行っているため、小数点以下が切り捨てられる
- data[1]に(未初期化または範囲外?の)data[20]を不自然に代入している
- 「最大最小値を表示するプログラム」のはずなのに、「番目の方です。」という誤解を招く出力をしている
- bmiに代入しているのが(実数の割り算だったとしても)ボディマス指数(体重[kg]/身長[m]^2)ではなく、身長[cm?]/体重[kg?]^2である
オフトピック
計算により最大最小値を求めるのがベターではあると思いますが、データが固定なので出力も固定で問題はないでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 配列のデータを基にその中での最大最小値を表示するプログラム
丁寧な回答感謝いたします。ご指摘いただいた部分をいくつか訂正してみたのですが、まだエラーが出ます。いくつかご指摘をいただいた部分で理解のできないところは訂正できていません。今一度ご指導お願いいたします。
#include <stdio.h>
struct Person {
int i;
int data[i];
int height;
int weight;
int age;
double bmi;
};
int main(void)
{
struct Person dt[3];
{
data[0].height = 172;
data[0].weight = 43;
data[0].age = 21;
data[0].bmi = (1.0)*data[0].weight / (data[0].height*data[0].height);
data[1].height = 142;
data[1].weight = 53;
data[1].age = 17;
data[1].bmi = (1.0)*data[1].weight / (data[1].height*data[1].height);
data[2].height = 158;
data[2].weight = 57;
data[2].age = 47;
data[2].bmi = (1.0)*data[2].weight / (data[2].height*data[2].height);
int i;
for (i = 0; i < 3; ++i){
printf("height=%d\n", data[i].height);
printf("weight=%d\n", data[i].weight);
printf("age=%d\n", data[i].age);
printf("BMI=%f\n", data[i].bmi);
}
/* 下記の出力の準備プログラムを作成してください */
printf("身長が一番高いのは、%d番目の方です。\n", data[0].height);
printf("体重が一番軽いのは、%d番目の方です。\n", data[0].weight);
printf("年齢が一番若い方は、%d番目の方です。\n", data[1].age);
printf("BMIが一番低い方は、%f番目の方です。\n", data[0].bmi);
return 0;
}
}
Re: 配列のデータを基にその中での最大最小値を表示するプログラム
●修正された項目
- 使われている変数iが定義されていない
- int main(void)の後の{に対応する}が無い
- printf("年齢が一番若い方は、%d番目の方です。\n", data[1]);において、int型のデータを要求する%dにstruct Person型のデータを渡している
- printf("BMIが一番低い方は、%d番目の方です。\n", data[0].bmi);において、double型のデータを渡している先がint型のデータを要求する%dである
- bmiの計算を実数(浮動小数点数)ではなく整数の割り算で行っているため、小数点以下が切り捨てられる
- data[1]に(未初期化または範囲外?の)data[20]を不自然に代入している
- bmiに代入しているのが(実数の割り算だったとしても)ボディマス指数(体重[kg]/身長[m]^2)ではなく、身長[cm?]/体重[kg?]^2である
- 式はボディマス指数に近くなりましたが、仮に人間を想定したデータである場合、身長が100mを超えるのはおかしいです。
cmをmに変換するには、100.0で割るといいでしょう。
- 式はボディマス指数に近くなりましたが、仮に人間を想定したデータである場合、身長が100mを超えるのはおかしいです。
- (使われていない変数dtは定義されているのに)使われている変数dataが定義されていない
- iと同様に、main関数(内のdataを利用している場所)から利用できる場所で定義しなければいけません。
dtをdataに書き換えるだけでいいはずです。
- iと同様に、main関数(内のdataを利用している場所)から利用できる場所で定義しなければいけません。
- 「最大最小値を表示するプログラム」のはずなのに、「番目の方です。」という誤解を招く出力をしている
- 「番目の方」をそれぞれの項目に応じた適切な単位に書き換えるといいでしょう。
課題の出力例などでこの(素人目には不自然に見える)出力が指定されているのであれば、このままでもかまいません。
- struct Personに不正なメンバint data;が追加された
- iなどという不定の値を構造体内に入れようとすると、コンパイラが構造体の大きさを決定できず困ってしまいます。
消しましょう。ついでにメンバiも使用していないので消すといいでしょう。
- iなどという不定の値を構造体内に入れようとすると、コンパイラが構造体の大きさを決定できず困ってしまいます。
- 「番目の方」をそれぞれの項目に応じた適切な単位に書き換えるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 配列のデータを基にその中での最大最小値を表示するプログラム
返信ありがとうございます。指摘された箇所を訂正したところエラーなく動作しました。しかし、BMIの数値とN番目の実行結果の数値がおかしいのですが、どこが間違えているのでしょうか。
//実行結果
height=172
weight=43
age=21
BMI=0.000015
height=142
weight=53
age=17
BMI=0.000026
height=158
weight=57
age=47
BMI=0.000023
身長が一番高いのは、172番目の方です。
体重が一番軽いのは、43番目の方です。
年齢が一番若い方は、17番目の方です。
BMIが一番低い方は、0.000015番目の方です。
続行するには何かキーを押してください . . .
#include <stdio.h>
struct Person {
int height;
int weight;
int age;
double bmi;
};
int main(void)
{
struct Person data[3];
{
data[0].height = 172;
data[0].weight = 43;
data[0].age = 21;
data[0].bmi = (1.0)*data[0].weight / (data[0].height*data[0].height)/100.0;
data[1].height = 142;
data[1].weight = 53;
data[1].age = 17;
data[1].bmi = (1.0)*data[1].weight / (data[1].height*data[1].height)/100.0;
data[2].height = 158;
data[2].weight = 57;
data[2].age = 47;
data[2].bmi = (1.0)*data[2].weight / (data[2].height*data[2].height)/100.0;
int i;
for (i = 0; i < 3; ++i){
printf("height=%d\n", data[i].height);
printf("weight=%d\n", data[i].weight);
printf("age=%d\n", data[i].age);
printf("BMI=%f\n", data[i].bmi);
}
printf("身長が一番高いのは、%d番目の方です。\n", data[0].height);
printf("体重が一番軽いのは、%d番目の方です。\n", data[0].weight);
printf("年齢が一番若い方は、%d番目の方です。\n", data[1].age);
printf("BMIが一番低い方は、%f番目の方です。\n", data[0].bmi);
return 0;
}
}
height=172
weight=43
age=21
BMI=0.000015
height=142
weight=53
age=17
BMI=0.000026
height=158
weight=57
age=47
BMI=0.000023
身長が一番高いのは、172番目の方です。
体重が一番軽いのは、43番目の方です。
年齢が一番若い方は、17番目の方です。
BMIが一番低い方は、0.000015番目の方です。
続行するには何かキーを押してください . . .
Re: 配列のデータを基にその中での最大最小値を表示するプログラム
フォーラムルールには、えーす さんが書きました:解決しました。お付き合いいただきありがとうございました!
とあります。よろしくお願いいたします。解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。