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

解決済みの質問

どなたか分かりますか?

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文を使わなければいけないんですが、どうすればいいですか?

投稿日時 - 2007-08-04 20:14:03

QNo.3227580

困ってます

質問者が選んだベストアンサー

おー!良かったです。
正解です。

>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;
}
頭でイメージしている変数の変化と同じ出力が得られましたか?
もし違ったら、また質問してみてください。

投稿日時 - 2007-08-09 00:39:49

補足

そのためにはb=0;と書いて最初に空にする必要があります。あくまで最初だけです。そうしないとint b;で箱bを用意しただけでは箱bの中にボールが何個入っているかが分からないからです。> これが、変数の初期化という作業ですか? 確かにb=0を省いたらエラーが出ました。 b=0で箱が空になるということは、0でなければ空でないんですね? 0でないときもあるんですか?

投稿日時 - 2007-08-09 05:34:13

ANo.21

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

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

回答(24)

ANo.24

zwi

>これそのものではないんですが、授業で実行結果とプログラムソースを提出するので、例えばこの問題だったら何の合計か分かってもらえますか?
私の表示までする必要は無いでしょう。
この問題だったら途中経過の表示はいらないので
printf("b=%d\n",b);
をループの後ろに出して合計だけ表示させる方が良いでしょうね。
そのとき表示も
printf("合計=%d\n",b);
と表示させた方がより分かりやすくて良い回答だと思います。

投稿日時 - 2007-08-09 22:10:37

補足

一歩前進できたと思います。長時間ありがとうございました。

投稿日時 - 2007-08-11 13:15:53

ANo.23

zwi

>b=0 と入力すれば、空になりますか?
入力された時点で空になります。
入力される前は直前に入れた数値あるいは未初期化なら不定です。

>本題の10までたすプログラムは
中略
>のように、printf("a=%d b=%d\n",a,b);がなくてもいいですか?
>ただ、表示の仕方が丁寧ではないので、つけた方がいいですか
不要だと思います。それは変数の変化を追跡するデバッグ用にほしいだけです。

私ならprintfでの表示を工夫して
1+2+3+・・・10=55
と表示させるでしょうね。
変数bをb=55と表示しても何の合計か分かるのはプログラムした人だけですが、上記のように表示すれば誰でもこのプログラムが1~10の合計を表示するためのプログラムだと分かりますから。
良かったら挑戦してみてください。

投稿日時 - 2007-08-09 21:20:57

補足

これそのものではないんですが、授業で実行結果とプログラムソースを提出するので、例えばこの問題だったら何の合計か分かってもらえますか?

投稿日時 - 2007-08-09 21:38:32

ANo.22

zwi

>これが、変数の初期化という作業ですか?
そうです。変数の初期化です。

>確かにb=0を省いたらエラーが出ました。
VC++2005だとワーニング(警告)がでます。
あくまで警告でサッカーのイエローカードですから、そのまま実行できるはずですので実行してみてください。
実行しても英語で初期化されてないよと警告が出ますが、無視ボタンをおせば最後まで実行されます。
すごい数値が表示されませんでしたか?

VC++2005は親切ですが、他のコンパイラ(gccなど)では警告も出ない物もあります。

>b=0で箱が空になるということは、0でなければ空でないんですね? 0でないときもあるんですか?
0じゃないのが普通で0であることを期待するのが間違いです。
関数中にint a;などと書いて確保される変数を自動変数と呼びますが、ゆうなれば自動変数は適当なダンボール箱を拾ってきて使いまわす行為です。ボールが入っているかもしれないし入ってないかも知れません。いつも同じ状態(数値)であることを期待するのが間違っています。

投稿日時 - 2007-08-09 11:23:27

補足

b=0 と入力すれば、空になりますか?
本題の10までたすプログラムは
#include <stdio.h>
int main(){
int a,b;
b=0;
for(a=1;a<=10;a++){
b=b+a;
printf("b=%d\n",b);
}
return 0;
}
のように、printf("a=%d b=%d\n",a,b);がなくてもいいですか?
ただ、表示の仕方が丁寧ではないので、つけた方がいいですか?

投稿日時 - 2007-08-09 19:41:29

ANo.20

zwi

