• ベストアンサー

C言語の問題について教えていただきたいのですが

【身長デ一タを順次入力していき、160(cm)未満,160(cm)以上,170(cm)未満、170(cm)以上,180(cm)未満、180(cm)以上のデータがそれぞれいくつあったかを出力する(同時に全入力デ一タ数も出力する)プログラムを作成せよ。但し,データとして999 が入力された時点でプログラムの実行が終了するものとする.なお,999 というデータは,全入力データ数に入れないものとする.】 という問題が解けません・・・。わかる方いらっしゃいましたら教えてください。 一応私なりに #include <stdio.h> void main() { int n=0,i=0,j=0,k=0,l=0; double a; printf("身長を入力してください\n"); scanf("%lf",&a); while(a!=999){ scanf("%d",&n); n++; if(a<160){ i++; }else if(a>=160 && a<170){ j++; }else if(a>=170 && a<180){ k++; }else{ l++; } } printf("入力データ数 %d\n",n-1); printf("160cm未満 %d\n",i); printf("160cm以上170cm未満 %d\n",j); printf("170cm以上180cm未満 %d\n",k); printf("180cm以上 %d\n",l); } と作ってみたものの…;;; 正しいプログラムを教えていただけると嬉しいです。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.6

一応プログラムを書いているので丸投げではないでしょう scanf("%lf",&a); while(a!=999){ } whileループの中でaは変化しないので無限ループになります。 scanf("%lf",&a); while(a!=999){ scanf("%lf",&a); } ループの最後にaへの入力を追加するといいでしょう。 scanf("%d",&n); は必要ありません。

drakabu
質問者

お礼

ありがとうございます! 助かりました;;

その他の回答 (8)

回答No.9

訂正 for(scanf("%lf", &h); h != 999; scanf("%lf", &h)){ ih = (int)h / 10; if(ih < 16) hist[0] ++; else if(ih < 18) hist[ih - 15] ++; else hist[3] ++; }

drakabu
質問者

お礼

ありがとうございます! 参考にさせていただきます!

回答No.8

#include<stdio.h> int main(void) { double h; int hist[4] = {0}, s = 0, ih, i; for(scanf("%lf", &h); h != 999; scanf("%lf", &h)){ ih = (int)h / 10; if(ih < 18) hist[ih - 15] ++; else hist[3] ++; } for(i = 0; i < 4; i ++) s += hist[i]; printf(" 160未満: %d\n", hist[i = 0]); while(++ i < 3){ printf(" %d 以上 %d 未満: ", 160 + 10 * (i - 1), 160 + 10 * i); printf("%d\n", hist[i]); } printf(" 180以上 : %d\n", hist[i]); printf(" 合計: %d\n", s); return 0; }

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.7

(「丸投げ」とは思わない年寄り) ★質問者様のソースの不具合  ・身長デ一タが順次入力されるコードとなっていない。  ・while() 文の前に入力された、ひとつの身長デ一タを   無限に、「判定」している。 ★年寄りの改良点  ・階級境界が cm の整数であることから、身長デ一タは整数で。     例) 160.3 は 160-170 の階級の中、160 と整数入力。  ・else はキライなので使わない。 ---------------------------------------------------- #include <stdio.h> void main() {  int iHigh, iNinzu = 0;  int i160under = 0, i160_170 = 0, i170_180 = 0, i180above = 0;  while( 1 ){   printf( "身長を入力してください(999:終了)\n" );   scanf( "%d", &iHigh );   if( 999 == iHigh ) break;   iNinzu++;   if( iHigh < 160 ) i160under++;   if( ( 160 <= iHigh ) && ( 170 > iHigh ) ) i160_170++;   if( ( 170 <= iHigh ) && ( 180 > iHigh ) ) i170_180++;   if( 180 < iHigh ) i180above++;  }  printf( "入力データ数 %d\n", iNinzu );  printf( "160cm未満 %d\n", i160under );  printf( "160cm以上170cm未満 %d\n", i160_170 );  printf( "170cm以上180cm未満 %d\n", i170_180 );  printf( "180cm以上 %d\n", i180above ); } 注:インデントに全角空白を用いています。   タブに一括変換して下さい。

drakabu
質問者

お礼

ありがとうございました! 参考にさせていただきます!

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

> 一組の{}につき、Tabなどを入れた方が読みやすいですよ。 もとのコードをTabなどでインデントしていても、 アップした内容にはインデントを反映してくれません。残念なことに。

  • _himajin_
  • ベストアンサー率65% (128/195)
回答No.4

宿題の丸投げはよくありません。 でも、ヒントだけなら、、、 scanfとwhileの意味と使い方を調べましょう。

  • Yukky34
  • ベストアンサー率10% (3/30)
回答No.3

「999」を入力しない限り無限ループが続くのは良いのでしょうか? また、scanf("%d",&n); は必要ですか?データ総数をカウントするのであれば、 カウンタが作ってあるのでそれだけで十分かと思います。 質問とは関係ありませんが、一組の{}につき、Tabなどを入れた方が読みやすいですよ。

drakabu
質問者

お礼

ありがとうございます! 参考になりました。

  • kusa_cw
  • ベストアンサー率50% (4/8)
回答No.2

現象としては、「身長を入力してください」と表示された後、999を入力しないと無限ループに陥るんじゃないでしょうか? 入力する身長の値が整数なのか小数なのか、コードから推察が難しいのですが、最終的に変数nを入力データ数と扱っていますので、double型変数aに身長データを取り込みたいと仮定します。 scanf関数が2箇所で使用されていますが、変数aとnの更新頻度を考えてみてください。 また、取り込んだ身長データを区切りの値と比較していますが、身長データが整数なら今のままで構いませんが、小数であれば160.0、170.0、180.0のようなdouble型リテラルにすると良いかと思います。

drakabu
質問者

お礼

ありがとうございます! 解決いたしました!

  • DarkMoon
  • ベストアンサー率21% (225/1046)
回答No.1

宿題の丸投げはよくありません。 でも、ヒントだけなら、、、 9行目の scanf("%d",&n); は何のための処理ですか?

drakabu
質問者

お礼

ありがとうございます。 もっと勉強しないといけませんね。

関連するQ&A