8_c言語入門 - 条件分岐について(if-else if-else)

36
C 言言言言 言言言言言言言言 if-else if-else

Upload: bcrikko

Post on 12-Feb-2017

668 views

Category:

Education


5 download

TRANSCRIPT

Page 1: 8_C言語入門 - 条件分岐について(if-else if-else)

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

( if-else if-else )

Page 2: 8_C言語入門 - 条件分岐について(if-else if-else)

2本日の目標

• 条件分岐について覚える

• 条件によって実行する処理をかえる

Page 3: 8_C言語入門 - 条件分岐について(if-else if-else)

プログラミングは三つの要素で構成される

Page 4: 8_C言語入門 - 条件分岐について(if-else if-else)

4プログラミングの構成要素

順次 分岐 反復

処理 A

処理 B

処理 C処理 B 処理 B’

処理 A

処理 C

条件

処理 B

処理 C

条件

処理 A

Page 5: 8_C言語入門 - 条件分岐について(if-else if-else)

条件に応じて処理を実行する

Page 6: 8_C言語入門 - 条件分岐について(if-else if-else)

6条件のしくみ①

• 成績をつけるプログラム

–成績が 80 点以上なら、「 S ランク」

–成績が 80 点未満なら、「 A ランク」

「やさしい C 」 p.114

Page 7: 8_C言語入門 - 条件分岐について(if-else if-else)

7条件のしくみ②

• 条件「成績が 80 点以上かどうか?」

真 (true) :成績が 80 点以上

偽 (false) :成績が 80 点未満

「やさしい C 」 p.114

80 点以上? S ランク

A ランク

真 :80 点以上

偽 :80 点未満

Page 8: 8_C言語入門 - 条件分岐について(if-else if-else)

条件は比較演算子で記述する

Page 9: 8_C言語入門 - 条件分岐について(if-else if-else)

9比較演算子(関係演算子とも呼ぶ)

「やさしい C 」 p.116

  記号 種類 使用例

比較演算子

> より大きい x > y>= 以上 x >= y< より小さい x < y

<= 以下 x <= y== 等価 X == y!= 非等価 X != y

Page 10: 8_C言語入門 - 条件分岐について(if-else if-else)

条件に当てはまるときだけ実行する

Page 11: 8_C言語入門 - 条件分岐について(if-else if-else)

11条件によって実行①

「やさしい C 」 p.118

点数を入力するscanf(“%d”, &score)

80 点以上?80 <= score

ランクを表示するprintf(“S ランクです。” )

エンド

スタート

偽( false )80 点未満

真( true )80 点以上

「ランクを表示する」は、入力した点数が

80 点以上の場合のみ実行される

Page 12: 8_C言語入門 - 条件分岐について(if-else if-else)

12条件によって実行②入力するプログラム

#include <stdio.h>   int main(void) { int score; printf(" 点数を入力してください >> "); scanf("%d", &score);

if (80 <= score) { printf(“S ランクです。 \n”); }

return 0; }

ひとつのプログラムの中では 不等号の向きを統一すると可読性が上がる!

一般的に「 < 」や「 <= 」がよく使われる

score が 80 点以上の場合のみ実行される

入力された値( score )が80 点以上かどうか?

Page 13: 8_C言語入門 - 条件分岐について(if-else if-else)

13if 文をつかう

• 「やさしい C 」 p.119 – 124• 基本的に “ { }” は省略しない!

• “ { } ” を省略しても良いときは、

のように 1 行で書くときだけ

「やさしい C 」 p.119-124

if (80 <= score) printf(“S ランクです。 \n”);

Page 14: 8_C言語入門 - 条件分岐について(if-else if-else)

このままでは「 A ランク」を表示できない

Page 15: 8_C言語入門 - 条件分岐について(if-else if-else)

条件が「偽」のときはelse をつかう

Page 16: 8_C言語入門 - 条件分岐について(if-else if-else)

16else をつかう①入力するプログラム