>はa=5 b=11と表示されました。しかし、結局int a=1は何のためのものだったんですか? 1は実行結果に反映されていませんが。
はい、反映されません。
別の値に置き換え出来て、最初の値は後の処理に影響を与えない事を知ってもらうのが目的です。

(1)から(6)番の問題もプログラム実行前に頭で考えた値と同じになりましたか?もし考えたのと同じ結果でていれば、代入式の入門は卒業です。

確認できたら、元々の「1+2+3+・・・10を計算するプログラム」に戻りましょう。
今は、b=b+a+1;で合計を計算していますがプログラムとして良いプログラムじゃないので、b=b+a;で計算させた方が良いでしょう。
一度きれいに書き直してみてください。

投稿日時 - 2007-08-08 19:31:47

補足

#include <stdio.h>
int main(){
int a,b;
b=0;
for(a=1;a<=10;a++){
b=b+a;
printf("b=%d\n",b);
}
return 0;
}
でうまくいきました。b=0はb=b+a の右辺のbを常に0にするためにあるんですね? で、左辺のbが後に実行されるんですか? b+=a;と、b=b+a;は同じですか?

投稿日時 - 2007-08-08 23:33:23

ANo.19

zwi

>int a=1;
>a=3;
>はa=3があるので、最初に実行したa=1をなくすために、箱の(1)をとりだしているんですね? 取り出したあとはもう(1)のことは忘れて良いですね?
はい、(1)の事は忘れて良いです。
(2)のa=3;から後は箱a内容は3個になりますが、(3)でa=a+2;があるので箱aの中身のボール数は5個になります。(4)~(6)には箱aが左辺に出てこないので箱aは5個のままです。

>int c=3;
>c=c+a+3
>のほうは、c=3のあとに「c=数値」がないのでとり出さず、以後も3を使っているんですね? じゃなきゃ3+5+3にならないですよね?
はい、その通りです。
ただし、(6)で説明している通り3+5+3の合計11個が箱cに入りますので、(6)から後は箱cの中身はボールが11個になります。
最後の行にprintf("a=%d b=%d\n",a,b);を加えてみると
a=5 b=11
と表示されます。

もし理解できた様であれば、もう一度問題をやってみましょう。
問題も少し修正してみました。
1行にまとめて書いてありますが、(1)の問題だと
a=0;
b=a;
printf("a=%d b=%d\n",a,b);
と別の行に分けてあるのと同じだと思ってください。

(1)a=0;b=a;printf("a=%d b=%d\n",a,b);の表示されるaとbの値は?
(2)a=0;a++;printf("a=%d\n",a);の表示されるaの値は?
(3)a=0;a=a+2;printf("a=%d\n",a);の表示されるaの値は?
(4)a=0;b=a;a=b+1;printf("a=%d b=%d\n",a,b);の表示されるaとbの値は?
(5)a=1;b=2;b=a;printf("a=%d b=%d\n",a,b);の表示されるaとbの値は?
(6)a=1;b=2;b=1+a+b+b;printf("a=%d b=%d\n",a,b);の表示されるaとbの値は?

投稿日時 - 2007-08-08 16:45:54

補足

おかげさまで
#include<stdio.h>
int main(void)
{int a=1;
a=3;
a=a+2;
int c=3;
c=c+a+3;
printf("a=%d b=%d\n",a,c);
return 0;}
はa=5 b=11と表示されました。しかし、結局int a=1は何のためのものだったんですか? 1は実行結果に反映されていませんが。
(1)a=b=0 実行してみたらそうなりました(2)a=1(3)a=2(4)a=1b=0(5)a=b=1(6)a=1 b=6 

投稿日時 - 2007-08-08 18:50:35

ANo.18

NO12です。
>右辺のbと左辺のb結局違うものとして見るのですね?。じゃなかったら 例えばb=0+0+1は0=0+0+1と書けるはずです。
まぁ、そう見れば分かり易いのならそう見ても良いと思います。
自分が初めてプログラミングしたとき、本や教えてくれる人もいませんでしたので人のプログラムをいじってました。
b=b+a+1と言うような意味の式を書きたかったのですが素人だったので
c=b+a+1;
b=c;
と言う2行に分けて書きました。
で、そのうち自分でなんとなく納得できなくなり、cなんか使わなくても書けるんじゃないか?とやってみたらうまく動きました。

