第七回 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] を少し変更することで実現される。 アスタリスクを表示する部分は であるが、この部分を とすれば良いことがわかる。そのためには「第六回 if 文および if~else 文」で学んだ if~else 文を使えば良いことがわかる。

さらに、「領域中央であれば」という条件は と読み変えることができる。

このとき、「等しい」という条件は「=」ではなく「==」を用いる。これは「第五回 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++ を自習しように戻る