8_c言語入門 - 条件分岐について(if-else if-else)
TRANSCRIPT
C 言語入門~ 条件分岐について ~
( if-else if-else )
2本日の目標
• 条件分岐について覚える
• 条件によって実行する処理をかえる
プログラミングは三つの要素で構成される
4プログラミングの構成要素
順次 分岐 反復
処理 A
処理 B
処理 C処理 B 処理 B’
処理 A
処理 C
条件
処理 B
処理 C
条件
処理 A
条件に応じて処理を実行する
6条件のしくみ①
• 成績をつけるプログラム
–成績が 80 点以上なら、「 S ランク」
–成績が 80 点未満なら、「 A ランク」
「やさしい C 」 p.114
7条件のしくみ②
• 条件「成績が 80 点以上かどうか?」
真 (true) :成績が 80 点以上
偽 (false) :成績が 80 点未満
「やさしい C 」 p.114
80 点以上? S ランク
A ランク
真 :80 点以上
偽 :80 点未満
条件は比較演算子で記述する
9比較演算子(関係演算子とも呼ぶ)
「やさしい C 」 p.116
記号 種類 使用例
比較演算子
> より大きい x > y>= 以上 x >= y< より小さい x < y
<= 以下 x <= y== 等価 X == y!= 非等価 X != y
条件に当てはまるときだけ実行する
11条件によって実行①
「やさしい C 」 p.118
点数を入力するscanf(“%d”, &score)
80 点以上?80 <= score
ランクを表示するprintf(“S ランクです。” )
エンド
スタート
偽( false )80 点未満
真( true )80 点以上
「ランクを表示する」は、入力した点数が
80 点以上の場合のみ実行される
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 点以上かどうか?
13if 文をつかう
• 「やさしい C 」 p.119 – 124• 基本的に “ { }” は省略しない!
• “ { } ” を省略しても良いときは、
のように 1 行で書くときだけ
「やさしい C 」 p.119-124
if (80 <= score) printf(“S ランクです。 \n”);
このままでは「 A ランク」を表示できない
条件が「偽」のときは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 点未満の場合に実行される
17else をつかう②
• 「やさしい C 」 p.127
「やさしい C 」 p.127
80 点未満、 60 点以上なら「 A ランク」を表示したいそれ以外は「 B ランク」
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 点未満のみ実行される
if 文を入れ子にするとわかりにくくなる
わかりやすくするためにelse if をつかう
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 をつかう
23else if をつかう②
• 「やさしい C 」 p.129
「やさしい C 」 p.129
演習問題
25演習問題(再登場)
• 整数を入力し、偶数なら「 even 」、奇数なら「 add 」
と表示する(ファイル名: ex08-01.c )
• ふたつの整数を入力し、大きい方を表示する。ただし、
ふたつの値が同じなら「 equal 」を表示する (ファイル名: ex08-02.c )
26演習問題(再登場)
• うるう年判定 (ファイル名: ex08-03.c )
– 西暦が 4 で割り切れる場合は、うるう年
– 西暦が 100 で割り切れる場合は、うるう年ではない
– しかし、西暦が 400 で割り切れる場合は、うるう年
うるう年 ・ 2004 年 ・ 2000 年 ・ 1600 年
平年 ・ 2015 年 ・ 1900 年 ・ 2100 年
27演習問題①
• 単位の変換を行う(ファイル名: ex08-04.c )
– 距離と単位を入力し、すべての距離を mm に換算して出力してください。
– 入力される距離の単位は• k … キロメートル• m … メートル• c … センチメートル
• 入力例– 1– k
• 出力例– 1000000 mm
28演習問題②
• 逆ポーランド記法の計算機をつくる(ファイル名: ex08-05.c )
–ふたつの値と演算子 (+, -, *, /) を入力し、
計算結果を表示する
–ヒント:値は整数型、演算子は文字型例:
入力「 1 」「 2 」「 + 」 → 1 + 2 → 出力「 3 」
入力「 10 」「 20 」「 * 」 → 10 * 20 → 出力「 200 」
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; }
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 ポイント
31特別問題②
• 整数値( 1 ~ 26 )を入力し、入力された値までの文字を表示する
• 入力例– 7
• 出力結果– a, b, c, d, e, f, g
32特別問題③
• 100 番目の素数を表示する
ヒント:まずは素数を表示する処理から
• 入力された値の階乗( n! )を表示する
33特別問題④
• 数当てゲーム• 条件:
1. ある数字 (1 ~ 50) と入力値が同じ場合は「正解」と表示2. ある数字より入力値が小さい場合は、「もっと大きい」と表
示3. ある数字より入力値が大きい場合は、「もっと小さい」と表
示4. 5 回以内に正解しないと、「残念」と表示
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 」を取得してしまう
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; }
ここに測定したい処理を記述する
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)) を書かないと、毎回同じ値になってしまうので注意