電子書籍の厳選無料作品が豊富!

/*指定された個数だけ整数を読み込んで合計値・平均値を算出*/

#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

A 回答 (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から」になる。どれにするかは「お好み」で。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/11 09:59

別な変数を定義して


int j=1;



for(i=0;i<num;i++)
{printf("No.%d:",j);
scanf("%d",&tmp);
sum = sum + tmp;
j=j+1;
}


の様にして、jを変化させ、整数のナンバーにしてもいいでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/11 10:01

まず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言語のカテゴリーがあるので、次回からはそちらで質問してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
for文のところから説明していただきとてもわかりやすかったです。

カテゴリーですが、[技術者向]とあって違うのかなと思ってました 汗
次回から気を付けます。

お礼日時:2009/09/11 10:05

コンピュータの気持ちになって動作をシミュレートしてください. 特に for の動作.


でもこれ, 明らかにカテゴリ違うよね.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
コンピューターの気持ちになってシュミレートしてみます。

カテゴリー次回から気を付けます。

お礼日時:2009/09/11 10:07

>前置と後置をまぜたあたりがよくないのかなと思うのですが。

。。
問題は概ねそのあたりです。
余分なところは省いて説明します。

問題となる部分は
----------
>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の内容を変更することなく表示します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/11 10:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!