>b=b+a+1は数列の一般式のようなものですか?
すいません。良く分かりません。
ただ、式の意味はbにb+a+1を代入するという意味です。

>「for文で自動的に値が変化するのは()の中に書いたaと言う変数だけで、{}の中にしか書いていないbの値は計算式を書かない限り変化しません。」とは、結局bは常に0なんですか?
そうですね。bの値を変化させたければ
for(a = 0; a<=10; a++){
b=a;
}
等と書いてやらなければ駄目です。この例の場合「b=a;」と言う一文が無ければbはずーっと同じ値です。でも0とは限りません。for文の前にb=3;と言う式があればbの値はずーっと3です。

>a=a+1とb=b+a+1は同じようなものですか?
ニュアンス的には同じようなものです。

b=b+a+1があったとき、a=0ならb=b+1;で変数名が違うだけでa=a+1とまったく同じ動作をします。
b=b+a+1があったとき、a=1ならb=b+2;一度通るたびにbの値が2ずつ大きくなります。
b=b+a+1があったとき、a=2ならb=b+3;一度通るたびにbの値が3ずつ大きくなります。
つまりb=b+a+1;は一度通るたびにbの値がa+1ずつ大きくなります。

b=b*2;だと一度通るたびにbの値が2倍になります。

投稿日時 - 2007-08-08 15:03:05

ANo.17

zwi

>でも、先程の動作で箱の中の(1)を取り出し、箱の中を0にする操作をしていますよね? これとは違うんですか? int a=1の1の部分は色々な数値に変化しうるんですか? a=1で実行されるんですか?
えーと、int a=1;では箱aの名前は右辺に出てきませんよね。左辺に出てきます。前にも書いた通り右辺の箱の中身は変化しませんは、この場合は左辺ですので箱aの中身は変化します。
int a=1;
は2行に分解することができます。動作はまったく同じです。
int a;
a=1;
です。
int a;は箱をa用意しているだけです。
a=1;で箱aにボールを1個入れます。このとき左辺の箱aは一度空にされてから、ボールを1個入れてることになります。
このとき、
int a;
a=3;
としても全然問題ありません。箱aの中にボールが3個入った状態になります。

>ごめんなさい。関数電卓は持っていません。
分かりました。電卓のメモリー機能は使ったことが無いんですね。

投稿日時 - 2007-08-08 14:29:24

補足

int a=1;
a=3;
はa=3があるので、最初に実行したa=1をなくすために、箱の(1)をとりだしているんですね? 取り出したあとはもう(1)のことは忘れて良いですね?
int c=3;
c=c+a+3
のほうは、c=3のあとに「c=数値」がないのでとり出さず、以後も3を使っているんですね? じゃなきゃ3+5+3にならないですよね?

投稿日時 - 2007-08-08 15:33:22

ANo.16

zwi

>int a=1で、1が入っていた箱の1は取り出して、int c=3で、箱に入った3は取り出さず、次の計算に足し合わせるんですか?
まずルールとして、代入式の右辺に出てくる箱(変数)の中身を取り出すことはありません。中身を覗いて個数をチェックしてみて、同じ数のボールを別に用意するだけで箱の中に入っている個数(値)は変化しないのです。
箱の中身が変化するのは、代入式の左辺に出てきた箱だけです。右辺の計算が終わったら、左辺の箱を空箱にします。その上で右辺の計算結果の数のボールを左辺の箱に入れます。数学的に変だと思われるでしょうが、これがC言語のルールです。数学的なルールは無視してください。

>int a=1の後、箱を空にするのは、次の動作に影響がないということですか?
(2)のa=3;ことを言ってるのでしょうか?もう少し詳しく質問してもらうと答えられるのですが。

そういえば話は変わりますが、関数電卓は持ってますか?もし日ごろ使っているのであれば、メモリー機能は使いますか?
CASIOだとMinとかMRとかM+とか書かれたボタンの機能のことです。これが使いこなせているのであれば、これを使って説明したほうが良い気がしてきました。
日ごろ使っている普通の電卓でもメモリー機能が付いてる物がありますので、使っている電卓のメモリー機能は理解しているか?とメモリー機能に関係したボタンの種類を教えてください。

