見出し画像

高校数学をプログラミングで解く(準備編)「1-4 条件分岐、繰り返し処理」

マガジンリスト > 準備編 1.プログラム基礎 > 1-4 条件分岐、繰り返し処理


はじめに

今回は、「高校数学をプログラミングで解く」を始めるための準備として、プログラミング言語「Processing」でプログラムを書く際に必要となる知識の条件分岐、繰り返し処理について説明していきます。

プログラムの基本的な構造

プログラムのアルゴリズムには、
・上から順に実行する構造(順次構造)
・条件によって実行する命令を変える構造(選択構造)
・処理を繰り返す構造(繰り返し構造)
の3つの基本的な構造があります。
複雑な処理を行うプログラムであっても、これらの3つを組合せることで作ることができます。

今回は、この3つの構造のうち、選択構造を実現するための「条件分岐」と繰り返し構造を実現するための「繰り返し処理」について解説していきます。

条件分岐

プログラムで条件分岐は「if文」を使います。英語の「if」(もし~ならば)と同じです。

if文の書き方

if文には大きく3種類の書き方ができます。

1つ目(ifのみ)

if( 条件式 ){
  処理;
}

これは、「条件式を満たしていれば( { と } の間の)処理を実行し、条件式を満たしていなければ何もしない」という構造になります。

2つ目(if-else)

if( 条件式 ){
  処理1;
} else {
  処理2;
}

これは、「条件式を満たしていれば処理1を実行し、条件式を満たしていなければ処理2を実行する」という構造になります。

3つ目(if-else if-else)

if( 条件式1 ){
  処理1;
} else if( 条件式2 ){
  処理2;
} else {
  処理3;
}

これは、「条件式1を満たしていれば処理1を実行し、条件式1を満たしていなければ条件式2を満たしているか確認し、条件式2を満たしていれば処理2を実行し、条件式2を満たしていなければ処理3を実行する」という構造になります。なお、「else if」の部分は1回だけではなく、複数回条件分岐させることができます。

条件式

条件式は、以下の比較演算子を利用して作ります。
・より大きい >   → a>b「aはbより大きいかどうか」
・より小さい <   → a<b「aはbより小さいかどうか」
・以上    >=   → a>=b「aはb以上かどうか」
・以下    <=   → a<=b「aはb以下かどうか」
・等しい   ==   → a==b「aはbと等しいかどうか」
・等しくない !=    → a!=b「aはbと等しくないかどうか」

上記の比較演算子を利用した条件式を組み合わせた条件式を作ることもできます。その際は、「&&」(かつ)や「||」(または)を使います。
例えば、$${0 < x < 1}$$は、2つの条件式「x > 0」と「x < 1」の両方を満たすxとなるので、「x>0 && x<1」と書くことができます。また、$${x < 0, \ \ x > 1}$$は、2つの条件式「x < 0」と「x > 1」のどちらかを満たすxとなるので、「x<0 || x>1」と書くことができます。
・かつ    &&  → x > 0 && x < 1「$${0 < x < 1}$$」
・または   ||   → x < 0 || x > 1「$${x < 0, \ \ x > 1}$$」

if文の例

今回は、与えられた整数が正の整数か、負の整数か、どちらでもないか(つまり0か)を判定し、結果をコンソールに出力するプログラムを作ってみます。

void setup(){
  int x = 1;
  if( x > 0 ){
    println("正の値");
  } else if( x < 0 ){
    println("負の値");
  } else {
    println("値はゼロ");
  }
}

このソースコードを、Processingの開発環境ウィンドウを開いて(スケッチ名を「if_test」としています)、テキストエディタ部分に書いて実行します。

図1 if文の例

図1では、x=1としていますので、コンソールに「正の値」と出力されます。xの値を変えてif文が正しく動いているか、確認してみてください。たとえば、x=-1のときは「負の値」、x=0のときは「値はゼロ」とコンソールに出力されるはずです。

繰り返し処理

繰り返し処理には「forループ」と「while文」がよく利用されます。

forループ

forループは変数と組み合わせて繰り返しの処理を行います。次のように書くことができます。

for(変数の初期化; 条件式; 更新){
  処理;
}
  1. 「変数の初期化」は変数の宣言、初期値の代入を行います。繰り返しの最初に一度だけ実行されます。

  2. 変数の値が「条件式」を満たしていれば( { と } の間の)処理が実行されます。

  3. 処理が終わると変数を「更新」して、再度、変数の値が「条件式」を満たしているかを確認し、満たしていれば処理を行います。

  4. 3を「条件式」が満たさなくなるまで繰り返します。

forループの例

今回は、1から10までの整数を順にコンソールに出力してみます。

void setup(){
  for(int i=1; i<=10; i++){
    println(i);
  }
}