#include <stdio.h>   int main(void) { int score; printf(" 点数を入力してください >> "); scanf("%d", &score);

if (80 <= score) { printf(“S ランクです。 \n”); } else { printf(“A ランクです。 \n”); }

return 0; }

score が 80 点以上 “以外” の場合に実行される

≒ 80 点未満の場合に実行される

Page 17: 8_C言語入門 - 条件分岐について(if-else if-else)

17else をつかう②

• 「やさしい C 」 p.127

「やさしい C 」 p.127

Page 18: 8_C言語入門 - 条件分岐について(if-else if-else)

80 点未満、 60 点以上なら「 A ランク」を表示したいそれ以外は「 B ランク」

Page 19: 8_C言語入門 - 条件分岐について(if-else if-else)

1980 点未満、 60 点以上①入力するプログラム

#include <stdio.h>   int main(void) { int score; printf(“ 点数を入力してください >> ”); scanf("%d", &score);

if (80 <= score) { printf("S ランクです。 \n"); } else { if (60 <= score) { printf("A ランクです。 \n"); } else { printf("B ランクです。 \n"); } } return 0; }

if 文は入れ子にできる80 点未満、 60 点以上のみ実行され

80 点未満で、さらに 60 点未満のみ実行される

Page 20: 8_C言語入門 - 条件分岐について(if-else if-else)

if 文を入れ子にするとわかりにくくなる

Page 21: 8_C言語入門 - 条件分岐について(if-else if-else)

わかりやすくするためにelse if をつかう

Page 22: 8_C言語入門 - 条件分岐について(if-else if-else)

22else if をつかう①入力するプログラム

#include <stdio.h>   int main(void) { int score; printf(“ 点数を入力してください >> ”); scanf("%d", &score);

if (80 <= score) { printf("S ランクです。 \n"); } else if (60 <= score) { printf("A ランクです。 \n"); } else { printf("B ランクです。 \n"); } return 0; }

80 点未満、 60 点以上の場合、真 (true) になる

複数条件ある場合は、 else if をつかう

Page 23: 8_C言語入門 - 条件分岐について(if-else if-else)

23else if をつかう②

• 「やさしい C 」 p.129

「やさしい C 」 p.129

Page 24: 8_C言語入門 - 条件分岐について(if-else if-else)

演習問題

Page 25: 8_C言語入門 - 条件分岐について(if-else if-else)

25演習問題(再登場)

• 整数を入力し、偶数なら「 even 」、奇数なら「 add 」

と表示する(ファイル名: ex08-01.c )

• ふたつの整数を入力し、大きい方を表示する。ただし、

ふたつの値が同じなら「 equal 」を表示する (ファイル名: ex08-02.c )

Page 26: 8_C言語入門 - 条件分岐について(if-else if-else)

26演習問題(再登場)

• うるう年判定 (ファイル名: ex08-03.c )

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

– 西暦が 100 で割り切れる場合は、うるう年ではない

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

うるう年 ・ 2004 年 ・ 2000 年 ・ 1600 年

平年 ・ 2015 年 ・ 1900 年 ・ 2100 年

Page 27: 8_C言語入門 - 条件分岐について(if-else if-else)

27演習問題①

• 単位の変換を行う(ファイル名: ex08-04.c )

– 距離と単位を入力し、すべての距離を mm に換算して出力してください。

– 入力される距離の単位は• k … キロメートル• m … メートル• c … センチメートル

• 入力例– 1– k

• 出力例– 1000000 mm

Page 28: 8_C言語入門 - 条件分岐について(if-else if-else)

28演習問題②

• 逆ポーランド記法の計算機をつくる(ファイル名: ex08-05.c )

–ふたつの値と演算子 (+, -, *, /) を入力し、

計算結果を表示する

–ヒント:値は整数型、演算子は文字型例:

入力「 1 」「 2 」「 + 」 → 1 + 2 → 出力「 3 」

入力「 10 」「 20 」「 * 」 → 10 * 20 → 出力「 200 」

