プログラミング考え方講座「真偽値と条件分岐」

プログラミング考え方講座

プログラミングをやっていると、必ずと言っていいほど行う処理というのがいくつかある。

例えば、前回解説した変数これがないとほぼシステムを組めない

…だが、これだけではない

ある処理を行いたいとき、様々な状況に対応する必要があるだろう。

例えば、Amazonであれば…ログインしているかどうか表示する情報が変わる

このように、ある条件によって処理を変える必要が出てくる。

今回は、そんな条件分岐を解説しよう。

そのために必要な真偽値という考え方も説明していく。

ちょっと長丁場になると思うが、これもどんなプログラミングでも使う考え方。

是非、マスターしていただきたい。

スポンサーリンク

今回の説明内容

今回は、上に書いた通り真偽値と、条件分岐を解説する。

両方かなり重要な考え方になるし、特に真偽値見た目に直接表れることは少ない

どんな考え方に基づいているか、身に付けて欲しい。

真偽値

真偽値とは

真偽値とは、一言で言ってしまうとYESかNOか、という2択だ。

ほとんどのプログラムでは、trueと、falseで用いられる。

この二つはともにリテラルで、型の考え方だとboolean型bool型などと呼ばれる。

そのほとんどが、条件分岐のために用いられる…が、そのままリテラルで書いてしまうと、常に一定の処理になってしまう

つまり、別の値から、これを計算してあげる必要があるのだ。

そのために、比較演算子論理演算子というものが用意されている。

比較演算子

比較演算子とは、同じ型の二つのデータの関係を調べ、その結果をtrue、もしくはfalseとして返す演算のこと。

例えば、二つの数値a, bを比較して、aの方が大きければtrue、そうでなければ(ab以下ならば)falseを返す、といったことができる。

基本的に比較する二つのデータの間に比較演算子を書き、それによる結果の真偽値で、その2データごと置き換わるイメージだ。

今回解説しているJava、C言語、JavaScriptでは、基本的な論理演算子の書き方は共通している

以下に、表でまとめてしまおう。

表の見方として、1列目に比較演算子を書く。これで、a 比較演算子 bと書くこととしよう。

で、2列目はtrueになるための条件、3列目はfalseになるための条件を入れる。

比較演算子truefalse
==aとbが等しいaとbが異なる
<aがbより小さいaがb以上
<=aがb以下aがbより大きい
>=aがb以上aがbより小さい
>aがbより大きいaがb以下
!=aとbが異なるaとbが等しい

例えば、a == bと書いたら、aとbが等しい場合はtrue、異なる場合はfalseになる、といった具合だ。

比較演算子の使用例

具体的な例を見ていこう。二つの数字を比較してみる。

例えば、5 == 5と書くと、両方は等しいのでtrueに置き換わる。

これを、5 != 5とすると、今度はfalseだ。

このようにリテラルを書いてもいいのだが、もちろん変数でも問題ない

num1 <= num2と書けば、num1に入っている数字が、num2以下(等しい場合を含む)の時にtrue、逆にnum1num2より大きければ(等しい場合は除く)falseとなる。

さて、ここで一つ注意を。比較する内容が文字列の場合だ。

これは言語によって異なるのだが、文字列を比較する場合は、この比較演算子は使えない場合がある

例えばJavaの場合。文字列が等しいかどうかを確認するための処理が用意されている。

文字列1.equals(文字列2)

こうすることで、文字列が同じかどうかを比較することができるようになる。

同じ場合はtrue、異なる場合はfalseだ。

C言語の場合は…ちょっと、あとに回させてほしい。ポインタの考えが出てきてしまう。

JavaScriptは、イコール二つで比較ができてしまう。ただ、補足する内容がある。

JavaScriptの文字列比較について

実は、JavaScriptの比較演算子は、異なる型でも比較することができる

が、型まで調べるために、JavaScriptだけ更に二つの比較演算子が用意されている。

比較演算子truefalse
===2つのデータのともに等しいtrueにならない時
!==2つのデータの型、あるいは値等しくないtrueにならない時

要するに、型まで含めて一致するかどうかを比較できるのだ。

