第3講 繰り返し処理for文
第1話 for文とは?
1+2+3+4+5+6+7+8+9+10
を計算させるには、
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
int main() {
int a; //整数を入れる箱aを用意
//以下計算
a = 0;
a = a + 1;
a = a + 2;
a = a + 3;
a = a + 4;
a = a + 5;
a = a + 6;
a = a + 7;
a = a + 8;
a = a + 9;
a = a + 10;
//以上計算
cout<<"1+2+3+4+5+6+7+8+9+10="<<a<<endl; //箱aの中身を表示
return(0); //mainを閉じるためのお呪い。
}
実行結果
1+2+3+4+5+6+7+8+9+10=55
で良いわけですが、余りに芸のないプログラミングですね。
a = a + 1;
a = a + 2;
a = a + 3;
a = a + 4;
a = a + 5;
a = a + 6;
a = a + 7;
a = a + 8;
a = a + 9;
a = a + 10;
は10行にわたって同じようなことを繰り返します。
同様なことを繰り返して処理することを繰り返し処理といいます。
その繰り返し処理の一つにfor文があります。
for文を使ってこの芸のないコードを書き直すと、
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
int main() {
int a,i; //整数を入れる箱a,iを用意
a = 0;
//繰り返し処理
for(i=1;i<=10;i++){
a=a+i;
}
cout<<"1+2+3+4+5+6+7+8+9+10="<<a<<endl; //箱aの中身を表示
return(0); //mainを閉じるためのお呪い。
}
となります。
i++はi=i+1の簡略表現です。
for(i=1;i<=10;i++)の中は3文で構成されていますが、
iを1からはじめてひとつずつ増やしながらiが10になるまで{}内を繰り返しなさいという命令になります。
1つ目のi=1;が1から始めを意味し、
3つ目のi++がひとつずつ増やしていくことを意味して、
2つ目のがi<=10;が10までを意味しているからです。
この処理が優れているのは、
for(i=1;i<=10;i++)をfor(i=1;i<=10000;i++)と変更するだけで、
1から10000までの和を求めるプログラムに変更できることです。
#include<iostream> //c++プログラミングをはじめるためのお呪い。
using namespace std; //c++プログラミングをはじめるためのお呪い。
int main() {
int a,i; //整数を入れる箱aと箱iを用意
a = 0;
//繰り返し処理
for(i=1;i<=10000;i++){
a=a+i;
}
cout<<"1から10000までの和="<<a<<endl; //箱aの中身を表示
return(0); //mainを閉じるためのお呪い。
}
実行結果
1から10000までの和=50005000
どうです。急に面白くなったのではないでしょうか。
ちょっと変えただけで
1+2+3+・・・+9999+10000
が計算できるようになったのです。しかも、一瞬です。
for文の基本的な形は、
for(i=0;i<10;i++){
A;
B;
・・・・
・・・・
}
ですが、{}内の命令文が1つしかない場合には、
for(i=0;i<10;i++)A;
と書くことも出来ます。
尚、C言語では冒頭で変数の宣言をしなければなりませんが、
C++の場合は好きな場所で宣言して、
さらに、変数の有効な範囲を{}に限定することも出来ます。
例えば、
#include<iostream> //c++プログラミングをはじめるためのお呪い。
using namespace std; //c++プログラミングをはじめるためのお呪い。
int main() {
int a; //整数を入れる箱aを用意 箱iを削除
a = 0;
//繰り返し処理
for(int i=1;i<=10000;i++){
a=a+i;
}
cout<<"1から10000までの和="<<a<<endl; //箱aの中身を表示
return(0); //mainを閉じるためのお呪い。
}
とすると、変数iの有効な範囲は
図の}内に限定されます。
変数を箱と比喩していますが、
正確には一定のメモリを変数用に割り当て、
そのメモリにデータを書き込んでいます。
変数の適応範囲=スコープを{}内に限定できるのは、
メモリが節約できるという大きなメリットがあります。
尚、for(i=1;i<=10000;i++)のiを制御変数といいます。
これは1万回同じ処理を繰り返しますが、
for(i=0;i<10000;i++)としても同じ1万回処理します。
iは
0,1,2,・・・,9999
の値を取りますが、0もカウントしなければなりませんので、
1万種類の値を取りますよね。
i++はi=i+1の簡略表現であると説明しました。
C言語にはこのような簡略表現がたくさん用意されています。
i--;
a+=5;
w*=3;
x/=6;
のそれぞれは、
i=i-1;
a=a+5;
w=w*3;
x=x/6;
の簡略表現です。
w*3はw×3です。
×はキーボードにないので*で代用します。
また、x/6はx÷6を意味します。
÷もキーボードにないので、/で代用するのです。
*と/の代用は、私が知っているすべてのプログラム言語で共通です。
私が知っているのは、C言語・C++・Java・Visual Basic・パスカル・Ruby・Parl等です。
ではこれを頭に留めて、
次の問題に取り組んでください。
@ 2+3+4+・・・+99
A 3+5+7+・・・+101