マルチスレッド版数独自動生成ソフト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を超える最小のものを求めてください。