マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第12章 while文
第2話 第1話コードの謎の解明

#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

size_t 合計();//合計が100未満で最大になる1 + 2 + ・・・ + ? の和

int main() {//私は社長だ。

        cout << "合計が100未満で最大になる1 + 2 + ・・・ + ? の和 = ";

        cout << 合計() << endl;

        while (!_kbhit());//待機させるための命令

        return 0;//int main() を終わるためのお呪い

}

size_t 合計() {

        size_t S = 0;

        size_t i = 1;

        while (S + i < 100) {

                S += i;

                i++;

        }

        return(S);

}



実行結果


合計が100未満で最大になる1 + 2 + ・・・ + ? の和 = 91



では謎のコードをトレースしましょう。トレースは最初は数字を小さくして行います。

合計が10未満で最大になる1 + 2 + ・・・ + ? の和の計算にしてトレースを行います。

              cout << "合計が10未満で最大になる1 + 2 + ・・・ + ? の和";
              ・
              ・

int 合計() {

              size_t S = 0;

              size_t i = 1;

              while (S + i <10) {

                            S += i;

                            i++;

              }

              return(S);

}

S = 0かつi = 1のとき、

              while (S + i <10) {

                            S += 1;

                            i++;

              }

これでS = 1 かつ i = 2 となりますから、

S + i < 10ですからwhile文は続きます。

              while (S + i < 10) {

                            S += 2;

                            i++;

              }

これで S = 3 かつ i = 3 となりますから、

S + i <10ですからwhile文は続きます。


              while (S + i < 10) {

                            S += 3;

                            i++;

              }

これで S = 6 かつ i = 4 となりますから、

S + i <10ですからwhile文は続きます。


              while (S + i <10) {

                            S += 4;

                            i++;

              }


これで S = 10 かつ i = 5 となりますから、


S + i < 10 を満たしませんので、

                          S += i;

                          i++;

の部分は実行されずにwhile文は終了されて、

S = 6が


              return(S);


return文が返され、


合計が10未満で最大になる1 + 2 + ・・・ + ? の和 = 6


となります。

実際に

1 + 2 + 3 = 6

1 + 2 + 3 + 4 = 10

ですから、合計が10未満で最大になる1 + 2 + ・・・ + ? の和 = 6 は正しいことがわかります。

次は

              cout << "合計が20未満で最大になる1 + 2 + ・・・ + ? の和";
              ・
              ・

合計が20未満で最大になる1 + 2 + ・・・ + ? の和

int 合計() {

              size_t S = 0;

              size_t i = 1;

              while (S + i <20) {

                            S += i;

                            i++;

              }

              return(S);

}

S = 0かつi = 1のとき、

              while (S + i < 20) {

                            S += 1;

                            i++;

              }

これでS = 1かつi = 2となりますから、S + i = 3となり

S + i < 20ですからwhile文は続きます。

              while (S + i < 20) {

                            S += 2;

                            i++;

              }

これでS = 3かつi = 3となりますから、S + i = 6となり

S + i < 20ですからwhile文は続きます。


              while (S + i < 20) {

                            S += 3;

                            i++;

              }

これでS = 6かつi = 4となりますから、S + i = 10となり

S + i < 20ですからwhile文は続きます。


              while (S + i < 20) {

                            S += 3;

                            i++;

              }

これでS = 10かつi = 5となりますから、S + i = 15となり

S + i < 20ですからwhile文は続きます。


              while (S + i < 20) {

                            S += 5;

                            i++;

              }

これでS =15かつi = 6となりますから、S + i = 21となり


S + i < 20満たさずにwhile文は終了となり、

S =15がreturn文によって返され、


合計が20未満で最大になる1 + 2 + ・・・ + ? の和 = 15


となります。


実際に

1 + 2 + 3 + 4 + 5 = 15

1 + 2 + 3 + 4 + 5 + 6 = 21

ですから正しいことがわかります。

では、第3話課題を出します。

1 + 2 + ・・・ + ? の和で100を超える最小のものを求めてください。

第12章第1話へ 第12章3話へ

本講義トップへ