今は「ふーん」でも構わない。このあたりも、詳細はポインタの部分で一緒に解説する文字列で話そう。

論理演算子

上では、二つの値の比較と書いた。

さて、この条件一つだけであればいいが、複数の条件を見たい場合も当然ある。

そこで、真偽値2つに関しては、別で論理演算子というものも用意されている。

これは、二つの真偽値の組み合わせで、更に真偽値を返すもの。

これも、書き方は3言語とも共通。

よく使うものは3つあるので、それぞれ表にまとめてしまおう。

まずは、AND(&&)から。これは、両方trueなら結果もtrue、どちらか一方でもfalseならfalseになる。

a && b a : true a : false
b : truetruefalse
b : falsefalsefalse

次に、OR(||)。これは、どちらか一方でもtrueなら結果はtrue、両方ともfalseの時のみfalseだ。

ちなみに、|はバーティカルバーと呼ぶ。

a || b a : true a : false
b : truetruetrue
b : falsetruefalse

最後に、NOT(!)。これだけは一つの真偽値に対する論理演算子で、つけたもののtruefalseをひっくり返す。

ちなみに、!はよくビックリマークと呼んでいるが、正式名称はエクスクラメーションマークと呼ぶらしい。

論理演算子の使用例

単純に二つの真偽値を挟む、あるいはNOTなら真偽値の前にくっつけるだけなのだが、具体的なものもちょっと見てみよう。

例えば、三つの数字num1, num2, num3があるとしよう。これで、num1が一番大きい場合にtrueを返させたい。

その時、まずnum1num2num1num3を比較し、両方ともnum1の方が大きければいいわけだ。

というわけで、先に二つを比較してしまおう。num1 > num2num1 > num3となる。

で、この両方がtrueなら全体もtrueにしたいので、これらで&&を挟む。

num1 > num2 && num1 > num3

これで、num1が一番大きい時にtrueが返ってくるようになる。

真偽値まとめ

いったんここまでの内容をまとめておこう。

プログラム上で、truefalseの二択を真偽値と呼ぶ。

これはリテラルで、型で言うとboolean型bool型だ。

で、このtruefalse二つのデータの比較によって返すことができる。それを行うのが、比較演算子

また、複数の真偽値の組み合わせで最終的な真偽値を決定するのが、論理演算子だ。

ここまでが、真偽値の考え方になる。

条件分岐

ここまでの内容を踏まえた上で、条件分岐に進んでいこう。

条件分岐とは

読んで字のごとく、条件分岐とは、ある条件に従って処理の内容を分岐させる処理のこと。

この条件とは何かというと…これが、真偽値だ。

つまり、言い換えると、ある真偽値がtrueなら行う処理というのを書くための考え方だ。

今回の3言語では書き方が共通しているので、具体的な書き方と共に見ていこう。

条件分岐の考え方

3言語共通で、以下のように書く。

if(真偽値){
    // 真偽値がtrueなら行う処理
}

これで、小括弧の中に書いた内容がtrueなら、処理を行わせることができる。

これを、通称if文と呼ぶ。この呼び方も3言語共通だ。

また、複数のパターンを考えたい場合もあるだろう。

例えば、ある二つの数字num1, num2について、num1の方が小さい場合、両方等しい場合、num2の方が大きい場合、といった感じ。

この時の書き方も用意されている。

if(真偽値1){
    // 真偽値1がtrueなら行う処理
}else if(真偽値2){
    // 真偽値1がfalseかつ、真偽値2がtrueなら行う処理
}else if(真偽値3){
    // 真偽値1、真偽値2がfalseかつ、真偽値3がtrueなら行う処理
}

このように、else ifと連続で続けることで、そこの真偽値が初めてtrueになった時に行われる処理も書くことができる。

この時の注意が、初めてtrueになった箇所のみ処理が実行される、ということだ。

つまり、一つ目だけfalseで、二つ目、三つ目がtrueになったとしても、二つ目の処理だけが行われる。

trueの個所全てが実行されるわけではない

最後に、そこまでの真偽値が全てfalseだった場合の書き方も用意されている。

