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