テキスト63ページの演習3-10

解答例その1


#include<stdio.h>

int main(void)
{

    int na,nb,nc;

    puts("三つの整数を入力して下さい。");
    
    printf("整数A:");
    scanf("%d", &na);
    
    printf("整数B:");
    scanf("%d", &nb);
    
    printf("整数C:");
    scanf("%d", &nc);

    if(na==nb && nb==nc)
        puts("三つの整数は等しいです。");
    else if(na==nb || nb==nc || nc==na) /* この条件式の評価値は,三つの整数が等しい場合にも1(真)となるが,
                                           三つの整数が等しい場合は上のif文で処理済となる。
                                           (三つの整数が等しい場合はこのelse if文は実行されない) */
        puts("二つの整数が等しいです。");
    else
        puts("三つの整数は異なります。");

    return(0);
}

解答例その2

解答例のような,
if...
else if...
else...
構文の流れに頼らずに,三つの場合分けの判断を厳密に表現している例その2
Very Very Very Excellent!!
このように考える癖をつけておくと,バグが起こりにくい

/* 
     読み込んだ三つの整数値において全て等しいか、二つ等しいか、バラバラかを判定
*/


#include <stdio.h>

int main(void)

{

int n1, n2, n3;

puts("三つの整数を表示してください。");

printf("整数1 :");  scanf("%d", &n1);    
printf("整数2 :");  scanf("%d", &n2);
printf("整数3 :");  scanf("%d", &n3);

if (n1 == n2 && n2 == n3)  
    puts("三つの値は等しいです。");
else if (n1 != n2 &&  n2 != n3  &&  n1 != n3)
    puts("三つの値は異なります。");
else
    puts("二つの値が等しいです。");   /* 三つの値が全て等しい場合と,
                                     三つの値が全て異なる場合
                                     以外にあり得る状況は,どれか二つの値が等しい場合 しかないのである!*/


return (0);
    
}

解答例その3

if...
else if...
else...
構文の流れに頼らずに,三つの場合分けの判断を厳密に表現している例その3

/*
    三つの整数を読み込んでそれらの値が等しいか否かを判断
*/

#include <stdio.h>

int main(void)
{
    int n1, n2, n3;

    puts("三つの整数を入力して下さい:");
    printf("整数1:");    scanf("%d", &n1);
    printf("整数2:");    scanf("%d", &n2);
    printf("整数3:");    scanf("%d", &n3);
    if (n1 == n2 && n2 == n3)
        puts("三つの値は等しいです。");
    else if (n1 == n2 && n2 != n3 || n1 == n3 && n3 != n2 || n2 == n3 && n2 != n1)
    /*
         && と || の優先順位(どちらが先に処理されるか,テキスト205ページTable7-11参照)は,&& のほうが高いので,これで期待どおりの動作をする。
         しかし,自分の意図する順番でコンピュータに処理させることを明確にしておくために,以下のように ( ) を使用することをお勧めします。
         else if ( (n1 == n2 && n2 != n3) || (n1 == n3 && n3 != n2) || (n2 == n3 && n2 != n1) ) 
    */
        puts("二つの値が等しいです。");
    else
        puts("三つの値は異なります");

    return (0);
}

コンピュータプログラムは,
“例外なく” “漏れなく” “期待されている動作をする”
ことが,最も重要である。
計算効率などは,二の次で,よい。



解答例その4

Very Very Excellent!!


/*
    3つの整数値を読み込んで、そのうち等しいものはいくつあるかを表示する
*/

#include <stdio.h>

