プログラミング言語Ⅰ・講義メモ 後半

p.64 短絡評価

・論理AND/OR演算子のもつ効率と安全性を上げる仕掛け
・ANDの場合、左辺が0なら全体が0に確定するので右辺は無視してOK(評価しない)
・ORの場合、左辺が非0なら全体が1に確定するので右辺は無視してOK(評価しない)
・【参考】実はゼロ除算などの発生防止に役立つ。
 例えば「5 / a > 2」という条件は、aが0だと異常終了してしまう。
 そこで「(a != 0) && (5 / a > 2)」とすれば、左辺でaが0なら全体の0が確定するので、ゼロ除算は行わない。

p.64 演習3-11 ヒント

・「差が11以上」とは、差し引いた結果が-11以下、または、11以上であることを指す
・「論理OR演算子を利用する事」とあるので、上記をifの条件にして、elseで「差が10以下」を表示すれば良い

作成例

//p.63 演習3-11
#include <stdio.h>
int main(void)
{
    int na, nb; //int型の2変数を宣言
    puts("二つの整数を入力せよ");
    printf("変数A:"); scanf("%d", &na); //入力案内を表示しキーボードから整数値を入力
    printf("変数B:"); scanf("%d", &nb); //入力案内を表示しキーボードから整数値を入力
    if (na - nb <= -11 || na - nb >= 11) { //差し引いた結果が-11以下、または、11以上?
        puts("差が11以上");
    }
    else { //上記のどちらでもない?
        puts("差が10以下");
    }
    return 0;
}

自由参加課題:p.64 演習3-11・改

・論理AND演算子を利用して書き換えよう

p.66 switch文とbreak文

・3つ以上に分岐する多分岐構造はif-elseif-elseで記述できるが、switch文で見やすく記述できる場合がある
・分岐の条件となる値または式があり、これが整数であることが条件
・書式:
 switch (整数の値または式) {
  case 値① : 値または式が①と等しい場合の処理; break;
  case 値② : 値または式が②と等しい場合の処理; break;
  case 値③ : 値または式が③と等しい場合の処理; break;
  :
 }
・「値または式が①/②/③と等しい場合の処理」は2文以上記述できる

p.66 list0319.cpp

//p.66 list0319.cpp
#include <stdio.h>
int main(void)
{
    int no; //int型の変数を宣言
    printf("整数値:"); scanf("%d", &no); //入力案内を表示しキーボードから整数値を入力
    switch (no % 3) { //noを3で割った余りで分岐
    case 0: puts("3で割り切れます"); break;
    case 1: puts("3で割った剰余は1です"); break;
    case 2: puts("3で割った剰余は2です"); break;
    }
    return 0;
}

p.67 break文

・ブロック脱出用の文で、switchの中で用いることで、caseに対応する処理の末尾を示すことができる
・よって、「値または式が①/②/③と等しい場合の処理」を2文以上記述する場合、最後の文の後ろにbreak文を置く
例: case 0: x = 0; y = 0; break;

p.68 複雑なswitch文

・C/C++のswitch文では「break;」は任意であり、あえて記述しないことで「これ以降を無条件で実行せよ」とできる
 ※ C#では禁止の構文なのでエラーになる
・便利だが「無条件で実行」されることに注意
・全てのcaseに該当しない場合の処理を「default:」を用いて記述できる
・「default:」は最後に置く必要はないが、通常、最後に書くことが推奨される
・また「default:」にも「break;」を記述できるが、末尾にある場合は省略しても同じ結果になる
 ※ C#では「default:」にも「break;」が必須
・「default:」を記述する事で分岐モレ(どれに当てはまらずに進んでしまう)を避けられる場合がある

アレンジ演習:p.66 list0319.cpp

・3で割った余りが0でも1でもなければ必ず2になるのだから、「default:」を用いて「case 2:」を省略しよう

作成例

//アレンジ演習:p.66 list0319.cpp
#include <stdio.h>
int main(void)
{
    int no; //int型の変数を宣言
    printf("整数値:"); scanf("%d", &no); //入力案内を表示しキーボードから整数値を入力
    switch (no % 3) { //noを3で割った余りで分岐
    case 0: puts("3で割り切れます"); break;
    case 1: puts("3で割った剰余は1です"); break;
    default: puts("3で割った剰余は2です"); break;
    }
    return 0;
}

p.69 演習3-12 ヒント

・「if (n % 2)」を「switch (n % 2) {」「case 1:」にする
・「else」を「case 0:」または「default:」にする
・2つのputsの後に「break;」を追記する

作成例

//p.69 演習3-12
#include <stdio.h>
int main(void)
{
    int n; //int型の変数を宣言
    printf("整数を入力せよ:"); scanf("%d", &n); //入力案内を表示しキーボードから整数値を入力
    switch (n % 2) { //noを2で割った余りで分岐
    case 1: puts("その数は奇数です"); break;
    default: puts("その数は偶数です"); break;
    }
    return 0;
}

p.69 演習3-13 ヒント

・「if (month >= 3 && month <= 5)」を「switch (month) {」「case 3:」「case 4:」「case 5:」にする。
・この時、「case 3:」「case 4:」の後には何も書かない(breakもしない)
・「else if (month >= 6 && month <= 8)」を「case 6:」「case 7:」「case 8:」にする。
・この時、「case 6:」「case 7:」の後には何も書かない(breakもしない)
・「else if (month >= 9 && month <= 11) を「case 9:」「case 10:」「case 11:」にする。
・この時、「case 9:」「case 10:」の後には何も書かない(breakもしない)
・「else if (month == 12 || month == 1 || month == 2)」を「case 12:」「case 1:」「case 2:」にする。
・この時、「case 12:」「case 1:」の後には何も書かない(breakもしない)
・「else」を「default:」にする。
・5つのprintfの後に「break;」を追記する

作成例

//p.69 演習3-13
#include <stdio.h>
int main(void)
{
    int month; //月
    printf("何月ですか:"); scanf("%d", &month); //案内を表示しキーボードから月を入力
    switch (month) { //月で分岐
    case 3:
    case 4:
    case 5: printf("%d月は春です\n", month); break;
    case 6:
    case 7:
    case 8: printf("%d月は夏です\n", month); break;
    case 9:
    case 10:
    case 11:printf("%d月は秋です\n", month); break;
    case 12:
    case 1:
    case 2: printf("%d月は冬です\n", month); break;
    default:printf("%d月はありませんよ!!\a\n", month); break;
    }
    return 0;
}

第4章 プログラムの流れの繰返し

p.74 do文

・繰返し構造を表す文で「●を行ってから、条件をチェックし成立していたら繰返す」構文
・書式: do { 繰返し内容; … } while (継続条件);
・継続条件を示す文が非0である間、繰返しを続ける
・よって、処理後に「もう一回?」とする場合に便利

提出:p.69 演習3-13

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です