if(真偽値1){
    // 真偽値1がtrueなら行う処理
}else if(真偽値2){
    // 真偽値1がfalseかつ、真偽値2がtrueなら行う処理
}else if(真偽値3){
    // 真偽値1、真偽値2がfalseかつ、真偽値3がtrueなら行う処理
}else{
    // これまでの真偽値全てがfalseなら行う処理
}

最後、elseの部分だ。

こうすることで、そこまでが全部falseの場合の処理を書ける。

この、複数の条件による処理の考え方も、ほとんどの言語で行うことができるので覚えておこう。

具体例

では、実際に使ってみよう。

例として、テストの点数pointについて、以下のような条件分岐をしてみよう。

  • 90点以上なら「S」と表示
  • 80~89点なら「A」と表示
  • 70~79点なら「B」と表示
  • 60~69点なら「C」と表示
  • 59点以下なら「D」と表示

よくある大学の単位判定だ。…この区分一般的だよな?

本当はそもそも0から100までとか、数字が整数とか色々条件はあると思うが、今回は数字による区分だけ行おう。

これを、これまでの内容で実装してみる。

Javaによる実装例

まずはJavaから。

class Sample03 {
    public static void main(String args[]){
        int point = 100;

        if(point >= 90){
            System.out.print("S");
        }else if(point >= 80){
            System.out.print("A");
        }else if(point >= 70){
            System.out.print("B");
        }else if(point >= 60){
            System.out.print("C");
        }else{
            System.out.print("D");
        }
        System.out.print("\n");
    }
}

一個目なので、ちょっと詳しく解説していこう。

まず、3行目で変数pointを用意し、100をとりあえず代入してある。優秀な学生だ。

次に、5行目から条件分岐開始。まずは、単純にpointが90以上なら、ここが実行される。

つまり、90点以上なら、Sと表示される。これが実行されれば、if文全体が処理終了だ。

そして、7行目。ここは、5行目がfalseなら…つまり、89点以下の時に初めて評価される。

で、書かれているのは、pointが80以上なら、ということで80~89なら実行されることになる。

これも、実行されればその時点で終わりになる。

以下同じで、9行目、11行目についても、それまでがfalseでそこがtrueなら、その対応した内容が表示される。

最後に、13行目でelseが入っている。

それまでの内容が全部falseということは…ここでは、pointが59以下の場合に処理が行われる。

これで、狙った出力を分岐させて行うことができる。

ちなみに、16行目は、前回ちょっと解説した通り、出力後に改行を一個挟んでいるだけだ。

実行してみる場合は、pointの数字を色々変えて試してみよう。

C言語による実装例

お次に、C言語。

処理の考え方はJavaと全く同じなので、サンプルソースだけ載せよう。

#include<stdio.h>

int main(){
    int point = 100;

    if(point >= 90){
        printf("S");
    }else if(point >= 80){
        printf("A");
    }else if(point >= 70){
        printf("B");
    }else if(point >= 60){
        printf("C");
    }else{
        printf("D");
    }
	printf("\n");
    return 0;
}

JavaScriptの実装例

こちらも同じ。

var point = 100;
            
if(point >= 90){
    console.log("S");
}else if(point >= 80){
    console.log("A");
}else if(point >= 70){
    console.log("B");
}else if(point >= 60){
    console.log("C");
}else{
    console.log("D");
}

まとめ:真偽値と条件分岐

今回は、真偽値条件分岐を解説した。

まず、真偽値とは、truefalseで表される2択だった。

で、これらを表すための、二つのデータを比べる比較演算子二つの真偽値を比べる論理演算子を扱った。

条件分岐は、真偽値がtrueなら実行する、という考え方。

組み合わせによって、そこまでがfalseかつそこがtrueなら行うelse if、全てfalseなら行うelseも同時に扱った。

特に真偽値は、見た目でtruefalseが出てくるわけではない。意識しておこう。

次回は、繰り返し処理を扱おう。

今回の真偽値の内容がどんどん出てくるので、心配だという方は復習しておいて欲しい

更新情報はTwitterでも呟いている。よかったら、ページ下部のTwitterアイコンから覗いていってほしい。

それでは。

コメント

タイトルとURLをコピーしました