int main(void)
{
    int a,b,c,A,B,C,S ;

    printf("3つの整数値を入力して下さい\nひとつめ:");
    scanf("%d",&a);

    printf("ふたつめ:");
    scanf("%d",&b);

    printf("みっつめ:");
    scanf("%d",&c);

    A = a == b ; B = b == c ; C = c == a ;
    S = A + B + C ;
    /* コンピュータの内部では,真は1で,偽は0で表されるという性質をうまく使っている。
    このコードを書いたひとは,コンピュータに慣れているひとでしょう。うまい!*/

    if ( S == 0 )
    puts("等しいものは0個です。");

    else if ( S == 1 )
    puts("等しいものは2個です。");

    else
    puts("等しいものは3個です。");

    return(0);
}

解答例その5

制御文をネストさせた例

/*
exer3-9
三つの整数値を読みこんで、比較
*/

#include<stdio.h>

int main(void)
{
    int a,b,c;

    puts("三つの整数を入力して下さい");

    printf("整数1:");  scanf("%d",&a);
    printf("整数2:");  scanf("%d",&b);
    printf("整数3:");  scanf("%d",&c);


    if (a==b){
        if(b==c) printf("三つの値は等しいです。\n");
        else printf("二つの値が等しいです。\n");
    }else{
        if(b==c || a==c) printf("二つの値が等しいです。\n");
        else printf("三つの値は異なります。\n");
    }

    return(0);
}

間違いの例その1


#include <stdio.h>

int main(void)
{
   int n1, n2, n3;

   puts("3つの整数を入力してください。");
   printf("整数1:");   scanf("%d", &n1);
   printf("整数2:");   scanf("%d", &n2);
   printf("整数3:");   scanf("%d", &n3);
   
   if (n1 == n2 == n3) /* この式は,まず,n1==n2 が評価されて,
                          0(n1とn2が等しくない場合)もしくは1(n1とn2が等しい場合)の評価値となり,
                          その次に,その評価値==n3が評価されることになる。
                          すなわち,n3と等価演算子==で比較されるのは0または1となってしまう!気をつけて!
                          (コンパイルはエラーなくとおる) */
      puts("三つの値は等しいです。");
   else if (n1 == n2 || n2 == n3 || n3 == n1)
      puts("二つの値が等しいです。");
   else
      puts("三つの値は異なります。");     
  
   return (0);
}

間違いの例その2


#include <stdio.h>
main(){
int na, nb, nc;
printf("整数Aを入力して下さい:"); scanf("%d" ,&na);
printf("整数Bを入力して下さい:"); scanf("%d" ,&nb);
printf("整数Cを入力して下さい:"); scanf("%d" ,&nc);
    if(na==nb && nb==nc){
        puts("3つの値は等しいです。");
    }
    else if(na==nb || nb==nc){ /* この式は,naとncが等しいとき(例えば,naが2,nbが3,ncが2,など)
                                  0(偽)となってしまう可能性が残されてしまっている。注意! */
        puts("2つの値が等しいです。");
    }
    else{
        puts("3つの値は異なります。");
    }
return 0;
}


テキスト64ページの演習3-11

解答例その1


#include<stdio.h>

int main(void)
{

    int na, nb, diff ;

    puts("二つの整数を入力して下さい。");
    
    printf("整数A:");
    scanf("%d", &na);
    
    printf("整数B:");
    scanf("%d", &nb);
    
    diff = na - nb ;

    if(diff > 10 || diff < -10)
        puts("それらの差は11以上です。") ;
    else
        puts("それらの差は10以下です。") ;

    return(0) ;
}

解答例(番外編)

ワイルドな例(論理OR演算子 || を使わない例。)

#include <stdio.h>

int main(void) {

	int a, b;
	int diff;

	puts("二つの整数を入力してください。");

	printf("整数A:");
	scanf("%d", &a);
	printf("整数b:");
	scanf("%d", &b);

	diff = (a > b) ? (a - b) : (b - a); /* 条件演算子 ? : については,Cf. テキスト56ページ
                                               このひとも,コンピュータに慣れたひとでしょう。*/

	if(diff <= 10) puts("それらの差は10以下です。");
	else puts("それらの差は11以上です。");

	return 0;
}