投稿日時 - 2007-08-08 10:49:28

補足

まずルールとして、代入式の右辺に出てくる箱(変数)の中身を取り出すことはありません>
でも、先程の動作で箱の中の(1)を取り出し、箱の中を0にする操作をしていますよね? これとは違うんですか? int a=1の1の部分は色々な数値に変化しうるんですか? a=1で実行されるんですか?
ごめんなさい。関数電卓は持っていません。

投稿日時 - 2007-08-08 12:02:18

ANo.15

zwi

了解しました。数学の思考から脱しきれないみたいですね。
分かってしまえば、目からうろこが落ちるように全てが理解できますから、もう少しがんばってみましょう!

じゃあ、基本に戻って変数とは何なのか考えて見ましょう。
話を単純化するために数値変数に限ってたとえ話で説明します。

(1)まず変数とは、数値を入れる箱です。段ボール箱みたいな箱をイメージしてくださいね。変数名は箱にaと書いてあるイメージで。
で、aと書かれた箱に数値1を入れます。数値はボールの数で表しましょう。箱の中身をボールを一個だけにします。
これが、int a=1;です。

(2)続けて、a=3;としましょう。aに3を入れる代入です。
代入は、今まで入っていたボールをすべて捨ててしまって空の状態の箱に値を入れる行為と理解してください。理屈じゃなくそういう動作をします。ボール3個を用意して空箱aの中に入れます。箱aの中身はボール3個になりました。

(3)じゃあ、続いてa=a+2;と書かれていたらと言うと、箱にボールが何個あるのかをまず確認します。さっき3個にしたのでボール3個ですね。
"a+2"という事で箱aの中身と同じ数の3個にもう2個加えて合計5個のボールを用意します。
あとは"a="の代入と言うことで箱aを空箱にして用意してあったに5個のボールを入れます。箱aの中身は5個になりました。

(4)変数cを表す箱cにボールを3個入れておきます。これが、int c=3;です。

(5)c=c+a+3;をたとえ話で書きます。ここが一番ややこしい話になります。
"c+a+3"は、箱cと箱aに入っているのとそれぞれ同じ数のボールを用意します。3個と5個ですね。全部加える計算ですから3+5+3個で合計11個のボールを用意します。で次が問題なので番号を分けます。

(6)代入の"c="が残っています。代入は元々入っている箱cの中身を破棄しますので空箱になります。そこに先ほど計算した11個をいれます。箱cの中身は11個のボールになりました。これがc=c+a+3;です。

以上をプログラムに書くと、
int a=1;
a=3;
a=a+2;
int c=3;
c=c+a+3;
となります。
今回は、ここまでとしておきます。これができたら次に進みましょう。
分からなくなったり疑問に思ったら各番号で質問してください。

投稿日時 - 2007-08-07 21:43:26

補足

int a=1で、1が入っていた箱の1は取り出して、int c=3で、箱に入った3は取り出さず、次の計算に足し合わせるんですか?
int a=1の後、箱を空にするのは、次の動作に影響がないということですか?

投稿日時 - 2007-08-08 09:41:20

ANo.14

★アドバイス
・変数とは何?
 ここからお勉強した方が良いでしょう。
 C言語の本を持っていますか?
 持っていないのなら明日、本屋で買った方が良いですけど。
・ちなみに変数とは一時的に『数』などのデータを覚えておく場所(箱)と
 イメージして下さい。
 『a=0;』は a という名前の箱に『0』というデータを代入します。
 『a++;』は a という名前の箱に『1』というデータを加算(加える)処理をします。
 よって『a=0;』の次に『a++;』となれば箱の中身は『0』から『1』へ増加します。
 for() 文中だけしか変数の値が変化しないわけではありません。
 『a++』、『a--』、『a=b+5;』とかすれば a という名前の箱の中身(データ)は
 変化します。ここを理解して下さい。
・以上。絶対に本を用意すべきです。多分持っていないような気がしますので。

参考URL:http://www.amazon.co.jp/dp/4797325631/,http://www.amazon.co.jp/dp/4797325615/

投稿日時 - 2007-08-07 20:35:45

ANo.13

zwi

