GeoCities home page

プログラミング A home page

1998年5月25日分

繰り返し

1から12までの合計を計算し表示するプログラムを作ってみましょう。ただし、n(n+1)/2 の公式は使わないこととします。

まず次のようにフォームを作ってください。

ボタンの表示は「計算」に、欄は空欄にしましょう。

ButtonCalc の OnClick に、次のようにプログラムを書いてください。(後の説明をわかりやすくするため、少々無駄な部分があります。)

void __fastcall TForm1::ButtonCalcClick(TObject *Sender)

{

int sum = 0;

sum = sum + 1;

sum = sum + 2;

sum = sum + 3;

sum = sum + 4;

sum = sum + 5;

sum = sum + 6;

sum = sum + 7;

sum = sum + 8;

sum = sum + 9;

sum = sum + 10;

sum = sum + 11;

sum = sum + 12;

EditSum->Text = sum;

}

なお、最初の行

int sum = 0;

は、

int sum;

sum = 0;

と書くことと同じです。また、

sum = sum + 4;

などは

sum += 4;

というように書くことができます。

実行してみましょう。78と表示されましたか?

では今度は1から365までの合計を計算し表示するプログラムはどう作ったいいか、考えてください。

sum = sum + 1;

sum = sum + 2;

sum = sum + 3;

↓ 続く

sum = sum + 365;

という方法が思い付くと思いますが、これは大変ですね。

C++ では、このような繰り返しは次のように書きます。

void __fastcall TForm1::ButtonCalcClick(TObject *Sender)

{

int sum = 0;

int i; // 繰り返しを数える変数

for (i = 1; i <= 365; i = i + 1) {

sum = sum + i;

}

EditSum->Text = sum;

}

実行してみてください。66795と表示されましたか?

コンピュータになったつもりで、このプログラムの動作を見てみましょう。

int sum = 0;

int i;

はわかりますね。そして、

for (i = 1; i <= 365; i = i + 1) {

にきたとき、コンピュータはまず i = 1 を実行します。(i = 1 を実行するのは最初の1回だけです。その後、for 文の実行中は i = 1 は実行されません。) 変数iには1が入っているので、i <= 365 は正しいですから、{}の中が実行されます。{}の1回目の実行が終わると i = i + 1 によってiは2となり、まだ i <= 365 は正しいですから、再び{}の中が実行されます。このように繰り返していき、365回目の実行(iには365が入っている)が終わると、i = i + 1 によってiは366となり、今度は i <= 365 は正しくなくなるので繰り返しは終わり、for文の次の命令に行きます。

なんだか難しそうですが、実際に使われるときは大抵

int i;

for (i = 1; i <= くり返し回数; i = i + 1) {

繰り返したい命令

}

という形で使われているので、慣れてしまえば大丈夫です。また、

for (int i = 1; i <= くり返し回数; i++) {

繰り返したい命令

}

と書いても同じです。下の書き方の方がよりすっきりしていますね。

課題:12+22+32+…+502 を計算するプログラムを書きなさい。

ヒント:222*2 と書くとよい。同様に、323*3、424*4 でよい。

課題:1+3+5+…+111 を計算するプログラムを書きなさい。

繰り返しには他にも while 文、dowhile 文などがありますが、for 文だけでもかなりの事ができます。while 文や dowhile 文は後の機会に学んでください。ここでは取り敢えず for 文が使えるようになることでよしとします。

絶対値関数 abs()

年齢差や身長差など、差を求めるプログラムを作ってみましょう。

まずは次の通りにフォームを作ってください。

入力欄はすべて空欄にし、ボタンの表示は「計算」にしてください。また、ButtonCalc の OnClick で次のプログラムを書いてください。(わかりやすくするため、このプログラムには無駄な部分があります。)

void __fastcall TForm1::ButtonCalcClick(TObject *Sender)

{

int a, b, diff;

a = EditA->Text.ToInt();

b = EditB->Text.ToInt();

diff = a - b;

EditMes->Text = diff;

}

書き終わったら実行してみましょう。上の2つの欄には2つの数、例えば171と163を入れます。そして「計算」ボタンを押すと「8」というように差が表示されます。

でも、ちょっとひねくれて左上の欄に163、右上の欄に171と入力すると「-8」と表示されます。しかし、普通は差は負でなく正で表現しますね。こういう場合でも差が正しく表示されるようにプログラムを変更しましょう。(実際に変更するのは下線部のみです。)

void __fastcall TForm1::ButtonCalcClick(TObject *Sender)

{

int a, b, diff;

a = EditA->Text.ToInt();

b = EditB->Text.ToInt();

diff = a - b;

if (diff < 0) { // もし負なら

diff = -diff;

}

EditMes->Text = diff;

}

これで正しく表示されるようになりました。

ところで、今付け加えたプログラムと同じ動作をしてくれるabs()というものがあります。プログラムを次のように書き換えてください。

void __fastcall TForm1::ButtonCalcClick(TObject *Sender)

{

int a, b, diff;

a = EditA->Text.ToInt();

b = EditB->Text.ToInt();

diff = a - b;

diff = abs(diff);

EditMes->Text = diff;

}

abs()という命令がdiffを受け取り、もし負の数なら正にして返してくれます。このように、何か値を与えると仕事をして値を返してくれるものを、関数と呼びます。f(x)というような数学の関数と同じようなものです。この関数という概念はCやC++を学習する際の最初の山場であり、重要な概念です。詳しくは次回説明します。