- ベストアンサー
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); } と作ってみたものの…;;; 正しいプログラムを教えていただけると嬉しいです。よろしくお願いします。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
一応プログラムを書いているので丸投げではないでしょう scanf("%lf",&a); while(a!=999){ } whileループの中でaは変化しないので無限ループになります。 scanf("%lf",&a); while(a!=999){ scanf("%lf",&a); } ループの最後にaへの入力を追加するといいでしょう。 scanf("%d",&n); は必要ありません。
その他の回答 (8)
- yaemon_2006
- ベストアンサー率22% (50/220)
訂正 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] ++; }
お礼
ありがとうございます! 参考にさせていただきます!
- yaemon_2006
- ベストアンサー率22% (50/220)
#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)
(「丸投げ」とは思わない年寄り) ★質問者様のソースの不具合 ・身長デ一タが順次入力されるコードとなっていない。 ・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 ); } 注:インデントに全角空白を用いています。 タブに一括変換して下さい。
お礼
ありがとうございました! 参考にさせていただきます!
- asuncion
- ベストアンサー率33% (2127/6289)
> 一組の{}につき、Tabなどを入れた方が読みやすいですよ。 もとのコードをTabなどでインデントしていても、 アップした内容にはインデントを反映してくれません。残念なことに。
- _himajin_
- ベストアンサー率65% (128/195)
宿題の丸投げはよくありません。 でも、ヒントだけなら、、、 scanfとwhileの意味と使い方を調べましょう。
- Yukky34
- ベストアンサー率10% (3/30)
「999」を入力しない限り無限ループが続くのは良いのでしょうか? また、scanf("%d",&n); は必要ですか?データ総数をカウントするのであれば、 カウンタが作ってあるのでそれだけで十分かと思います。 質問とは関係ありませんが、一組の{}につき、Tabなどを入れた方が読みやすいですよ。
お礼
ありがとうございます! 参考になりました。
- kusa_cw
- ベストアンサー率50% (4/8)
現象としては、「身長を入力してください」と表示された後、999を入力しないと無限ループに陥るんじゃないでしょうか? 入力する身長の値が整数なのか小数なのか、コードから推察が難しいのですが、最終的に変数nを入力データ数と扱っていますので、double型変数aに身長データを取り込みたいと仮定します。 scanf関数が2箇所で使用されていますが、変数aとnの更新頻度を考えてみてください。 また、取り込んだ身長データを区切りの値と比較していますが、身長データが整数なら今のままで構いませんが、小数であれば160.0、170.0、180.0のようなdouble型リテラルにすると良いかと思います。
お礼
ありがとうございます! 解決いたしました!
- DarkMoon
- ベストアンサー率21% (225/1046)
宿題の丸投げはよくありません。 でも、ヒントだけなら、、、 9行目の scanf("%d",&n); は何のための処理ですか?
お礼
ありがとうございます。 もっと勉強しないといけませんね。
お礼
ありがとうございます! 助かりました;;