next up previous contents
Next: 7. 特別な演算子 Up: 6. 制御構造と論理演算 Previous: 3. 論理 or

2. 課題6

cd c を実行した後で( ~/c に移動した後で)、以下の課題を やってみよ。

課題 6.1
出題プログラムを動かしてみる
以下のプログラムを実行し、正解が得られるまで試みよ。

/* kadai 6.1 */
#include <stdio.h>
main()
{
        int a, b, c, ans, mondaisu, seikaisu;
        char buf[64];
        mondaisu = 4;
        seikaisu = 0;

        printf("以下の問題では、真の時は1を、偽の時は0を入力せよ。\n\n");

        /* prob. 1 */
        a=5; b=3;
        printf("a=%d, b=%d の時、a>1 && b>2 は真(1)か偽(0)か? 答=> ",a,b);
        scanf("%d",&ans);
        if ( ans == (a>1 && b>2) ){
                seikaisu++;
        }
        scanf("%s",buf);

        /* prob. 2 */
        a=2; b=-2;
        printf("\na=%d, b=%d の時、a<0 || b<0 は真(1)か偽(0)か? 答=> ",a,b);
        scanf("%d",&ans);
        if ( ans == (a<0 || b<0) ){
                seikaisu++;
        }
        scanf("%s",buf);

        /* prob. 3 */
        a=-4; b=-2;
        printf("\na=%d, b=%d の時、a<0 && !b>0 は真(1)か偽(0)か? 答=> ",a,b);
        scanf("%d",&ans);
        if ( ans == (a<0 && !b>0) ){
                seikaisu ++;
        }
        scanf("%s",buf);

        /* prob. 4 */
        a=8; b=-2; c=0;
        printf("\na=%d, b=%d, c=%d の時、",a,b,c);
        printf("a>0 && b>-2 || c>-1 は真(1)か偽(0)か? 答=>");
        scanf("%d",&ans);
        if ( ans == (a>0 && b>-2 || c>-1) ){
                seikaisu ++;
        }
        scanf("%s",buf);

        printf("正解は、%d 問中 %d 問です。\n", mondaisu, seikaisu);
        if (mondaisu == seikaisu){
                printf("全問正解です。次の課題に進んで下さい。\n");
        }else{
                printf("もう一度やり直してください。\n");
        }
}

このプログラムでは、入力された答と論理式の真偽が一致しているかどうかを調べる 為に、if 文の条件式に ans == 論理式 で判定している。

課題 6.2
三角形の成立条件

三角形の3辺の長さを与えたときに、その三角形が成立しているかどうかを 調べるプログラムを作る。注意すべきは、どんな長さの3辺を与えても三角形が 成立するわけではない点である。例えば、斜辺の長さが異常に長い 1000 のような 値をとるときに、他の2辺が 1,1 の長さならば明らかに、これは三角形として 成立しない。一般に三角形の三辺を a, b, c とすると、一般に三角形の成立条件は、 $ a + b > c$ かつ $ b + c > a $ かつ $ c + a > b $ である。

3辺の長さ(自然数)をキーボードから入力して、三角形として成立するかどうか を判定するプログラムを作れ。

課題 6.3
三角形の形状

課題 7.2 のプログラムを利用して、三角形の成立条件を調べた上で、形状を調べる プログラムを作ろう。三角形の形状には色々なものがあるが、ここでは直角三角形 、鈍角三角形、鋭角三角形のどれであるかを調べるプログラムを作る。以下では、 もっとも長い辺を a とし、それ以外の辺を b, c とする。(但し、どれか2つ、 あるいは3つの辺が等しい場合も含む。)

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

ヒント もっとも長い辺(斜辺)を求めるには次のようにする。


        int a, b, c, temp;
	...
	if (a < b){
             temp=a; a=b; b=temp;    /* swap a, b */
	}
	if (a < c){
	     temp=a; a=c; c=temp;    /* swap a, c */
	}

これで $ a \ge b, a \ge c $ になっている。

色々な三角形について、作成したプログラムを走らせてみよ。特に、5,4,3 の 三角形、3,2,6 の三角形、5,4,6 の三角形についての結果を報告せよ。

作成したプログラムと結果をメイルで、creport まで送ること。但し、題は kadai06 と すること。

前回の復習
論理演算

論理値の間の演算を論理演算と呼び、結果は真か偽である。(c 言語では、 偽は0、それ以外の数値は全て真であることに注意せよ。) 論理演算子には次のようなものがある。

演算子 機能 優先順位
! 否定 1
&& and(かつ) 2
|| or (または) 3
論理 and と 論理 or 演算は2項演算子であるのに対し、否定演算子は単項 (一つの論理値に作用する)演算子である。また、否定演算子は関係演算などより 優先度が高いので、$! a > b$ は、$(!a)>b$ と等しい点に注意する。 紛らわしい場合は、丸括弧をつけることで演算の順序を指定できるので、積極的に 丸括弧を使った方が良い。

各演算子の意味は次の通りである。

否定
真のものを否定すれば、偽。偽を否定すれば真。
論理 and
2つの論理値が同時に真である時のみ真。それ以外は全て偽。
論理 or
2つの論理値が同時に偽である時のみ偽。それ以外は全て真。



Noriyo Kanayama