Upload
bcrikko
View
687
Download
0
Embed Size (px)
Citation preview
C 言語入門~ 条件分岐について ~
(論理演算子と条件演算子)
2本日の目標
• 論理演算子を使い、複数条件を書けるよう
になる
「かつ」「または」「でない」が論理演算子
4論理演算子
「やさしい C 」 p.139 、 p.82
記号 種類 使用例
論理演算子&& 論理積( AND ) x && y|| 論理和( OR ) x || y! 否定( NOT ) !x
論理演算とベン図
6論理演算とベン図
&& :論理積(AND)
|| :論理和 (OR) ! :否定 (NOT)
7論理演算子を使ってみる
• 「やさしい C 」 p.141
うるう年の判定に論理演算子を使う
9うるう年の判定①
条件
• 西暦が 4 で割り切れる場合は、うるう年
• しかし、西暦が 100 で割り切れる場合は、うるう年で
はない
• ただし、西暦が 400 で割り切れる場合は、うるう年
10論理演算子を使わない場合
#include <stdio.h> int main(void) { int year;
printf(" 西暦を入力してください。 \n"); printf(" 西暦 :"); scanf("%d", &year);
if (year % 400 == 0) { printf(" うるう年です。 \n"); } else if (year % 100 == 0) { printf(" 平年です。 \n"); } else if (year % 4 == 0) { printf(" うるう年です。 \n"); } else { printf(" 平年です。 \n"); }
return 0; }
うるう年の判定プログラム
判定仕様をうまく表せていない
※ 条件の順番により得られる結果が変わるため
11うるう年の判定②
条件を分けて考えると…
「 400 で割り切れる」
または
「 4 で割り切れる かつ 100 で割り切れない」
12うるう年の判定③
13論理演算子を使った場合
#include <stdio.h> int main(void) { int year;
printf(" 西暦を入力してください。 \n"); printf(" 西暦 :"); scanf("%d", &year);
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { printf(“ うるう年です。 \n”); } else { printf(" 平年です。 \n"); }
return 0; }
うるう年の判定プログラム
if の条件だけで判定仕様がわかる
year % 100 != 0と
!(year % 100 == 0)は同じ
論理演算子の注意点
15論理演算子の注意点
• 条件が長く、複雑になりやすい
• 短絡評価 ( ショートサーキット ) を意識す
る
対処方法
17長く、複雑になりやすい
対処方法
• ド・モルガンの法則で置き換える
• 要約変数を使う
18ド・モルガンの法則を使う①
• 結果は同じまま、条件を書き換えること– Not (A or B or C) ⇔ (Not A) and (Not B) and (Not C)– Not (A and B and C) ⇔ (Not A) or (Not B) or (Not C)
• Not でくくって( Not をそれぞれに分配して)、
and と or を反転させる
19ド・モルガンの法則を使う②
• 未成年 かつ 成績が「優秀」でない 人
以外は A クラスにわける
–未成年: 20 歳未満
–優秀:成績が 90 点以上
20
#include <stdio.h> int main(void){ int score; int age;
scanf("%d", &score); scanf("%d", &age); if (!(age < 20 && !(90 <= score))) { printf(" あなたは A クラスです。 \n"); }
return 0; }
ド・モルガンの法則を使う③ド・モルガンの法則の適応前の場合
「よくなくなくなくない?」と同じように、
否定が多いと混乱してしまう
21
#include <stdio.h> int main(void){ int score; int age;
scanf("%d", &score); scanf("%d", &age); if (!(age < 20) || 90 <= score) { printf(" あなたは A クラスです。 \n"); }
return 0; }
ド・モルガンの法則を使う④ド・モルガンの法則の適応後の場合
否定の回数が減るだけで、わかりやすくなる
22要約変数を使う①
• 未成年 かつ 成績が「優秀」または「平
均」の場合に、 B クラスにわける
–未成年: 20 歳未満
–優秀:成績が 90 点以上
–平均:成績が 60 点以上、 80 点未満
23
#include <stdio.h>
int main(void){ int score; int age;
scanf("%d", &score); scanf("%d", &age);
if (age < 20 && ( 90 <= score || (60 <= score && score < 80))) { printf(“ あなたは B クラスです。 \n”); }
return 0; }
要約変数を使う②要約変数を使わない場合
長くて、複雑でパッと見ただけでは、
何をしているかわからない
24
#include <stdio.h>
int main(void){ int isExcellent, isGood, isAverage, isFair, isPoor; int score; int age;
scanf("%d", &score); scanf("%d", &age);
isExcellent = 90 <= score; isGood = 80 <= score && score < 90; isAverage = 60 <= score && score < 80; isFair = 40 <= score && score < 60; isPoor = score < 40;
if (age < 20 && (isExcellent || isAverage)) { printf(" あなたは B クラスです。 \n"); } return 0; }
要約変数を使う③要約変数を使った場合
要約変数を使うことで条件をわかりやすくする
if 文 の代わりになるもうひとつの書き方
26条件演算子(三項演算子)
char ans;
if (x == 1) { ans = 'A'; } else { ans = 'B'; }
if 文の場合
char ans; ans = (x == 1) ? 'A' : 'B';
条件演算子の場合
(x == 1) ? puts("A") : puts("B");コードが短くなるので便利
※ 状況によっては使わない方がよいときも
こういう使い方もできる
27条件演算子を使う
• 「やさしい C 」 p.143
「やさしい C 」 p.143
28条件演算子を使うべきでない場合
• 条件、または真・偽の式が長くなる場合例: ans = (x == 1 && y == 1) ? getScore(x) + x * 10 : 0;
• 真・偽の式で、さらに分岐する場合例 : ans = (x == 1) ? ((y == 1) ? 1 : 2) : 3;