• 締切済み

c言語 for文

/*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

みんなの回答

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.5

>for(i=0;i<num;i++) でiに1を足してる(i++してる)から >{printf("No.%d:",++i); でiに1を足して(++i)はいけない。 これでは「合わせて2を足してしまう」ことになる。 「No.??」を表示する上で「iが0から始まってるのが困る」のであれば for(i=0;i<num;i++) {printf("No.%d:",++i); の2行を for(i=0;i<num;) {printf("No.%d:",++i); にするか for(i=1;i<=num;i++) {printf("No.%d:",i); にするか for(i=0;i<num;i++) {printf("No.%d:",i+1); にすれば良い。 どのパターンでも「ループはnum回」「1回にiに足すのは1だけ」「表示するのは1から」になる。どれにするかは「お好み」で。

Nya-22
質問者

お礼

回答ありがとうございます。 いろいろなパターンをのせていただき参考になりました。 >for(i=0;i<num;) こう書いても動くのですね。よくみたら教科書にものってました。

  • sono0315
  • ベストアンサー率48% (85/177)
回答No.4

別な変数を定義して int j=1; … for(i=0;i<num;i++) {printf("No.%d:",j); scanf("%d",&tmp); sum = sum + tmp; j=j+1; } の様にして、jを変化させ、整数のナンバーにしてもいいでしょう。

Nya-22
質問者

お礼

回答ありがとうございます。 新しい変数を定義してもできるんですね。今は教科書に頼ることが 多いので、早く自分でいろいろ作れるようになりたいです。

  • proto
  • ベストアンサー率47% (366/775)
回答No.3

まずfor文の基本について確認します。   for( A ; B ; C )    {      ;    } for文はAの状態から始めて、Bが真の間だけ繰り返し、1回繰り返すごとにCの操作を実行します。 今回の場合で言うと、   for( i=0 ; i<num ; i++) なので、i=0から始めて、i<numの間だけ繰り返し、1回繰り返すごとにi++を実行します(つまり1回繰り返すごとにiを1増やします)。 さてforループの中に注目すると、ループの中でも > printf("No.%d:",++i); の部分で++iを実行していますね。 するとどうでしょうか、++iで1増えて、i++で1増えるのですから、結局ループが1回廻るごとにiは2ずつ増えることになりますね。 ですからprintfで表示したiの値が1,3,5,...となるのですよ。 > printf("No.%d:",++i); の部分を > printf("No.%d:",i+1); と変更してみてください。 これならば、iの値そのものの値を変更することなく、現在のiの値に1足したものを表示するというだけの意味になります。 最後に注意ですが。 『教えて!goo > [技術者向] コンピューター > プログラミング > C&C++』にC言語のカテゴリーがあるので、次回からはそちらで質問してみてください。

Nya-22
質問者

お礼

回答ありがとうございます。 for文のところから説明していただきとてもわかりやすかったです。 カテゴリーですが、[技術者向]とあって違うのかなと思ってました 汗 次回から気を付けます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

コンピュータの気持ちになって動作をシミュレートしてください. 特に for の動作. でもこれ, 明らかにカテゴリ違うよね.

Nya-22
質問者

お礼

回答ありがとうございます。 コンピューターの気持ちになってシュミレートしてみます。 カテゴリー次回から気を付けます。

回答No.1

>前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 問題は概ねそのあたりです。 余分なところは省いて説明します。 問題となる部分は ---------- >for(i=0;i<num;i++) iを0からnumより小さい間繰り返し、処理の最後でiを+1する。 >printf("No.%d:",++i); iを+1して、iの値を表示する。 ---------- です。 つまりfor()の{}でくくられた処理を実行してiが「0→(forの++iで)1」となる部分が、 printfにある処理の為「0→(printfのi++1で)1→(forの++iで)2」という処理になっています。 従って、以下のように記述するのが正解です。 誤:printf("No.%d:",++i);  ↓ 正:printf("No.%d:",(i+1)); これで、iの内容を変更することなく表示します。

Nya-22
質問者

お礼

回答ありがとうございます。 前置と後置とをぜないよう気を付けます。 i++,++iの違いもわかりました。また機会があればよろしくお願いします。

関連するQ&A

  • for文

    #include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

  • c言語で平均をだす

    #include<stdio.h> int main(void) { int num; int sum; printf("テストの点数を入力してください。\n"); do{ scanf("%d",&num); sum+=num; }while(num); printf("テストの合計点は%dです\n",sum); return 0; } テストの平均点をだすプログラムを作りたいのですが、合計を出すまではわかったのですが、ここから、平均を出すようにするにはどうすればよいですか。

  • while文の作成について

    キーボードに整数を打ち込み、0を打ち込むと終了し、その合計を出すプログラムを以下のように作りました。 #include<stadio.h> int main(void){ int num=0 int sum=0 printf("整数を入力"\n"); do{ scanf("%d",&num); sum +=num; }while(num); printf("合計は%dです。\n",sum); returen 0; } 次に負の値が入力されるまで整数を読み込み続け、その合計をを求めるプログラムを作りたいのですが、whileのところを }while(num>=0); としてみたのですが、うまくいきません。また分かり易くするため、入力した整数の個数も表示できるようにしたいです。どうすればよいでしょうか。詳しい方、教えてください。

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • C言語初心者です。次の問題で質問です。

    (問題) 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値表示するプログラムを作成せよ。 (自分の解答) #include <stdio.h> int main(void) { int num1,num2; int sum=0; do { printf("整数1>整数2となる整数をそれぞれ入力してください\n"); printf("整数1:"); scanf("%d",&num1); printf("整数2:"); scanf("%d",&num2); if (num1 < num2) printf("整数1>整数2としてください\n"); } while (num1 < num2); printf("%d以上%d以下の全整数の和は",num2,num1); for (num2;num2 <= num1;num2++) { sum=sum+num2; } printf("%dです。",sum); return 0; } これでも一応正しく実行されるのですが、ごちゃごちゃしてるので簡潔に書けないでしょうか? 回答お願いします。

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • 分散を求めるプログラム

    n人の点数を読み込みそれらの平均、分散を計算するプログラムを作りたいのですが分散の式がよく分かりません。 分散を求める式は第i番目の点数をxi、平均をμとすると 分散=1/nΣxi^2-μ^2 で、プラグラムを作ってみると #include<stdio.h> int main (void) { int i; int sum=0; int num,tmp; printf("何人ですか"); scanf("%d",&num); for(i=0; i<num; i++) { print("No. %d ", i+1) scanf("%d",&tmp); sum += tmp; } printf("平均:%.3f\n",(double)sum/num); printf("分散:%.3f\n",(double){(sum-sum/num)*(sum+sum/num)}/num); return(0); } というプログラムを作ってみたのですが分散の計算がうまくいきません。どなたか分散の計算のプログラムを教えて下さい。 C言語初めてまもないので不備があったらすみません。

  • C言語でfor文を用いたプログラミングについてです。

    C言語のプログラミングの課題で以下のような表をfor文を用いて作るというものが出ました。 商品名 単価(円)個数(円) 計  A  50   20   ***  B  90   30   ***  C  30   80   ***        合計金額   *** A,B,C及びそれぞれの単価、個数の値はキーボードからの入力で、***は演算によりその結果を出力するようにします。つまり、商品名(1文字)と単価、そしてその個数をキーボードから入力すると、単価と個数をかけた値と、それら全ての合計が出力されるようなプログラムを作るということです。 私は以下のようなプログラムを作りました #include<stdio.h> int main(void) { int a,b,c,sum,allsum,i; printf("商品名 単価 個数 計\n"); for(i=1;i<=3;i++) { a=getchar(); scanf("%d %d",&b,&c);  sum=b*c; allsum +=sum; putchar(a); printf(" %d %d %d \n",b,c,sum); } printf("合計金額 %d\n",allsum); return 0; } しかしこれでは合計金額がちゃんと表示されなかったりしてうまくいきません。おそらくfor文の中身に問題があると思うんですが…。どうか正しいプログラムと、なぜこのプログラムではうまくいかないのかを教えていただきたいです。なにぶん初心者なもんで、よろしくお願いします。

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

  • C言語のプログラミング (基礎)教えてください。

    以下のような問題があります。 プログラムを作ってみたのですが、 コンパイルすると無限ループになったり、 正しく結果が出ません。 どのように直せば良いか教えていただけると助かります。 よろしくお願いします。 整数が入力される度に今までの合計を出力するプログラムを作成しなさい。なお、0 が入力されたら終了するものとする。 ただし、繰り返しの命令は while 文を使用し、条件は常に真 ( 1 ) とし、break 文を使うこと。 ▼実行例 整数:1     合計:1 整数:2     合計:3 整数:3     合計:6 整数:0 ******************************** #include<stdio.h> int main(void) { int n,sum; sum=0; while(1){ printf("¥n整数:"); scanf ("%d", &n); sum=sum+n; printf("¥n    合計:%d", sum); scanf ("%d", &sum);          if(n==0){ break;   } } }