このソースコードを、Processingの開発環境ウィンドウを開いて(スケッチ名を「for_test」としています)、テキストエディタ部分に書いて実行します。

図2 forループの例
  1. 最初に「int i=1」で変数iを宣言し、かつ初期値1を代入しています。

  2. 変数iは条件式「i<=10」(iが10以下かどうか)を満たすので、処理「println(i);」が実行され、コンソールに「1」と表示されます。

  3. その後、iの値を更新します。更新の部分にある式「i++」は変数iの値を1つ増やすという演算子になります。そのため、iの値は1から2に更新されます。このとき、変数iは条件式「i<=10」を満たすので、処理「println(i);」が実行され、コンソールに「2」と表示されます。

  4. 3の処理を繰り返し、変数iの値が10になるまでは条件式「i<=10」を満たすので、順に「println(i);」が実行され、3から10までの数字がコンソールに表示されます。変数iの値が11に更新されると、条件式「i<=10」を満たさなくなるので、ここで繰り返し処理は終了となります。

while文

繰り返し処理を行うためのもう一つの方法がwhile文です。「while」は英語で「~する間」などと訳されるものですので、わかりやすいと思います。

while( 条件式 ){
  処理;
}

while文では、条件式を満たしている間、処理を繰り返し実行します。

while文の例

例として、forループの時と同じように、1から10までの整数を順にコンソールに出力してみます。

void setup(){
  int i = 1;
  while(i<=10){
    println(i);
    i++;
  }
}

このソースコードを、Processingの開発環境ウィンドウを開いて(スケッチ名を「while_test」としています)、テキストエディタ部分に書いて実行します。

図3 while文の例
  1. 最初に「int i=1;」で変数iを宣言し、かつ初期値1を代入しています。

  2. 変数iは条件式「i<=10」(iが10以下かどうか)を満たすので、処理「println(i);」が実行され、コンソールに「1」と表示されます。次に「i++;」が実行され、iの値は1から2に更新されます。

  3. 2の処理を繰り返し、変数iの値が10になるまでは条件式「i<=10」を満たすので、順に「println(i);」が実行され、3から10までの数字がコンソールに表示されます。変数iの値が11に更新されると、条件式「i<=10」を満たさなくなるので、ここで繰り返し処理は終了となります。

まとめ

今回は、「高校数学をプログラミングで解く」を始めるための準備として、プログラミング言語「Processing」でプログラムを書く際に必要となる知識の条件分岐、繰り返し処理について説明しました。
これらの条件分岐、繰り返し処理については、プログラムの基本的な3つの構造のうち、「選択構造」、「繰り返し構造」を実現するために必要なものになります。今後、何度も出てきますので、少しずつ書き方、使い方に慣れていってくれればと思います。

最後に、1点だけ。if文、forループ、while文を書くときはインデントを行ってソースコードを見やすくしておきましょう。インデントとはソースコードの各行の前に入れる空白(半角スペース)のことです。
たとえば、if文(3つ目のif-else if-else)は

if( 条件式1 ){
  処理1;
} else if( 条件式2 ){
  処理2;
} else {
  処理3;
}

と書きましたが、実際は

if( 条件式1 ){処理1;} else if( 条件式2 ){処理2;} else {処理3;}

のように書いてもプログラムとしては正しく動きます。ただ、非常に読みにくいプログラムになってします。では、

if( 条件式1 ){
処理1;
} else if( 条件式2 ){
処理2;
} else {
処理3;
}

と書いてみます。少し読みやすくなりました。ただ、処理がどんどん複雑になっていくとどうでしょうか。たとえば、処理1が以下のようになったとします。

if( 条件式1 ){
while( 条件式1-1 ){
処理1-1;
if( 条件式1-2 ){
処理1-2;
} else {
処理1-2-1;
}
}
} else if( 条件式2 ){
処理2;
} else {
処理3;
}

こうなると、どの { と } が対応しているのかよくわからなくなってしまいます。では、処理のレベルに合わせて、インデントを入れてみます。

if( 条件式1 ){
  while( 条件式1-1 ){
    処理1-1;
    if( 条件式1-2 ){
      処理1-2;
    } else {
      処理1-3;
    }
  }
} else if( 条件式2 ){
  処理2;
} else {
  処理3;
}

いかがでしょうか。だいぶ見やすくなったのではないでしょうか。このようにインデントを利用することでソースコードがみやすくなります。
なお、このソースコードでは、半角スペース2つをベースとしてインデントを行っていますが、半角スペース4つをベースとして利用する場合も結構多くみられます。

参考文献

Processingをはじめよう 第2版(オライリー・ジャパン、オーム社、ISBN9784873117737)

高等学校 情報I(数研出版、ISBN9784410821219)

この記事が気に入ったらサポートをしてみませんか?