• ベストアンサー

入力した数値を倍々するプログラム

 整数を1つ読み込み、それを倍々しながら10回書き出すプログラムを作成しています例えば、実行結果に3と入力すると、3、6、12、24、48、96、192・・・と書き出すものです。  for文かwhile文を使うことを指定されているんですが、どちらを使ったら良いでしょうか? for(A;B;C)のCの部分には、実行する式が入るんですよね? ただ、入れてはいけないものはありますか? 今まで、a++、a--しか見たことがないので、実行する式を入れてもエラーがでてしまいます。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.14

★プログラムの基本は上から下へ順に処理。 >3と入力した場合、a*=2が後に来ると、最初に3が表示されるのは、どうしてですか?  ↑  『a *= 2;』よりも表示命令の『printf( "%d ", a );』が先に処理されるからです。  別の質問で誰かが上から下へ処理されるとアドバイスしていませんでしたか?  ここがポイントですよ。 ・C 言語のプログラムは基本的に上から下へ流れるように処理されます。  でも if、else、switch文で処理の分岐を行うとジャンプして飛んだ先から処理され、  for、while、do-while文の繰り返しでは、処理される場所が繰り返しの最初の場所に  戻って処理されたりします。  この処理の流れが重要です。 ・今回の場合は  (1)『a *= 2』→『printf( "%d ", a );』の順   scanf( "%d", &a );   while ( n-- > 0 ){    a *= 2;    printf( "%d ", a );   }    (2)『printf( "%d ", a );』→『a *= 2』の順   scanf( "%d", &a );   while ( n-- > 0 ){    printf( "%d ", a );    a *= 2;   }   ・上記の2つは上から下への順に処理される事から表示結果に微妙な違いが出ます。  (1)…最初 a=3 ですので a *= 2 の処理を行うと a=6 となります。     この後に printf 文で a 変数の内容を表示するため実行結果が     6、12、24、48、96…と表示されるのです。  (2)…最初 a=3 ですが先に printf 文で a 変数の内容を表示します。     その後に a *= 2 の処理を行うため実行結果が     3、6、12、24、48、96…と表示されるのです。  つまり   先に表示してから掛け算すると 3 から始まり、   先に掛け算してから表示すると 6 から始まる  事になります。これは処理順が上から下の方向で処理されるからなのです。  よって   『a *= 2』   と   『printf( "%d ", a );』   の行を入れ替えると処理順が変るから表示も変るのです。 >a*=2とは関係がないんですか?  ↑  関係があります。大有りです。  もし『a *= 2』の記述をしなければ、ずっと a=3 のまま 10 回表示されます。  『a *= 2』の記述があるために行を入れ替えると表示→掛け算や、掛け算→表示の  違いから実行結果も微妙に異なってくるのです。 ・何度に言いますが『プログラムは上から下への順に処理』されます。  ここをきっちりと覚えて下さい。 紹介: ・今後の為に用意した方がいい本を紹介します。  (1)http://www.amazon.co.jp/dp/4797325631/→『新C言語入門 スーパービギナー編』  (2)http://www.amazon.co.jp/dp/4797325615/→『新C言語入門 ビギナー編』  (3)http://www.amazon.co.jp/dp/4797325623/→『新・C言語入門 シニア編』  この本のうち(1)を先に読んでみた方がいいです。 ・(1)は普通のC言語の本(教科書も含む)を読んでもイマイチ理解できない初心者の中の  初心者さん用に書き下ろされたという位置づけの本です。  この本には『プログラムとは』、『変数って何?』などの基本の基本が書かれています。 余談: ・昔、私が学生だった頃に C 言語の授業がありました。  でも 9 割近くが実習で意味のない授業でした。  お陰で C 言語は大嫌いになった。→懐かしい。 ・その後、数年の月日が流れ会社でプログラムを組むことになりました。  それも C 言語を使ってです。  ほとんど理解できていなかった C 言語でプログラムをするか!と不安。  でも運が良いのか会社に上記の本のシリーズ(2)がありました。 ・つまり、むかし私は上記の本のシリーズに出会った訳。  この本のお陰でわずか2ヵ月で難しいとイメージしていたポインタとか構造体の使い方などが  理解できました。そこで本屋でこのシリーズを買いそろえました。  買ったのはビギナー編、シニア編、応用編です。昔はスーパービギナー編はありませんでした。  ついでに私が買った本は今では古すぎで売っていません。→もう 10 年以上前なので。  でもほぼ同じ内容で新しく改訂した本として上記の本が買えます。  さらにスーパービギナー編が加わってね。→去年その存在を知って本屋でペラペラと見た。 ・もう C 言語を知っているのでスーパービギナー編は買いませんが、むかしこの本があったら  買っただろうなと思いました。今思うと懐かしい C 言語嫌いの学生時代。 ・以上。余談と一緒に『スーパービギナー編』の本をお勧めします。

参考URL:
http://www.amazon.co.jp/dp/4797325631/
jlnh
質問者

お礼

分かりました。とりあえず締め切らせてもらいます。

すると、全ての回答が全文表示されます。

その他の回答 (13)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.3

サンプルコードです。 #include <stdio.h> int main(void) {   int a, n = 10;      printf("aを入力 > ");   scanf("%d", &a);   while (n--) {     printf("%d ", a);     a *= 2;   }   return 0; } (注)インデントのため、全角空白を使っています。

jlnh
質問者

お礼

参考になりました。ありがとうございます。

jlnh
質問者

補足

このコードで実行した結果、エラーがでてしまいます。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

> どちらを使ったら良いでしょうか? どちらでも、お好きな方をお使いください。 ちなみに、 for (A; B; C) {   // 何かの処理 } A; while (B) {   // 何かの処理   C; } 上記の for / while の内容は、「何かの処理」に continue; を含んでいない場合、等価です。 > 実行する式を入れてもエラーがでてしまいます。 どんな式を書いたとき、どんなエラーが出ますか?

jlnh
質問者

補足

 実行結果に3と入力すると、3、6、12、24、48、96、192・・・と書き出すものを作るので、scanfが必要になってきますよね。その実行結果に入力する値はfor文の後の処理(式)に当てはまるんですか? a++を10回実行するのは分かります。 ききたいのは、forの後の処理の式です。  

すると、全ての回答が全文表示されます。
回答No.1

10回繰り返すんだったら for (i = 0; i < 10; i++) ですね。あとは分かりますね。

すると、全ての回答が全文表示されます。

関連するQ&A