学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

C++ | 08 | 論理演算

↓↓クリックして頂けると励みになります。



07 | 標準入力cin】 << 【ホーム】 >> 【09 | 演算子


論理演算のプログラム
論理演算のプログラム




C++の論理演算は、真偽値を扱う際に使用される演算です。
主に条件式の評価や制御フローの制御に使用されます。
C++では、主に3つの論理演算子があります。

  • 論理積(AND): && 演算子を使って表されます。論理積は、全てのオペランドが真の場合に結果が真となります。少なくとも1つのオペランドが偽の場合、結果は偽となります。
  • 論理和(OR): || 演算子を使って表されます。論理和は、少なくとも1つのオペランドが真の場合に結果が真となります。全てのオペランドが偽の場合、結果は偽となります。
  • 論理否定(NOT): ! 演算子を使って表されます。論理否定は、オペランドの真偽を逆転させます。真なら偽、偽なら真となります。

これらの演算子は、条件式の組み合わせや真偽値の結合などに幅広く利用されます。
例えば、if文やwhileループなどの制御構造の条件式、また複雑な条件式の評価などで使用されます。




Visual Studio Codeで以下のcppファイルを作成して下さい。


新規作成 【EnzanTest1.cpp】

#include <iostream>

int main() {
	int a, b, c, ans, mondaisu, seikaisu;
	mondaisu = 4;
	seikaisu = 0;

	std::cout << "以下の問題では、真の時は1を、偽の時は0を入力してください。";
	std::cout << std::endl << std::endl;

	/*問題1*/
	a=5; b=3;

	std::cout << "a=" << a << ", b=" << b;
	std::cout << " の時、a>1 && b>2 は真(1)か偽(0)か?答え=> ";
	std::cin >> ans;

	if ( ans == (a>1 && b>2) ){
		seikaisu++;
	}

	/*問題2*/
	a=2; b=-2;

	std::cout << "a=" << a << ", b=" << b;
	std::cout << " の時、a<0 || b<0は真(1)か偽(0)か?答え=> => ";
	std::cin >> ans;

    if ( ans == (a<0 || b<0) ){

            seikaisu++;
    }

	/*問題3*/
	a=-4; b=-2;

	std::cout << "a=" << a << ", b=" << b;
	std::cout << "の時、a<0 && b>0 は真(1)か偽(0)か?答え=>=> ";
	std::cin >> ans;

    if ( ans == (a<0 && b>0) ){

        seikaisu++;
    }

	/*問題4*/
	a=8; b=-2; c=0;

	std::cout << "a=" << a << ", b=" << b << ", c=" << c;
	std::cout << " の時、a>0 && b>-2 || c>-1 は真(1)か偽(0)か?答え=>=> ";
	std::cin >> ans;

        if ( ans == (a>0 && b>-2 || c>-1) ){
                seikaisu++;
        }

		std::cout << "正解は、" << mondaisu;
		std::cout << " 問中" << seikaisu <<  "問です。" << std::endl;

	if ( mondaisu == seikaisu) {
		std::cout << "全問正解です。次の課題に進んでください。" << std::endl;
	}
	else {

		std::cout << "もう一度やり直してください。" << std::endl;
	}
}



論理演算とは真と偽の値をもつものの間の演算のことで、結果は必ず真または偽になるものです。
論理演算子には次の3つがあります。

演算子機能優先順位
!否定1
&&and(かつ)2
||or(または)3
ただし論理andと論理orは2項演算子であるのに対し、否定演算子は単項(一つの論理値に作用する)演算子です。


もう少し詳しく説明すると次のようになります。
否定真のものを否定すれば偽。偽を否定すれば真。
論理 and2つの論理値が同時に真であるときのみ真。それ以外はすべて偽。
論理 or2つの論理値が同時に偽であるときの偽。それ以外はすべて真。
真偽を数字で表すと、偽は0、真は1です。


論理演算で真(true)であるというのは、数字で表すと1になります。
逆に偽(false)であるということは0になります。


サンプルプログラムを実行してみましょう。
選択が4つ以上あるクイズを考え、答えの番号を入力させるプログラムです。
正しければ正解であることを表示して終了し、間違っていれば誤答であることを表示します。

~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile 
&& "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile

以下の問題では、真の時は1を、偽の時は0を入力してください。

a=5, b=3 の時、a>1 && b>2 は真(1)か偽(0)か?答え=> 1
a=2, b=-2 の時、a<0 || b<0は真(1)か偽(0)か?答え=> => 0
a=-4, b=-2の時、a<0 && b>0 は真(1)か偽(0)か?答え=>=> 1
a=8, b=-2, c=0 の時、a>0 && b>-2 || c>-1 は真(1)か偽(0)か?答え=>=> 0
正解は、4 問中1問です。
もう一度やり直してください。



Visual Studio Codeで以下のcppファイルを作成して下さい。


新規作成 【EnzanTest2.cpp】

#include <iostream>

