第五回-03 for 文と if 文を組み合わせる

本ページでは、for 文を if 文を組み合わせることを、演習形式で学ぶ。

このような使い方・考え方はプログラミングをする上で常套的な手段と言える。

[演習1] width という変数に正の整数値が格納されているとする。
コンソールに「*」(アスタリスク) を width 回出力し、改行するプログラムを作成せよ。


つまり、以下のようにコンソールに出力するプログラム作成せよ、ということ。
この場合、width=21 としてある。(21 個のアスタリスク)



この演習を実行するためには、「第一回-03 初めての C/C++ プログラミング(コンソールアプリケーション編)」を参考に
コンソールアプリケーションのプロジェクトを作成し、冒頭に

#include <iostream>

を記述してから main 関数内にプログラムを記述すれば良い。実際に動作を確認してみよう。

さて「アスタリスクを width 回出力する」とあるから、この部分に for 文が使える。
改行は最後に一回だけであるから、for 文の外に書けば良い。
つまり以下のようになるだろう。なお、ここでは width の値として事前に 21 を格納しておいた。

int width=21;

for( int i=0 ; i<width ; i++ ){
   std::cout << "*";
}
std::cout << "\n";


[演習2] width, height という変数にそれぞれ正の整数値が格納されているとする。
コンソール上の横方向 width 、縦方向に height の領域を「*」(アスタリスク) で埋め尽くすプログラムを作成せよ。


つまり、以下のようにコンソールに出力するプログラム作成せよ、ということ。 この例では width=21、height=11 としてある。



[演習1]の続きと考える。横方向に「*」を width 回表示して改行する 部分は既に[演習1]で作成してある。
よって、これを height 回繰り返せば答えとなる。

すなわち、以下の通り。太字の部分が変更点 (追加点) である。
先程の変数 i による for 文の外側に、別の変数 (ここでは j) の for 文を作って 入れ子構造にしてある。

int width=21;
int height=11;
for( int j=0 ; j<height ; j++ ){

   for( int i=0 ; i<width ; i++ ){    // この部分は演習 1 のまま
      std::cout << "*";               //
   }                                  //
   std::cout << "\n";                 //

}

ここで注意して欲しいのは、このプログラムの「for 文の中に for 文」の構造、
言い替えると「縦方向用の for 文の内側に横方向用の for 文」の構造は
これまでの画像処理プログラムの演習で何度も登場しているものである。

振り返ってみると、以下の通りであった。全く同じ構造をしていることがわかるだろうか?





[演習3] width, height という変数にそれぞれ正の整数値が格納されているとする。
コンソール上の横方向 width 、縦方向に height の領域を「*」(アスタリスク) で埋め尽くすが、
その領域の中央のみは「0」(数字のゼロ) を表示するプログラムを作成せよ。


つまり、以下のようにコンソールに出力するプログラム作成せよ、ということ。 この例では width=21、height=11 としてある。



さて、想像がつくようにこれは上の [演習2] を少し変更することで実現される。 アスタリスクを表示する部分は であるが、この部分を とすれば良いことがわかる。そのためには第五回-02 if 文および if~else 文で学んだ if~else 文を使えば良いことがわかる。

さらに、「領域中央であれば」という条件は と読み変えることができ、 これは第五回-02 if 文および if~else 文 # 条件の書き方 の内容を利用すれば良い。

まとめると

int width=21;
int height=11;
for( int j=0 ; j<height ; j++ ){
   for( int i=0 ; i<width ; i++ ){
      if( i==width/2 && j==height/ 2){  // ここが変更点
         std::cout << "0";                //
      }else{                               //
         std::cout << "*";                //
      }                                     //
   }
   std::cout << "\n";
}





←第五回-02 if 文および if~else 文第五回課題→

非情報系学生のための C/C++ 入門に戻る