配列のデータを基にその中での最大最小値を表示するプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
えーす

配列のデータを基にその中での最大最小値を表示するプログラム

#1

投稿記事 by えーす » 8年前

#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;

}

自分なりに作ってみたのですがエラーが出て出力されません。どこがダメなのか教えていただけないでしょうか。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列のデータを基にその中での最大最小値を表示するプログラム

#2

投稿記事 by みけCAT » 8年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
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: 配列のデータを基にその中での最大最小値を表示するプログラム

#3

投稿記事 by えーす » 8年前

丁寧な回答感謝いたします。ご指摘いただいた部分をいくつか訂正してみたのですが、まだエラーが出ます。いくつかご指摘をいただいた部分で理解のできないところは訂正できていません。今一度ご指導お願いいたします。

コード:

#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;
	}

}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列のデータを基にその中での最大最小値を表示するプログラム

#4

投稿記事 by みけCAT » 8年前

●修正された項目
  • 使われている変数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で割るといいでしょう。
●修正されていない項目
  • (使われていない変数dtは定義されているのに)使われている変数dataが定義されていない
    • iと同様に、main関数(内のdataを利用している場所)から利用できる場所で定義しなければいけません。
      dtをdataに書き換えるだけでいいはずです。
  • 「最大最小値を表示するプログラム」のはずなのに、「番目の方です。」という誤解を招く出力をしている
    • 「番目の方」をそれぞれの項目に応じた適切な単位に書き換えるといいでしょう。
      課題の出力例などでこの(素人目には不自然に見える)出力が指定されているのであれば、このままでもかまいません。
    ●追加された間違い
    • struct Personに不正なメンバint data;が追加された
      • iなどという不定の値を構造体内に入れようとすると、コンパイラが構造体の大きさを決定できず困ってしまいます。
        消しましょう。ついでにメンバiも使用していないので消すといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

えーす

Re: 配列のデータを基にその中での最大最小値を表示するプログラム

#5

投稿記事 by えーす » 8年前

返信ありがとうございます。指摘された箇所を訂正したところエラーなく動作しました。しかし、BMIの数値とN番目の実行結果の数値がおかしいのですが、どこが間違えているのでしょうか。

コード:

#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: 配列のデータを基にその中での最大最小値を表示するプログラム

#6

投稿記事 by えーす » 8年前

解決しました。お付き合いいただきありがとうございました!

かずま

Re: 配列のデータを基にその中での最大最小値を表示するプログラム

#7

投稿記事 by かずま » 8年前

えーす さんが書きました:解決しました。お付き合いいただきありがとうございました!
フォーラムルールには、
解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。
とあります。よろしくお願いいたします。

返信

“C言語何でも質問掲示板” へ戻る