int main() {

	int a, b, c;

	std::cout << "三角形の3辺の長さを入力してください。" << std::endl;

	std::cout << "まず最初に、一辺の長さ aを自然数で入力してください。--->" << std::endl;

    for (std::cin >> a ; !std::cin ; std::cin >> a){

        std::cin.clear();
        std::cin.ignore();
        std::cout << "入力が間違ってます" << std::endl << "長さ aを自然数で入力してください。-->";
    }

    std::cout << "次にもう一辺の長さ bを自然数で入力してください。--->" << std::endl;

    for (std::cin >> b ; !std::cin ; std::cin >> b){

        std::cin.clear();
        std::cin.ignore();
        std::cout << "入力が間違ってます" << std::endl << "長さ bを自然数で入力してください。-->";
    }

    std::cout << "最後に 辺の長さcを自然数で入力してください。--->" << std::endl;

    for (std::cin >> c ; !std::cin ; std::cin >> c){

        std::cin.clear();
        std::cin.ignore();
        std::cout << "入力が間違ってます" << std::endl << "長さcを自然数で入力してください。-->";
    }

	if ((a+b>c && b+c>a && c+a>b) == 1 ){

		std::cout << "三角形として成り立っています" << std::endl;
        }
	
	else {

		std::cout << "三角形として成立していません。" << std::endl;
	}
}



三角形の3辺の長さを与えたときに、その三角形が成立しているかどうかを調べるプログラムです。


三角形というのはどんな長さの3辺を与えても三角形が成立するわけではありません。


例えば斜辺の長さが異常に長い1000のような値をとるとき、他の2辺が1, 1の長さならば明らかに三角形として成立しません。
一般に三角形の3辺をa, b, c とすると、三角形の成立条件は「a+b >c かつ b + c > a かつ c + a > b」です。


サンプルプログラムを実行してみましょう。
三辺の長さ(自然数)をキーボードから入力できるようにしています。
三角形として成立していれば「三角形として成り立っています」と出力され、成立していなければ「三角形として成立していません。」と出力されます。

~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile 
&& "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile

三角形の3辺の長さを入力してください。
まず最初に、一辺の長さ aを自然数で入力してください。--->
3
次にもう一辺の長さ bを自然数で入力してください。--->
4
最後に 辺の長さcを自然数で入力してください。--->
5
三角形として成り立っています

~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile && "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile

三角形の3辺の長さを入力してください。
まず最初に、一辺の長さ aを自然数で入力してください。--->
1000
次にもう一辺の長さ bを自然数で入力してください。--->
1
最後に 辺の長さcを自然数で入力してください。--->
1
三角形として成立していません。



Visual Studio Codeで以下のcppファイルを作成して下さい。


新規作成 【EnzanTest3.cpp】

#include <iostream>

int main() {

    int a, b, c, temp;

    std::cout << " 三角形の3辺の長さを入力してください。"<< std::endl;
    std::cout << "まず最初に、一辺の長さ aを自然数で入力してください。--->" << std::endl;

    for (std::cin >> a ; !std::cin ; std::cin >> a){
        std::cin.clear();
        std::cin.ignore();
        std::cout << "入力が間違ってます" << std::endl << "長さ aを自然数で入力してください。-->";
    }
    std::cout << "次にもう一辺の長さ bを自然数で入力してください。--->" << std::endl;

    for (std::cin >> b ; !std::cin ; std::cin >> b){
        std::cin.clear();
        std::cin.ignore();
        std::cout << "入力が間違ってます" << std::endl << "長さ bを自然数で入力してください。-->";
    }
    std::cout << "最後に 辺の長さcを自然数で入力してください。--->" << std::endl;

    for (std::cin >> c ; !std::cin ; std::cin >> c){
        std::cin.clear();
        std::cin.ignore();
        std::cout << "入力が間違ってます" << std::endl << "長さcを自然数で入力してください。-->";
    }
    if ( a < b ){
        temp=a; a=b; b=temp;
    }
    if ( a < c ){
        temp=a; a=c; c=temp;
    }
    if ((a+b>c && b+c>a && c+a>b) == 1 ){

        std::cout << "三角形は成立しています。" << std::endl;

        if ((a*a == b*b + c*c) == 1 ){
            std::cout << "この三角形は直角三角形です。" << std::endl;
        }
        else if ((a*a > b*b + c*c) == 1 ){
            std::cout << "この三角形は鈍角三角形です。" << std::endl;
        }
        else if ((a*a < b*b + c*c) == 1 ){
            std::cout << "この三角形は鋭角三角形です。" << std::endl;
        }
    }
    else {
        std::cout << "三角形として成立していません。"<< std::endl;
    }
}



三角形の3辺の長さを与えたときにその三角形が成立しているかどうかを調べ、三角形の成立条件を調べた上で形状を調べるプログラムです。


三角形の形状にはいろいろなものがあります。
直角三角形、鈍角三角形、鋭角三角形のどれかを調べるプログラムです。
以下では最も長い辺を a とし、それ以外の辺を b, c としています。
ただしどれか2つ、あるいは3つの辺が等しい場合も含んでいます。


1.直角三角形 a*a = b*b + c*c が成立するもの。
2.鈍角三角形 a*a > b*b + c*c が成立するもの。
3.鋭角三角形 a*a < b*b + c*c が成立するもの。


最も長い辺を求めるために以下の処理を行っています。

if ( a < b ){
     temp=a; a=b; b=temp;
}
if ( a < c ){
     temp=a; a=c; c=temp;
}

これで「 a > b かつ a > c」になっています。


サンプルプログラムをビルドして実行してみましょう。
与えられた条件に対し、直角三角形、鈍角三角形、鋭角三角形のどれかを表示します。

~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile 
&& "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile

 三角形の3辺の長さを入力してください。
まず最初に、一辺の長さ aを自然数で入力してください。--->
4
次にもう一辺の長さ bを自然数で入力してください。--->
5
最後に 辺の長さcを自然数で入力してください。--->
6
三角形は成立しています。
この三角形は鋭角三角形です。



07 | 標準入力cin】 << 【ホーム】 >> 【09 | 演算子





↓↓クリックして頂けると励みになります。