28
C 言言言言 言言言言言言言言 言言言言言言言言言言言言 ()

10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

  • Upload
    bcrikko

  • View
    687

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

C 言語入門~ 条件分岐について ~

(論理演算子と条件演算子)

Page 2: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

2本日の目標

• 論理演算子を使い、複数条件を書けるよう

になる

Page 3: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

「かつ」「または」「でない」が論理演算子

Page 4: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

4論理演算子

「やさしい C 」 p.139 、 p.82

  記号 種類 使用例

論理演算子&& 論理積( AND ) x && y|| 論理和( OR ) x || y! 否定( NOT ) !x

Page 5: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

論理演算とベン図

Page 6: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

6論理演算とベン図

&& :論理積(AND)

|| :論理和 (OR) ! :否定 (NOT)

Page 7: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

7論理演算子を使ってみる

• 「やさしい C 」 p.141

Page 8: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

うるう年の判定に論理演算子を使う

Page 9: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

9うるう年の判定①

条件

• 西暦が 4 で割り切れる場合は、うるう年

• しかし、西暦が 100 で割り切れる場合は、うるう年で

はない

• ただし、西暦が 400 で割り切れる場合は、うるう年

Page 10: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

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; }

うるう年の判定プログラム

判定仕様をうまく表せていない

※ 条件の順番により得られる結果が変わるため

Page 11: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

11うるう年の判定②

条件を分けて考えると…

「 400 で割り切れる」

または

「 4 で割り切れる かつ 100 で割り切れない」

Page 12: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

12うるう年の判定③

Page 13: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

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)は同じ

Page 14: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

論理演算子の注意点

Page 15: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

15論理演算子の注意点

• 条件が長く、複雑になりやすい

• 短絡評価 ( ショートサーキット ) を意識す

Page 16: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

対処方法

Page 17: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

17長く、複雑になりやすい

対処方法

• ド・モルガンの法則で置き換える

• 要約変数を使う

Page 18: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

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 を反転させる

Page 19: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

19ド・モルガンの法則を使う②

• 未成年 かつ 成績が「優秀」でない 人

以外は A クラスにわける

–未成年: 20 歳未満

–優秀:成績が 90 点以上

Page 20: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

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; }

ド・モルガンの法則を使う③ド・モルガンの法則の適応前の場合

「よくなくなくなくない?」と同じように、

否定が多いと混乱してしまう

Page 21: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

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; }

ド・モルガンの法則を使う④ド・モルガンの法則の適応後の場合

否定の回数が減るだけで、わかりやすくなる

Page 22: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

22要約変数を使う①

• 未成年 かつ 成績が「優秀」または「平

均」の場合に、 B クラスにわける

–未成年: 20 歳未満

–優秀:成績が 90 点以上

–平均:成績が 60 点以上、 80 点未満

Page 23: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

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; }

要約変数を使う②要約変数を使わない場合

長くて、複雑でパッと見ただけでは、

何をしているかわからない

Page 24: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

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; }

要約変数を使う③要約変数を使った場合

要約変数を使うことで条件をわかりやすくする

Page 25: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

if 文 の代わりになるもうひとつの書き方

Page 26: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

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");コードが短くなるので便利

※ 状況によっては使わない方がよいときも

こういう使い方もできる

Page 27: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

27条件演算子を使う

• 「やさしい C 」 p.143

「やさしい C 」 p.143

Page 28: 10_C言語入門 - 条件分岐について(論理演算子と条件演算子)

28条件演算子を使うべきでない場合

• 条件、または真・偽の式が長くなる場合例: ans = (x == 1 && y == 1) ? getScore(x) + x * 10 : 0;

• 真・偽の式で、さらに分岐する場合例 : ans = (x == 1) ? ((y == 1) ? 1 : 2) : 3;