C言語について学んでいる者です。 自分でプログラムを作成する際によく苦戦するのが、文章の順番です。

ベストアンサー

2

2人がナイス!しています

ThanksImg質問者からのお礼コメント

どの方の解答も納得する部分があり、ベストアンサーは本当に迷いました 皆さん回答ありがとうございました。今回は、niceが多い順で選ぶことにしました。

お礼日時:4/15 2:53

その他の回答(6件)

1

「while→scanf→sum=sum+inp...としてしまいます。」・・・・入力された値を加算するというのはごく普通の考え方ですよね。私もそう考えます。 ただ、while()文の条件の書き方によっては条件に合わない入力があってもsum=sum+inpが実行され得るので注意する必要があるということです。 たまたま、while()文の条件がwhile→sum=sum...→scanfの実行順序でないとまずい書き方になっていたとか? tre*******さんの回答のとおりだと思う。 教科書としてはどうかな?というプログラム例ではある。 n2q・・・・さんの回答例のほうがより初心者には考えやすくていい気がする。その後tre****さんの例を説明するのが親切。特にscanf() == 1についてネ。 教科書ではそこまでできないか?

1人がナイス!しています

1

>よく苦戦するのが、文章の順番 出題者のお気持ちを察するゲームですので、彼は何を正解にしそうか、彼の思考を読んで、お好み&お望みのものを作ってあげる必要があります なので、プログラミングの練習とはなんら関係ない、目上の人間(彼)のお気持ちをお察しするための、文学的な思考方法が必要です

1人がナイス!しています

1

文章の順番ということからしますと、それは人によって違っていて当然です。ですので、そこは別に考えた方が良いかもしれません。必ずしも模範解答と同じでなくても構わないのですよ。それよりも、ご自身でお書きになったプログラムの動作がどうなっているのか、正しい答えを導いているのか、そうでない場合はどこに間違いがあるのか、というところを見るのが大切だと思います。 まず、何かを繰り返すのですから、 for (;;) { } このように考えることができます。for 文は while 文、do...while 文と異なり、条件などは一切書かずにまず for (;;) と書くことが出来ますので好都合です。 そして、「scanfを行い読み取った数字を足していく」とのことですので、 int sum = 0; for (;;) { int value; if (scanf("%d", &value) == 1) sum += value; else break; } こんな感じです。 sum を用意し 0 にする。繰り返しの中では、scanf を呼び出して value を得る。それが上手く行ったら sum に足し込む。上手く行かなかったら繰り返しは終わり。 なお、sum += value; は sum = sum + value; と同じです。 さて、while 文で書き表すことが要件となっている場合は、 int sum = 0, value; while (scanf("%d", &value) == 1) sum += value; こうすれば良いです。 【while→scanf→sum=sum+inp...としてしまいます】 自然な考え方だと思います。scanfで条件判断を行うわけですので、これで良いです。 int sum = 0, inp; while (scanf("%d", &inp) == 1) sum = sum + inp; ただし、while の条件がこれと異なる内容となっている場合は要注意です。どういう条件で繰り返しを続けるのかの条件判断が正しくないと全体として上手く動作しません。 【回答ではwhile→sum=sum...→scanfでした】 それが正解ということだとしますと少々不自然です。入力の前に条件判断が出来る筈も無いからです。 while (1) という風にしてしまっているか(これは for (;;) とするのと意味としては同じになります)、あるいは予め特定の値を設定しておいた変数をフラグ的に使っているのか、なにかそういった特殊処理が行われているのではないかと。 tre********さんのお答えに具体例が示されています。そして、「直感的に分かりにくい」、「改造時に容易にバグを埋め込む事になりそう」、「教材としてもどうなのかな」とお書きです。 私も全く同感です。

1人がナイス!しています

1

#include<stdio.h> int main(void) { int sum,n; sum=0; n=0; while(n>=0){ sum+=n; printf("==>"); scanf("%d",&n); } printf("sum=%d\n",sum); return 0; } このプログラムは0以上の数字を入れている限り、足しこんでいます。 while()条件でnの値を確認する必要があるので、sum=>scanfになります。 while()の条件次第では逆になることもある。 なお、sum+=n;が初めて実行される場合は無駄な計算をしていることにはなるが、仕方ない。 g

1人がナイス!しています

プログラムというものは目的を果たす為に作るものであり、プログラムを作る為の仕様が説明されているとして、説明されている順でのプログラムでは目的を果たせないなら、順番を変えるだけ、、、、 単純なことです。難しく考えない。

1

どんな例題でどんなコードだったのか分かりませんが、入力した数字を足すわけですから加算の前に入力処理が入るのは普通だと思いますが。 単に変数の初期化をしてないとか、whileの実行条件が分かってないだけでは? コードの順番は依存関係があるならちゃんとそれを考慮して書かないといけないですし、Cの場合変数は基本初期化しないとだめです。(状況によっては暗黙の初期化も走りますが)

1人がナイス!しています