その2

Table of Contents

やること

  1. for 文を使う
  2. while 文を使う

解説

何かを繰り返し行うときにループ(繰り返し処理)は便利な手段です。 これを使えば,1 〜 100 の総和を求めるのに

1 + 2 + 3 + 4 + 5 + ....

のようにやらなくてすみます。

for 文を使う

for 文は以下のように書きます

for( 初期化; 継続条件; 次のループに入るときにする処理 )
    やることを書く

for 文で複数行にわたって,やることを書くときには

for( 初期化; 継続条件; 次のループに入るときにする処理 )
    {
        やること1
        やること2
    }

for( 初期化; 継続条件; 次のループに入るときにする処理 ){
        やること1
        やること2
    }

のように書きます。

初期化

ループを始めるときに行う処理を書きます。

例えば,カウンターとして使う変数を作ったり

int counter = 0

したりします。

継続条件

ループが終わった時に,継続条件が真であれば次のループに入ります。

比較演算子 >, < などを使った評価が のとき「条件が満たされた」といい, のとき「条件が満たされない」といいます (たぶん)。

例えば

2 < 3

という評価は真です。

代表的な比較演算子を以下に挙げます[1]

>
左辺が右辺の値より大きいか?
>=
左辺が右辺の値以上か?
<
左辺が右辺の値より小さいか?
<=
左辺が右辺の値以下か?
==
左辺が右辺と等しいか?
!=
左辺が右辺と等しくないか?

次のループに入るときにする処理

前のループと次のループの間で行う処理を書きます。 カウンター変数に 1 を足し入れる

counter++

をよくやります。

例えば,

for( int i=0; i<10; i++ )
    { なにか }

と書いた時,

(省略)

という処理が行われます。

具体例

数列

\( a_i = 2i + 1 \)

を i = 0 から 100 まで表示し,総和を求めるには

#include <iostream>
using namespace std;

int main()
{
int num = 0;

for( int i=0; i<101; i++ )
{
    int itemp = 2*i + 1 ;
    num = num + itemp;
    cout << i << " " << itemp << endl;
}

cout << num << endl;

return 0;
}

とやります。

while 文を使う

while 文は以下のように書きます。

while(継続条件)
    やることを書く

継続条件

継続条件が真の時,次のループに入ります。

サンプル

サンプルファイル を実行すると,以下が出力されるはずです:

mail:src genki$ ./a.out
0
1
2
3
4
5
6
7
8
9
Enermy's attack! You got 2 points.Your life is 9998 points
Enermy's attack! You got 4 points.Your life is 9994 points
Enermy's attack! You got 8 points.Your life is 9986 points
Enermy's attack! You got 16 points.Your life is 9970 points
Enermy's attack! You got 32 points.Your life is 9938 points
Enermy's attack! You got 64 points.Your life is 9874 points
Enermy's attack! You got 128 points.Your life is 9746 points
Enermy's attack! You got 256 points.Your life is 9490 points
Enermy's attack! You got 512 points.Your life is 8978 points
Enermy's attack! You got 1024 points.Your life is 7954 points
Enermy's attack! You got 2048 points.Your life is 5906 points
Enermy's attack! You got 4096 points.Your life is 1810 points
Enermy's attack! You got 8192 points.Your life is -6382 points
YOU ARE DEAD!

ファイル前半は for 文を使って 0〜9 までの数字を出力しています。 ファイル後半は while 文を使った RPG 風の出力で,体力 10000 が負になるまでループを繰り返しています。

課題

課題0

階乗の計算をしてみましょう。 1!〜20! を計算し表示するプログラムを作りましょう。 以下のような出力が得られるでしょう:

mail:answer genki$ ./a.out
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 1932053504
14! = 1278945280
15! = 2004310016
16! = 2004189184
17! = -288522240
18! = -898433024
19! = 109641728

答え

問題

上の例では 17! 以降がマイナスと表示されています[2]。 これは使用した int 型のサイズが関係しています。 どういうメカニズムでこのようになってしまったのでしょうか?

小話

課題1

以下のような九九の表をループを使って作成しましょう:

mail:cpp genki$ ./a.out
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

答え

課題2

課題1のプログラムを改良し,以下のようにきれいに表示しましょう:

mail:cpp genki$ g++ answer/cpp_test2_answer2.cc ; ./a.out
i\j|  1  2  3  4  5  6  7  8  9
 1 |  1  2  3  4  5  6  7  8  9
 2 |  2  4  6  8 10 12 14 16 18
 3 |  3  6  9 12 15 18 21 24 27
 4 |  4  8 12 16 20 24 28 32 36
 5 |  5 10 15 20 25 30 35 40 45
 6 |  6 12 18 24 30 36 42 48 54
 7 |  7 14 21 28 35 42 49 56 63
 8 |  8 16 24 32 40 48 56 64 72
 9 |  9 18 27 36 45 54 63 72 81

答え

課題3

お絵かきをしてみましょう。 以下のような出力を出すにはどうしたらいいでしょうか?

mail:answer genki$ g++ cpp_test2_answer3.cc ; ./a.out
++++++++++
+++++++++
++++++++
+++++++
++++++
+++++
++++
+++
++
+
++++++++++
+++++++++
++++++++
+++++++
++++++
+++++
++++
+++
++
+
++++++++++
+++++++++
++++++++
+++++++
++++++
+++++
++++
+++
++
+
++++++++++
+++++++++
++++++++
+++++++
++++++
+++++
++++
+++
++
+
++++++++++
+++++++++
++++++++
+++++++
++++++
+++++
++++
+++
++
+

ヒント

string aaa( 10 , '+' );

とすると,string 型変数 aaa には “++++++++++” が格納されます。

答え3


  1. int 型の場合は意味が明確ですが,double や char,string 型だと意味がよくわからなくなってしまうと思います。ちょっと調べてみましょう。  ↩

  2. 実行する環境に依存するので,16! でもマイナスになる環境も 17! でマイナスにならない環境もあります。  ↩