for文に関するトラブル

[戻る]
2005/05/20(金) 17:39:32
1からある数aまでの和を、for文でプログラム表示する問題なんですが、
次のプログラムでaに10を代入すると
なぜか、「1から25まで足した値は1244772」と、表示されてしまいます。
本当は、「1から10まで足した値は55」と、表示されなければならないのに何度や
ってもそう表示されます。
このプログラムのどこがおかしいのか自分では何度見直してもわかりませんでした。
なので、おかしい箇所を教えて下さい。

#include<stdio.h>
 main(){
    int c=0;
    int b=1;
    int a;
    printf("正の整数を入力して下さい。");
    scanf("%d",&a);
    for(b=1;b<=a;b++){
    c=c+b;
    b=b+1;
    };
    printf("1から%dまで足した値は%d",c);
    }

まきじ 2005/05/20(金) 17:45:19
マルチポストでしょうか?

http://www.vcppclub.com/bbs1/wforum.cgi?no=2275&reno=no&oya=2275&mode=msgview&page=0

b のインクリメントが2回行われています。

Blue 2005/05/20(金) 17:46:25
>printf("1から%dまで足した値は%d",c);
がおかしいですね。2つの数値を指定しなければならないところを
1つしか指定していません。
ただしくは
printf("1から%dまで足した値は%d", a, c);
ですね。

しかし、
>    for(b=1;b<=a;b++){
>    c=c+b;
>    b=b+1;
>    };
bの値の増え方がおかしいですね。1回のループで2増えています。
(だからcの結果が25になっているわけで。)

2005/05/20(金) 23:02:58
BLUEさん、どうもありがとうございます。

しかしb=b+1は、b++と同じ意味ですよね?
こういう問題の場合、たいていb++というふうにするように習ったのですが。

また、printfの中にaも関係するのはどうしてでしょう?
そこもよくわからないです。

まきじ 2005/05/20(金) 23:25:14
>しかしb=b+1は、b++と同じ意味です

同じ意味です。 なぜ、2 回同じ事をするのでしょうか?

>printfの中にaも関係するのはどうしてでしょう?

ではなぜ「1から%dまで足した値は%d」と書いてあるのでしょうか?
1 個目の %d は何を表示したいのでしょうか?
a ではないのですか?
「1から%d」 と書いてあることから推測して、a だと思いますが。

Blue 2005/05/21(土) 01:04:27
>    for(b=1;b<=a;b++){
     printf( "b=%d\n", b ); /* 追加 */
>    c=c+b;
>    b=b+1;
>    };
として、bの値を確認してみてはどうでしょうか。
おそらく、
1
3
5
7
9
となるでしょう。

# おかしいとおもったら、デバッグをしましょう。
# printfで値を確認するのもデバッグの1つなのです。

for文の使いかた、およびprintf関数の使い方を再度学習することをすすめます。
参考サイト
http://www9.plala.or.jp/sgwr-t/c/sec06-2.html
http://www9.plala.or.jp/sgwr-t/c/sec06-2.html

Blue 2005/05/21(土) 01:06:46
間違えました。orz 
おなじURLを載せていました。

訂正しておきます。
第5章 標準入出力関数(1)
http://www9.plala.or.jp/sgwr-t/c/sec05.html
6−2.for文
http://www9.plala.or.jp/sgwr-t/c/sec06-2.html

2005/05/24(火) 07:26:32
みなさん、アドバイスどうもありがとうございます。
要するにここでは、
b=b+1;
という部分を省けばいいだけのことなのでしょうか?

Blue 2005/05/24(火) 08:40:29
>b=b+1;
>という部分を省けばいいだけのことなのでしょうか?
はfor文を学習したうえでの発言でしょうか?

とりあえず、訂正したものを載せておきます。
が、ここで怠けるとあとで痛い目にあうことを忘れないでください。

#include <stdio.h>

int main( void )
{
    int c = 0;
    int b = 1;
    int a;
    printf( "正の整数を入力してください。" );
    scanf( "%d", &a );
    for ( b = 1; b <= a; b++ )
    {
        c += b;
    }
    printf( "1から%dまで足した値は%d\n", a, c );
    return 0;
}

まきじ 2005/05/25(水) 00:06:25
もう、見てないかもしれませんが(^^;

>b=b+1;
>という部分を省けばいいだけのことなのでしょうか?

そうですが、「皆、言ってるから」ではなく、自分なりにでも、
「なぜ除けば良いのか」を理解してくださいね。

古いスレッドには追加発言できません。