zwiです。2つの質問に答えてもらっていないのが残念です。ほんとに間違いを解消しなくて大丈夫ですか?後で困りませんか?と問いかけておきます。たぶん、目の前のひとつのことしか考えられない状態なのだと思いますが。
さて、何度もみなさんが言ってますが代入式の"="は数学の"="とは意味がまったく違います。数学の"="は左辺と右辺が等しい事を表しますが、代入式の"="は右辺の計算結果を左辺に代入しますと言う意味でしかありません。C言語の代入式は"="と考えずに、b←b+a+1と書かれていると思ってください。頭の中の数学的な常識を一時的に棚上げする必要があります。

あとは、左辺と右辺に同じ変数が出てきたときの
>b=b+a+1
>右辺のbと左辺のb結局違うものとして見るのですね?
の回答ですが、C言語は時間的に右辺の処理を先に行います。aに0、bに0が入っていた場合は、0+0+1が先に計算されます。計算結果は1です。その後左辺の処理として計算結果1をbに代入しますので結果としてbに1が入ります。ここでbが1になりますが、右辺の処理が既に終了しているので計算結果に影響を与えることは起こりません。bは1のままです。

>「for文で自動的に値が変化するのは()の中に書いたaと言う変数だけで、{}の中にしか書いていないbの値は計算式を書かない限り変化しません。」とは、結局bは常に0なんですか?
の問いかけは、
>b=0;
>for(a = 0; a<=10; a++){
>printf("b=%d\n", b);
>}
というプログラムの事ならYESです。
>int a, b = 0;
>for(a = 0; a<10; a++){
>b = b + a + 1;
>printf ("b=%d\n", b);
>}
というプログラムの事ならNOです。

最後に何問か質問します。これの答えで理解度が分かると思います。
(1)a=0;b=a;と書かれていた場合のaとbの値は?
(2)a=0;a++;と書かれていた場合のaの値は?
(3)a=0;a=a+2;と書かれていた場合のaの値は?
(4)a=0;b=a;a=b+1;と書かれていた場合のaとbの値は?
(5)a=1;b=2;b=a;と書かれていた場合のaとbの値は?
(6)a=1;b=2;b=1+a+b+b;と書かれていた場合のaとbの値は?
逆にこの答えが全て分からないと代入式を理解したことにはなりません。

投稿日時 - 2007-08-07 07:13:01

補足

(1)aもbも常に0
(2)これはいずれもfor文の外ですか?aは常に0なのでaは1ずつ増やしようがありません。←間違っていると思いますが、(2)から(6)は同じようなので、こういう風にしか回答できません。こういう風に勘違いしているというのを示したくて書きました。ごめんなさい。
投稿していていただいた
>b=0;
>for(a = 0; a<=10; a++){
>printf("b=%d\n", b);
>}

>int a, b = 0;
>for(a = 0; a<10; a++){
>b = b + a + 1;
>printf ("b=%d\n", b);
>}
の類題ですか?

投稿日時 - 2007-08-07 18:57:41

ANo.12

No1です。
プログラムがどんな動きをしているかをもう一度考えてみてはどうでしょう?

例えば
for(a = 0; a<=10; a++){
b=a+1;
}
と書いたとします。これを分解して書くと
b=0+1;
b=1+1;
b=2+1;
b=3+1;
b=4+1;
b=5+1;
b=6+1;
b=7+1;
b=8+1;
b=9+1;
b=10+1;
と言うプログラムとまったく同じです。だからb=1…b=11と表示されました。

次に
b=0;
for(a = 0; a<10; a++){
b=b+a+1;
}
と書いたとします。これを分解して書くと
b=0;
b=b+0+1;
b=b+1+1;
b=b+2+1;
b=b+3+1;
b=b+4+1;
b=b+5+1;
b=b+6+1;
b=b+7+1;
b=b+8+1;
b=b+9+1;
と言うプログラムとまったく同じです。

念のためbに数字を入れて書くと
b=0+0+1;
b=1+1+1;
b=3+2+1;
b=6+3+1;
b=10+4+1;
b=15+5+1;
b=21+6+1;
b=28+7+1;
b=36+8+1;
b=45+9+1;
と言う計算をしている事になります。
これだと1~10までを足したプログラムとなりますので、期待通りの動きをすると思います。

