• ベストアンサー

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% (2126/6288)
回答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

  • C言語プログラミングの問題がわかりません・・・。

    ただいまC言語を勉強している者です。 【入力するデータ数と各データ(整数)を入力していき,0 以下の整数の数,正の整数の数,0 以下の整数の合計,正の整数の合計を求めるプログラムを作成せよ。】 という問題があり、とりあえず #include "stdio.h" void main() { int i,j,k,l=0,m=0,goukeisei=0,goukeifu=0; printf("入力するデータ数:"); scanf("%d",&i); for(j=1;j<=i;j++); { printf("データを入力してください(整数):"); scanf("%d",&k); if(k>0){ l++; goukeisei+=k; }else{ m++; goukeifu+=k; } } printf("正の整数の数%d\n",l); printf("0以下の整数の数%d\n",m); printf("正の整数の合計%d\n",goukeisei); printf("0以下の整数の合計%d\n",goukeifu); } と作ってみたのですが、入力するデータ数の繰り返しがされません(1回入力して終わりになってしまいます);; for文の使い方が間違っているのでしょうか・・・ 詳しい方教えてくださいm( _ _ )m 尚環境はXPでVC++2008を使っています。よろしくお願いします。

  • C言語

    #include <stdio.h> int main(void) { int a=0,ans1,ans2,ans3,ans4; printf("整数を入力してください。\n"); scanf("%d",a); ans1 = a+7; ans2 = a*;8 ans3 = a%3; ans4 = a*(-1); printf("%d\n",ans1); printf("%d\n",ans2); printf("%d\n",ans3); if(a==15){ prntf("true\n",a); } else{ printf("false\n",a); } if(a != 8){ printf("true\n",a); } else{ printf("false\n",a); } if(a <= 3){ printf("true\n",a); } else{ printf("false\n",a); } printf("%d\n",ans4); if(a<2||7<a){ printf("true\n",a); } else{ printf("false\n",a); } return 0; } これを実行しようとしてもexeファイルになりません。 教えていただけませんか?

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • C言語でのじゃんけん

    こんちには。 C言語の乱数を用いてじゃんけんプログラムを作ろうと思っているのですが、 エラーメッセージが出てしまいうまくいきません。 どこがおかしいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i,j,k; printf("じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)¥n"); for(k=k; k<=10; k++) { srand(time(NULL)); j=rand()%3+1; scanf("%d",&i); if(i==1&&j==1) printf("私はグーなので、あいこです¥n"); else if(i==1&&j==2) printf("私はチョキなので、あなたの勝ちです¥n"); else if(i==1&&j==3) printf("私はパーなので、あなたの負けです¥n"); else if(i==2&&j==1) printf("私はグーなので、あなたの負けです¥n"); else if(i=2&&j==2) printf("私はチョキなので、あいこです¥n"); else if(i==2&&j==3) printf("私はパーなので、あなたの勝ちです¥n"); else if(i==3&&j==1) printf("私はグーなので、あなたの勝ちです¥n"); else if(i==3&&j==2) printf("私はチョキなので、あなたの負けです¥n"); else if(i==3&&j==3) printf("私はパーなので、あいこです¥n"); else printf("1か2か3を入力してください¥n"); } } OS mountain lionで利用中ですが、 「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」 と表示されたまま、うまく動作しません。 教えてください。

    • ベストアンサー
    • Mac
  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • C言語の問題を教えてください。初心者です。

    1000以下の整数を入力して、それ以下の素数を出力するプログラムをつくっています。 一応自分でやってみたのですが、どうもうまくできません。自分ではどこが間違っているのかさっぱりなので間違い箇所を指摘し、どうすれば良いのかを教えていただきたいです。ほかに効率的なやりかたがあったらあわせてお願いします。 初心者なので易しく説明していただけるとありがたいです。 <自分でやってみた> #include <stdio.h> int main(){ int i,j,N; int a[1000]; for (i=2; i<=1000; i++) { a[i]=1; } for (i=2; i<=1000; i++) { for (j=i++; j<=1000; j++) { if (a[j]=1 && j%i==0) { a[j]=0; } } } printf("2以上1000以下の整数を入力してください\n"); scanf("%d",&N); printf("%d以下の素数は\n",N); for (i=2; i<=N; i++) { if (a[i]=1) { printf("%d\n",i); } } } よろしくお願いしますm(_ _)m

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • C言語で困っています...

    入力した数値の列だけ○と×を縦に、段々になるように表示する (最後の行は×にならなければいけない)プログラムを作成しています。 (実行例) ○と×を表示します。何列?:10            ×           ○×          ×○×         ○×○×         ×○×○×       ○×○×○×      ×○×○×○×    ○×○×○×○× ×○×○×○×○× ○×○×○×○×○× 途中までプログラミングできたのですが、 偶数の数値を入れたときはきちんと最後の行は×になっても 奇数の数値を入力すると○が最後の行になってしまい、うまくいきません。 どこがだめなのでしょうか? どなたか教えてください。 /* 入力した数値の列だけ、○と×を縦に、   段々になるように表示する(最後の行は×になる) */ #include <stdio.h> int main(void) { int i, j, n; printf("○と×を表示します。何列?:"); scanf("%d", &n); for (i=0; i<n; i++){ for (j=0; j<n; j++){ if (j >= (n - 1) - i){ if (j % 2 == 0) printf("○"); else printf("×"); } else printf(" ");//全角スペース } printf("\n"); } return 0; }

  • c言語で

    c言語で /*a==bのとき商と余を求めるそれ以外は積を求める*/ # include<stdio.h> main () { int a,b,seki,sho,joyo; printf("aとbを入力してください\n"); scanf("%d %d", &a,&b); if(a==b) printf("sho=%d\n",(a/b)); printf("joyo=%d\n",(a%b)); else printf("seki=%d\n",(a*b)); return(0); } はどこがおかしいでしょうか? あと /*小数点*/ # include<stdio,h> main () { float a,b,seki,sho,joyo; printf("%f %f",&a,&b); if(a>b) printf("sho=%f4.3\n",(a/b)); printf("joyo=%f4.3\n",(a%b)); else printf("seki=%f4.3\n",(a*b)); return (0) にいたってはエラーの嵐なのですがどうすればいいでしょうか

専門家に質問してみよう