Page 29: 8_C言語入門 - 条件分岐について(if-else if-else)

29演習問題③

• じゃんけんゲームをつくる(ファイル名: ex08-06.c )

– 0: グー、 1: チョキ、 2: パー

–勝敗を表示する(勝ち or 負け or あいこ)

#include <stdio.h> #include <stdlib.h> #include <time.h>

  int main(void){ int me; // 自分 ( 入力する ) int cpu; // コンピュータ

srand(time(NULL)); cpu = rand() % 3;

// ここに処理を書く   return 0; }

Page 30: 8_C言語入門 - 条件分岐について(if-else if-else)

30特別問題①• ポイントカードの計算

– とあるスーパーマーケットのレシートが山ほどあります。このスーパーマーケットにはポイントカードが導入されており、買い物の購入金額に応じたポイントが貯まります。加算されるポイントは次の三つのルールに従います。

1. 通常は、購入金額の 1% とする(小数点以下切り捨て)2. ただし、 10 で割り切れる日は、購入金額の 3% とする(小数点以下切り捨て)3. ただし、 15 で割り切れる日は、購入金額の 5% とする(小数点以下切り捨て)

– ポイントを計算するプログラムをつくってください。現在保有しているポイントは 0 ポイントです。

• 入力される値– N // レシートの枚数– n 枚目のレシートの日付– N 枚目の購入金額

• 入力例– 3 // レシートの枚数– 1 // 1 枚目のレシートの日付– 1000 // 1 枚目のレシートの購入金額– 10 // 2 枚目のレシートの日付 – 2000 // 2 枚目のレシートの購入金額– 30 // 3 枚目のレシートの日付– 3000 // 3 枚目のレシートの購入金額

• 出力結果– 220 ポイント

Page 31: 8_C言語入門 - 条件分岐について(if-else if-else)

31特別問題②

• 整数値( 1 ~ 26 )を入力し、入力された値までの文字を表示する

• 入力例– 7

• 出力結果– a, b, c, d, e, f, g

Page 32: 8_C言語入門 - 条件分岐について(if-else if-else)

32特別問題③

• 100 番目の素数を表示する

ヒント:まずは素数を表示する処理から

• 入力された値の階乗( n! )を表示する

Page 33: 8_C言語入門 - 条件分岐について(if-else if-else)

33特別問題④

• 数当てゲーム• 条件:

1. ある数字 (1 ~ 50) と入力値が同じ場合は「正解」と表示2. ある数字より入力値が小さい場合は、「もっと大きい」と表

示3. ある数字より入力値が大きい場合は、「もっと小さい」と表

示4. 5 回以内に正解しないと、「残念」と表示

Page 34: 8_C言語入門 - 条件分岐について(if-else if-else)

34getchar で文字が取得できない場合

#include <stdio.h>   int main(void) { int number; char character;

scanf("%d", &number);

fflush(stdin); // ← バッファのデータを吐き出す character = getchar();

return 0; }

scanf で入力した Enter (改行: \n )をバッファから吐き出す。

これをしないと、getchar で文字を取得する前に、

「 \n 」を取得してしまう

Page 35: 8_C言語入門 - 条件分岐について(if-else if-else)

35プログラムの性能を測る場合

#include <stdio.h> #include <time.h> // 現在時刻取得のため   int main(void) { clock_t start, end; start = clock();

// いろんな処理

end = clock();

printf(" 性能: %d[ms]\n", end - start);

return 0; }

ここに測定したい処理を記述する

Page 36: 8_C言語入門 - 条件分岐について(if-else if-else)

36

#include <stdio.h> #include <stdlib.h> // ランダム値を生成するため #include <time.h> // ランダム値を生成するため   int main(void) { int random; srand(time(NULL)); // ランダム値生成のシード値を設定

random = rand(); // ランダム値の生成

return 0; }

ランダム値を取得する場合

rand() を使うとランダム値を取得できる

※ srand(time(NULL)) を書かないと、毎回同じ値になってしまうので注意