キャッシュ

IT関連教材の cache です。旧 URL のまま随時変更しています。

場合分け

2013-12-08 14:38:45 | 教材




問: キー入力した2個の正の整数の大きい方の値が小さい方の値の何倍であるかを画面に表示するプログラムを示せ。なお、2 数が等しいときもエラーにせず “1倍” と表示してよい。

考え方(1): 2 数を m, n に格納し、m < nのときは m, n の値を交換する。

#include stdio.h>
int main( ){
    int k, m, n;
    double x;
    printf("m="); scanf("", &m);
    printf("n="); scanf("", &n);
    <*m < nならば *>{
        k = m; m = n; n = k;
    }
    x = (m + 0.0)/n;
    printf("%f 倍\n", x);
    return 0;
}

 

#include stdio.h>
int main( ){
    int k, m, n;
    double x;
    printf("m="); scanf("", &m);
    printf("n="); scanf("", &n);
    if(m < n){
        k = m; m = n; n = k;
    }
    x = (m + 0.0)/n;
    printf("%f 倍\n", x);
    return 0;
}
 

<*m < nならば *>{k = m; m = n; n = k;}m < nでなければ何もしない。
m, n の値を交換するには別の変数を用いて k = m; m = n; n = k;のようにしなければならない。
x = m/n;とするとmnで割った値の整数部(小数点以下を切り捨てた値)がx
代入される。x = (m + 0.0)/n;x = m/(n + 0.0);でもよい。
x = m; x /= n;x = (double)m/n;でもよい。
★ 「x = m; x = (m < n ? x/n: n/x);」

考え方(2): 2 数を m, n に格納し、m > nのときは(m + 0.0)/n;、そうでないときは(n + 0.0)/m;で計算する。

#include stdio.h>
int main( ){
    int k, m, n;
    double x;
    printf("m="); scanf("", &m);
    printf("n="); scanf("", &n);
    <*m < nならば *>{
        x = (m + 0.0)/n;
    }<* そうでなければ *>{
        x = (n + 0.0)/m;
    }
    printf("%f 倍\n", x);
    return 0;
}

 

#include stdio.h>
int main( ){
    int k, m, n;
    double x;
    printf("m="); scanf("", &m);
    printf("n="); scanf("", &n);
    if(m < n){
        x = (m + 0.0)/n;
    }else{
        x = (n + 0.0)/m;
    }
    printf("%f 倍\n", x);
    return 0;
}

☆ else 節を使わない
     if(m < n){x = (m + 0.0)/n;}
     if(m >= n){x = (n + 0.0)/m;}
  でもよい。


問: エアコンの使用許可の問い合わせに対して、キー入力された温度 T が T<15 ならば暖房を許可、T>25 ならば冷房を許可、その他の場合は使用を禁止する回答をするプログラムの例を示せ。

考え方: if-else 文を用いると「その他の場合」の処理を else 節に書けばよい。

#include stdio.h>
int main( ){
    double T;
    printf("温度=");
    scanf("%lf", &T);
    <* T < 15 ならば *>{
        printf("暖房許可\n");
    }
    <* 
T > 25 ならば *>{
        printf("冷房許可\n");
    }
    <* 15 ≦ T 25 ならば *>{
        printf("使用禁止\n");
    }
    return 0;
}

 

#include stdio.h>
int main( ){
    double T;
    printf("温度=");
    scanf("%lf", &T);
    if(T < 15){
        printf("暖房許可\n");
    }else if(T > 25){
        printf("冷房許可\n");
    }else{
        printf("使用禁止\n");
    }
    return 0;
}
 

else 節を用いずに、文章どおりに書くと
    if(T < 15){printf("暖房許可\n");}
    if(T > 25){printf("冷房許可\n");}
    if(!(T < 15 || T > 25)){printf("使用禁止\n");}

  のようになる(場合の数が多いと「その他の場合」の式が複雑になる)。
★ 場合の数が多いときは if(T < 15){・・・}else if(T = 25){・・・}else{・・・}のように大きさの順に並べると見やすくなる。


問: キー入力した文字が 'c' ならば "char\n"'d' ならば "double\n"'i' ならば "int\n"、いずれでもなければ "?\n" を画面に表示するプログラムを示せ。

考え方: switch 文を使ってみる。

#include stdio.h>
int main( ){
    char x;
    printf("先頭文字=");
    scanf("%c", &x);
    <*x == 'c'ならば *>{
        printf("char\n");
    }
    <*x == 'd'
ならば *>{
        printf("double\n");
    }
    <*x == 'i'ならば *>{
        printf("int\n");
    }
    <* x 'c','d','i' のいずれ
    でもない *>{
        printf("?\n");
    }
    return 0;
}

 

#include stdio.h>
int main( ){
    char x;
    printf("先頭文字=");
    scanf("%c", &x);
    switch(c){
        case 'c':
            printf("char\n");
            break;
        case 'd':
            printf("double\n");
            break;
        case 'i':
            printf("int\n");
            break;
        default:
            printf("?\n");
    }
    return 0;
}
 

★ 項目数が多いとき、ジャンプテーブルを用いるので
    if(x == 'c'){printf("char\n");}
    else if(x == 'd'){printf("double\n");}
    else if(x == 'i'){printf("int\n");}
    else{printf("?\n");}
  のような構成より高速。



 

 



コメントを投稿