- ベストアンサー
どなたか分かりますか?
1+2+3+・・・10を計算するプログラムを作るんですが、 #include <stdio.h> int main(){ int a, b; for(a = 0; a<=10; a++){ b=a+1; printf("b=%d\n", b); } return 0; } だと、結果はb=1…b=11と出ます。for文を使わなければいけないんですが、どうすればいいですか?
- みんなの回答 (24)
- 専門家の回答
質問者が選んだベストアンサー
おー!良かったです。 正解です。 >b=0はb=b+a の右辺のbを常に0にするためにあるんですね? 右辺のbを常に0ですか?まだ代入で疑問があるみたいですね。 じゃあ、常にbが0だったらb=0+a;と同じですよね。 正解のプログラムを試しに書き換えてみてください。 望んだ答えが出ましたか?出ないはずです。 じゃあ、箱bは何のためにあるのでしょうか? 箱bに箱aのボールの数を加算していかないと正しい答えが出ないはずです。 そのためにはb=0;と書いて最初に空にする必要があります。あくまで最初だけですよ。 そうしないとint b;で箱bを用意しただけでは箱bの中にボールが何個入っているかが分からないからです。 本当にボールが何個入っているかは運次第で試してみると分かりますが、恐ろしい数値が入っていると思います。 int b; printf("b=%d\n",b); とやってみてください。 main関数だと実行するたびに同じ数値が出ると思いますが、main関数以外で同じことをすると本当に運次第の値になります。 その運次第の値にb=b+a;と実行してしまうと運次第の値にaを足しこんでいくことになるので、結果も望んでいた答えが出ません。 ためしに正解のプログラムからb=0;を除いて実行すると分かると思います。 >で、左辺のbが後に実行されるんですか? それは正解です。 右辺の計算後に左辺に代入されます。 >b+=a;と、b=b+a;は同じですか 同じです。どちらで書いても読みやすければ問題ありません。 最後にこれを実行してみてください。 #include <stdio.h> int main(){ int a,b; b=0; printf("b=%d\n",b); for(a=1;a<=10;a++){ printf("a=%d b=%d\n",a,b); b=b+a; printf("b=%d\n",b); } return 0; } 頭でイメージしている変数の変化と同じ出力が得られましたか? もし違ったら、また質問してみてください。
その他の回答 (23)
まずは、bを初期化しましょう。 #include <stdio.h> int main(){ int a,b; b=0; for(a=1;a<=10;a++){ b+=a; printf("b=%d\n",b); } return 0; } それから、エラーが出たときはどういうエラーが出たかも補足してください。
補足
b=0; とは、代入式のことですか? bが何から始まるかを表現してるんですか?
- koko_u_
- ベストアンサー率18% (459/2509)
1 から 10 まで足したいなら、そのまま変数 a が 1 から 10 を渉るように for ループをまわすだけ。 そして b に「加算」するには b += a と書く、と。
補足
#include <stdio.h> int main(){ int a, b; for(a = 1; a<=10; a++){ b +=a; printf("b=%d\n", b); } return 0; } とした結果、エラーが出てしまいました。
- taunamlz
- ベストアンサー率20% (175/843)
>for(a = 0; a<=10; a++){ を for(a = 1; a<=10; a++){ とするか for(a = 0; a<10; a++){ とすればいいと思います。 ただ、 >b=a+1; の部分を見る限り1+2+3+・・・10を計算するプログラムにはならないと思います。
補足
そのためにはb=0;と書いて最初に空にする必要があります。あくまで最初だけです。そうしないとint b;で箱bを用意しただけでは箱bの中にボールが何個入っているかが分からないからです。> これが、変数の初期化という作業ですか? 確かにb=0を省いたらエラーが出ました。 b=0で箱が空になるということは、0でなければ空でないんですね? 0でないときもあるんですか?