for文の意味を考えて見ます。
for(a = 0; a<=10; a++){
}
と言う文が有ります。この文は
(まずaに0を代入しなさい。;a<=10の条件を満たしている間は{}の中を繰り返しなさい;一度ループするたびにa++の計算をしなさい)
と言う意味です。
さて、a++とは何でしょうか?
a++はa=a+1と言う計算式とまったく同じものです。
for(a = 0; a<=10; a=a+1){
と書いても同じです。
つまり、aを1ずつ増やしなさいと言う式なのです。

補足を読むとbも自動的に1ずつ増えそうな事を書いています。
b=0;
for(a = 0; a<=10; a++){
printf("b=%d\n", b);
}
と言うプログラムを書いて実行してみましょう。結果は
b=0
と言う表示が11個表示されると思います。
for文で自動的に値が変化するのは()の中に書いたaと言う変数だけで、{}の中にしか書いていないbの値は計算式を書かない限り変化しません。

さて、間違えて覚えていそうな部分を思いつく限り書いてみました。
まだ分からない事があれば補足してください。

投稿日時 - 2007-08-05 22:51:09

補足

aを1ずつ増やしていくことは分かります。 ただ、肝心のb=b+a+1がどうしても分かりません。
右辺のbと左辺のb結局違うものとして見るのですね?。じゃなかったら 例えばb=0+0+1は0=0+0+1と書けるはずです。 b=b+a+1は数列の一般式のようなものですか? 
「for文で自動的に値が変化するのは()の中に書いたaと言う変数だけで、{}の中にしか書いていないbの値は計算式を書かない限り変化しません。」とは、結局bは常に0なんですか?
a=a+1とb=b+a+1は同じようなものですか?

投稿日時 - 2007-08-06 20:37:06

ANo.11

zwi

あっごめんなさい。
書き間違いに気づきました。
>代入式で理解すべきことは左辺が先に実行されることです。b+a+1が計算されてその結果の値がbに代入されるのが代入式です。
これは右辺ですね。申し訳ないです。
edomin2004さんの書き込みで間違いに気づきました。
私の書いた文で左辺と書いてあるところは右辺と読み直してください。
混乱させていたら申し訳ないです。

投稿日時 - 2007-08-05 14:37:51

ANo.10

zwi

zwiです。
>bも結局0から1ずつ増やしているんですよね?
いえ、プログラムの何処にもそんなことは書いていないです。
プログラムで変数の値に影響を与えているのは次の3行だけです。
>int a, b = 0;
>for(a = 0; a<10; a++){
>b = b + a + 1; 
変数aは、for文中で0から始めて10まで1づつ増やすと書いてあります。
変数bは、初期値は0ですが代入式でb+a+1を代入しているのでa+1づつ増えるのであって、1づつ増えることはありませんし、プログラムのどこにも変数bに1づつ加算している部分はありません。なぜ、1づつ足していると思ったのでしょうか?
これもちゃんと答えてくださいね。どこをどう勘違いしているか分からないとアドバイスが出来ないから聞いている事ですから。

投稿日時 - 2007-08-05 14:32:16

ANo.9

#3です。
「bも結局0から1ずつ増やしているんですよね?」
違いますよ。

bを増やしているのではなく、計算結果をbに「代入」しているのです。(右辺の計算結果が次のbの値になる。)
なので、今回の場合は
「では、b=2になることはないんですか?」
b=2になることはありません。

どうやら、数学的な「=」と代入の「=」の区別が付いていないようですね。
b=b+a+1;
は、まず右辺が評価(計算)されてb+a+1が求められます。
その結果が bに「代入される」のです。なので、この場合の「=」は「b と b+a+1が等しい」という意味ではなく「b←b+a+1」(右辺の値が左辺の変数の値に入れ替わる。)というイメージです。

投稿日時 - 2007-08-05 14:20:40

ANo.8

zwi

>また、申し訳ない質問です。
>forループ1回目は、a=0でb=0なので>
>a=0 でどうしてb=0になるんですか? b=b+0+1 ですよね。これでb=0なのですか?
edomin2004さんの言われるとおりで、aもbもこの時点で0ですよと言う意味で書いています。aが0だからbが0になるのではなくて、この時点でaもbも0が入っています。

>実行結果の黒い画面に入力する数値はaのみですか?
これも最大の勘違いだと思うのですが、このプログラムでは実行時に入力すること出来ません。
入力を受け付けるためには、出力の関数としてprintfがあるように入力の関数scanfが必要です。
scanf("%d",&a);
と書いてあればコンソール(黒い画面)で変数aに数値を入力することが出来ます。これは今回関係ないので知識として覚えておいてください。

ともかく最も大きな問題は、このプログラムは1~10までの数列の和を求めるプログラムであると自分で説明しておきながら、なぜ入力が必要だと思ったのでしょうか?問題を理解していれば入力が必要だとは考えないはずですよ。
それとも代入式の左辺の変数は必ずコンソールで入力しなければいけないと誰かに教わりました?なぜ入力があると思ったか答えてもらえば、ちゃんとしたアドバイスができますので、なるべく細かく答えてください。

投稿日時 - 2007-08-05 14:11:55

ANo.7

#3です。

「a=0 でどうしてb=0になるんですか? b=b+0+1 ですよね。これでb=0なのですか?」
この文章は、
「forループ1回目は、a=0でb=0なので…」
からきていると思うのですが、解釈が違います。
「a=0だからb=0」なのではなくて「a=0、b=0」つまり、aもbも0だということを言っています。
なぜb=0なのかというと、変数宣言時
int a,b=0;
でbを0で初期化しているからですよ。
または、私の回答にある
b=0;
でbに0を代入しているからです。
#6さんの回答じゃないですが、もう少し「変数」と「代入」の意味を復習された方がいいみたいですね。

投稿日時 - 2007-08-05 13:20:32

補足

forループ2回目は、a=1でb=1なので1+1+1で計算結果は3ですね。これもbに代入されます。b=3になります。
forループ3回目は、a=2でb=3なので2+3+1で計算結果は6ですね。これもbに代入されます。b=6になります。
とは、2・3回目も「a=1だからb=1」「a=2だからb=3」という解釈ではないですか? では、b=2になることはないんですか?
bも結局0から1ずつ増やしているんですよね?

投稿日時 - 2007-08-05 14:06:11

ANo.6

zwi

前の質問に答えた事のあるzwiです。
前から思っていたのですが、未だに変数と代入式の事、プログラムが順次実行されることを理解できていないように見受けられます。
このままfor文やさらに高度なC言語の文法に進むことは混乱をさらに広げることになるので、今のうちに変数と代入式の事を十分に理解してはどうでしょうか?
これまでの回答を十分に理解しないうちに先に進もうとしているため、見当違いな質問や過去の質問等同様な質問を繰り返しています。

>int a, b = 0;
これは、変数bを宣言して初期値として0を与えているだけで実行順序の後の方でbに値を代入したらその値に変化します。書いてある順番を見て分かるとおりmainプログラムの最初に実行されています。

>b = b + a + 1; の左から2番目のbは何のためにあるんですか?
>2番目のbは常に0ですよね。
ここで大きく勘違いしています。bの変数は1つしか無いので、1番目も2番目も同じbです。これまでの質問でも同じ様な質問を繰り返してますから変数が理解できていない証拠です。
代入式で理解すべきことは左辺が先に実行されることです。b+a+1が計算されてその結果の値がbに代入されるのが代入式です。
forループ1回目は、a=0でb=0なので0+0+1で計算結果は1ですね。これがbに代入されます。b=1になります。
forループ2回目は、a=1でb=1なので1+1+1で計算結果は3ですね。これもbに代入されます。b=3になります。
forループ3回目は、a=2でb=3なので2+3+1で計算結果は6ですね。これもbに代入されます。b=6になります。
これをforループの最後まで繰りかえてしているのです。
1+2+3+・・・を計算できているのが分かりますか?

前の例題?を見直して疑問が無いことを確認して、十分理解できてから先に進めることをお勧めします。前の問題で疑問が解消できていなかったら、その問題に戻って質問してください。

投稿日時 - 2007-08-05 11:37:33

補足

また、申し訳ない質問です。
forループ1回目は、a=0でb=0なので>
a=0 でどうしてb=0になるんですか? b=b+0+1 ですよね。これでb=0なのですか?
実行結果の黒い画面に入力する数値はaのみですか? 

投稿日時 - 2007-08-05 12:42:06

ANo.5

かなり惜しいところまで行っていると思います。
後一歩だ!

○修正前
#include <stdio.h>
int
main ()
{
int a, b;
for (a = 0; a <= 10; a++) {
b = a + 1;
printf ("b=%d\n", b);
}
return 0;
}


○修正後
#include <stdio.h>
int
main ()
{
int a, b = 0;
for (a = 0; a < 10; a++) {
b = b + a + 1;
printf ("b=%d\n", b);
}
return 0;
}



どこを修正したかと言えば、

(1)
int a, b;

int a, b = 0;
bになぜ0を代入するかと言うと、bをただ宣言しただけでは
bの中身は不定値なので、なにが入っているか分かったもんじゃない。
ってことで0を代入して、bを0とする。
理由は(3)の中に出てきます。

(2)
for (a = 0; a <= 10; a++) {

for (a = 0; a < 10; a++) {
a + 1の数を順番に足しているのに a<=10 では a+1 が 10+1 となり、11まで
足してしまう事になるので、「<=」を「<」に変更した。修正後では最後のa
は 9 なので a+1 が 9+1 となり 10 で正しくなる。

(3)
b = a + 1;

b = b + a + 1;
上に出てくる(1)の変更がここに効いてくる。
一番初めにこの式が実行されるときにbに変な値が
入っていたらそれに対して + a + 1されることになってしまう・・。



説明のなかで分かりづらいところがあったら補足要求してください。
結構フィーリングで書いてますので、・・

投稿日時 - 2007-08-05 00:01:03

補足

b = b + a + 1; の左から2番目のbは何のためにあるんですか?
2番目のbは常に0ですよね。 で、値が変化するメインの部分がb=のb
ですよね。 もちろんb=a+1ではうまくいきませんでした。

投稿日時 - 2007-08-05 09:47:36

ANo.4

★変数の初期化って分かりますか?
>b=0; とは、代入式のことですか?
 ↑
 『b=0』は代入式といえばそうですが『b』という変数を宣言しただけでは『値』が
 デタラメになっています。そこで初期化として変数『b』に『0』を入れるのです。
・自動変数には必ず初期化してから使うのが常識となっていますので今後気をつけて下さい。
 ちなみに static キーワードを付けた変数はゼロで初期化されます。
 また外部変数(main関数外)に記述した変数もゼロで初期化されます。
 この2つは初期化しなくても使っても構いません。
 それ以外の自動変数(普通に宣言した変数)は初期化してから利用します。
 初期化の値はゼロだったり、100 だったりとプログラムによって異なります。
・今回は for() の中で『a』は 1 に初期化していますが『b』は初期化されていません。
 ゼロで初期化する必要があるので『b=0;』を記述するのです。
 またこの初期化は宣言と同時に記述できます。
 つまり、
 int main( void )
 {
  int a, b = 0; ←ここで宣言と同時に初期化できる
  
  for ( a = 1 ; a <= 10 ; a++ ){
   b += a;
   printf( "b=%d\n", b );
  }
  return 0;
 }
>bが何から始まるかを表現してるんですか?
 ↑
 そうですね。
 ゼロで初期化してゼロから始めないと上手く加算できないので『b=0;』を記述するわけです。
・以上。

投稿日時 - 2007-08-04 23:44:28

ANo.3

まずは、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;
}

それから、エラーが出たときはどういうエラーが出たかも補足してください。

投稿日時 - 2007-08-04 21:09:56

補足

b=0; とは、代入式のことですか? bが何から始まるかを表現してるんですか?

投稿日時 - 2007-08-04 21:33:04

ANo.2

1 から 10 まで足したいなら、そのまま変数 a が 1 から 10 を渉るように for ループをまわすだけ。

そして b に「加算」するには b += a と書く、と。

投稿日時 - 2007-08-04 20:38:14

補足

#include <stdio.h>

int main(){
int a, b;
for(a = 1; a<=10; a++){
b +=a;
printf("b=%d\n", b);
}
return 0;
}
とした結果、エラーが出てしまいました。

投稿日時 - 2007-08-04 21:03:14

ANo.1

>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を計算するプログラムにはならないと思います。

投稿日時 - 2007-08-04 20:18:13