こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2009-09-10 12:14:06

QNo.5277985

暇なときに回答ください

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.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から」になる。どれにするかは「お好み」で。

投稿日時 - 2009-09-10 17:25:10

お礼

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

投稿日時 - 2009-09-11 09:59:51

ANo.4

別な変数を定義して
int j=1;



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


の様にして、jを変化させ、整数のナンバーにしてもいいでしょう。

投稿日時 - 2009-09-10 12:40:15

お礼

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

投稿日時 - 2009-09-11 10:01:38

ANo.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言語のカテゴリーがあるので、次回からはそちらで質問してみてください。

投稿日時 - 2009-09-10 12:38:44

お礼

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

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

投稿日時 - 2009-09-11 10:05:36

ANo.2

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

投稿日時 - 2009-09-10 12:37:00

お礼

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

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

投稿日時 - 2009-09-11 10:07:39

ANo.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の内容を変更することなく表示します。

投稿日時 - 2009-09-10 12:33:02

お礼

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

投稿日時 - 2009-09-11 10:13:12