第七回 for 文と if 文を組み合わせる
本ページでは、for 文と if 文を組み合わせることを学ぶ。
それにより、for文で処理を何度も繰り返す間、if文の判定によりある特定の回に処理を変えることができる。
このような使い方・考え方はプログラミングにおいて常套手段と言える。
以下では、答えつきの演習という形式で解説を行う。
[演習1] length という変数に正の整数値が格納されているとする。
コンソールに「*」(アスタリスク) を length 回出力し、改行するプログラムを作成せよ。
length (レングス) とは、英語で「長さ」を意味する。
この演習は、以下のようにコンソールに出力するプログラム作成せよ、ということ。
この場合、length=9 の場合の例を示している。(9 個のアスタリスク)
さて「アスタリスクを length 回出力する」とあるから、この部分に for 文が使える。
改行は最後に一回だけであるから、for 文の外に書けば良い。
つまり以下のようになるだろう。なお、ここでは length の値として事前に 9 を格納しておいた。
int length = 9;
for(int i=0 ; i<length ; i++)
{
cout << "*";
}
cout << "\n";
このプログラムを paiza.IO に貼り付けると以下のようになる。インデントの揃え方も参考にしよう。
実行してみると、演習の解答になっていることがわかる。
[演習2] length という変数に正の整数値が格納されているとする。
コンソール上の横方向と縦方向の長さ length の領域を「*」(アスタリスク) で埋め尽くすプログラムを作成せよ。
つまり、以下のようにコンソールに出力するプログラム作成せよ、ということ。
この例でも length=9 としてある。
[演習1]の続きと考える。横方向に「*」を length 回表示して改行する 部分は既に[演習1]で作成してある。
よって、これを縦方向に length 回繰り返せば答えとなる。
すなわち、以下の通り。太字の部分が変更点 (追加点) である。
先程の変数 i による for 文の外側に、別の変数 (ここでは j) の for 文を作って
入れ子構造にしてある。
int length = 9;
for(int j=0 ; j<length ; j++)
{
for( int i=0 ; i<length ; i++ )
{
cout << "*";
}
cout << "\n";
}
このプログラムを paiza.IO に貼り付けると以下のようになる。インデントの揃え方も参考にしよう。
実行してみると、演習の解答になっていることがわかる。
このプログラムの「for 文の中に for 文」の構造、
言い替えると「縦方向用の for 文の内側に横方向用の for 文」の構造は
画像処理プログラムでよく使われるものである。
[演習3] length という変数に正の整数値が格納されているとする。
コンソール上の横方向と縦方向の長さ length の領域を「*」(アスタリスク) で埋め尽くすが、
その領域の中央のみは「0」(数字のゼロ) を表示するプログラムを作成せよ。
つまり、以下のようにコンソールに出力するプログラム作成せよ、ということ。
この例でも length=9 としてある。
さて、想像がつくようにこれは上の [演習2] を少し変更することで実現される。
アスタリスクを表示する部分は
であるが、この部分を
- 領域中央であれば「cout << "0";」
- そうでなければ「cout << "*";」
とすれば良いことがわかる。そのためには「第六回 if 文および if~else 文」で学んだ if~else 文を使えば良いことがわかる。
さらに、「領域中央であれば」という条件は
- 「i (横座標に相当する変数) が length/2 に等しい」かつ「j (縦座標に相当する変数) が length/2 に等しい」
と読み変えることができる。
このとき、「等しい」という条件は「=」ではなく「==」を用いる。これは「第五回 for 文による繰り返し # 条件の書き方」で紹介したことである。
すなわち、「i が length/2 に等しい」は「i==length/2」と書けるということである。
さらに、ここで必要な「論理演算子」と呼ばれるものを2つ紹介する。
&&
|
かつ。if( 条件1 && 条件2 )と書くことで「条件1と条件2が同時に満たされれば」という意味になる
|
||
|
または。if( 条件1 || 条件2 )と書くことで「条件1と条件2のどちらかが満たされれば」という意味になる
|
以上をまとめると、「かつ」に相当する「&&」を使ってプログラムは以下のように書ける。
int length = 9;
for(int j=0 ; j<length ; j++)
{
for(int i=0 ; i<length ; i++)
{
if(i==length/2 && j==length/2)
{
cout << "0";
}
else
{
cout << "*";
}
}
cout << "\n";
}
このプログラムを paiza.IO に貼り付けると以下のようになる。インデントの揃え方も参考にしよう。
実行してみると、演習の解答になっていることがわかる。
課題→
オンラインコンパイラで C/C++ を自習しように戻る