目次に戻る


このエントリーをはてなブックマークに追加


繰り返し

あるコードを何度も繰り返し実行したいときに使う構文。
やり方はいろいろあるがここでは代表的なfor 文 と、while 文を紹介していきます。

(再帰というのもあるがそれはまた今度...)




for 文

for 文はもっともオーソドックスな命令(たぶん)。

構文はこんなかたち

for ( ①変数の初期化; ②ループ条件; ③変数の操作) {
         [命令]
}

...多分こんな風に書かれても分かりにくいので、実際に使ってみましょう。
以下のコードを実行してみましょう。

                        //for_1.cpp
                        #include<iostream>
                        using namespace std;

                        int main(){

                            for ( int i=0; i < 5; i++ ){
                                cout << i << endl;
                            }

                            return 0;
                        }
                    


実行結果は
0
1
2
3
4
となるはず。

さて解説していく。
まずfor文の命令を実行するときに最初に行われるのが①変数の初期化

for_1.cpp では「int i=0」となっており変数i に 0 を初期値としてセットする

そうしたらfor文の中身に入っていく。
「cout<< i << endl ;」で変数i の値が出力される。
このときは i=0 なので 0 が出力

for文の終端にたどり着いたら、for文の行に戻る

その時③変数の操作が行われる。
通常このfor_1.cppのようにインクリメントが用いられることが多い。

このあと評価されるのは②ループ条件でこの条件を満たしていれば再びfor文の中に入っていく。

今回はi++でi=1となっており、i(=1) < 5 を満たしているので再びfor文の中に。

cout<< i で 1 を出力

戻る。
インクリメント。i = 2 に。
i(=2) < 5 を満たしているので中に入る。

cout<< i で 2 を出力

戻る。
インクリメント。i = 3 に。
i(=3) < 5 を満たしているので中に入る。

cout<< i で 3 を出力

戻る。
インクリメント。i = 4 に。
i(=4) < 5 を満たしているので中に入る。

cout<< i で 4 を出力

戻る。
インクリメント。i = 5 に。
i(=5) < 5 は満たしていないのでfor文の外へ

...という感じ。

では実践してみましょう。答はこのページの最後で。


【演習】for文を用いてユーザーの自然数の入力に対して、その階乗を出力するプログラムを作成してみよう。【難易度★★☆☆☆】
(if文も駆使して例外処理も入れてみよう)
入出力例:
入力: 5
出力: 120

入力: 12
出力: 479001600

入力: 0
出力: 1

入力: -4
出力: 自然数を入力して下さい。
ヒント:変数の初期値は0ではないよね? 変数操作はデクリメントを使ってみよう。(ドラッグで可視化)

スポンサーリンク



while 文

繰り返しの命令でfor文と並んでよく使われるのはこのwhile
for文よりシンプルな文構造だが一歩間違うと無限ループにハマる

構文は、

while ( ループ条件 ) {
      [命令]
}


超シンプル。だけどfor文とは使い分けが割と明確。

ちなみにサンプルソースコードはこんな感じ

                    // while_1.cpp
                    #include<iostream>
                    using namespace std;

                    int main(){
                        int num = 1;
                        int sum = 0;

                        while ( num != 0 ) {
                            cout<<"数字を入力(0で加算終了) : ";
                            cin >>num;
                            sum += num;
                        }

                        cout<<"加算結果: " << sum << endl ;
                        return 0;
                    }

                
実行例:
数字を入力(0で加算終了): 12
数字を入力(0で加算終了): 31
数字を入力(0で加算終了): 5
数字を入力(0で加算終了): 0
加算結果:48

このようにwhile文では、while文の中でループを任意のタイミングで停止させる書き方がよく見られる。

またwhile文ではループ条件が先に評価される
つまり「ループ条件を満たしていなければ、while文の中に入ることはない」

ただこのループ条件の評価を最後にさせる書き方もある。
それがdo while文という形。
構文は

do{
    [命令]
} while ( ループ条件 );


構文を見ても条件評価が終端であることが解かり易い。


またwhile文に限らず条件式を 1 や true にすると常に条件を満たす形となる。
つまり、
while(1){
    [命令]
}


while(true){
    [命令]
}

とすると無限ループが起こる
やばいじゃん、つかわないようにしとこ。

…と思うかもしれないが、実はこのループから強制脱出する術がある。
それが break;

while(1){
    [命令]

    break;
}

とするだけで強制的にwhile文を抜けることができる。
さっきのwhile_1.cppを書き直すとすれば、

                    //while_2.cpp
                    #include<iostream>
                    using namespace std;

                    int main(){
                        int num = 1;
                        int sum = 0;

                        while ( 1 ) {
                            cout<<"数字を入力(0で加算終了) : ";
                            cin >>num;

                            sum += num;

                            if ( num == 0 )
                                break;
                        }

                        cout<<"加算結果: " << sum << endl ;
                        return 0;
                    }

                



演習問題の答え

解答例はこんな感じ。

                    // 2017.4.16  Copyright Hiroshi Araki All rights reserved.

                    #include<iostream>
                    using namespace std;

                    int main(){

                      int num;
                      int ans = 1; //階乗結果
                      // でコメントアウトできる (実行とかはされない)

                      /*
                       * 複数行のコメントアウトはこんな感じ。
                       */

                      cout << " 入力 : ";
                      cin >> num;

                      if( num < 0){
                        cout << " 自然数を入力して下さい。" << endl;

                      }else if (num == 1 || num == 0){
                        cout << " 出力 : 1" << endl;

                      }else{
                        for( int i = num; i > 0; i--)
                          ans *= i;

                        cout << " 出力 : " << ans << endl;

                      }

                      return 0;
                    }
                

ポイントは演算結果の ans は1で初期化しておくこと。
0で初期化したら乗算の意味なくなっちゃうからね。

また補足だが、for文やif文などでは実行命令が1行で済む場合{ ... }はいらない。

そして ans *= num というのは ans = ans*num と同義。
他にも、 += , -= , /= もある。


さて次回は、実践編!!  ①, 素数判定プログラムを作ってみよう!【ここまでの知識でできる】



スポンサーリンク






このエントリーをはてなブックマークに追加