条件分岐
情報処理演習（テキスト：第7章）

今日の内容制御構造
2. 条件分岐（if - else 文）
3. 比較演算
4. else - if を用いた多分岐
5. if 文の入れ子
6. 論理演算
7. switch 文
8. 今日の練習問題
第1回C言語レポート課題の出題
1.

1. 制御構造
 文は置かれた順に実行される．

 上から下
 同じ行内であれば，左から右 制御構造によって，条件分岐や反復をおこなうことができる．
条件分岐
if - else 文，switch 文
反復for 文，while 文

2. 条件分岐
 数値の平方根を求めるプログラム

 根号の中の数字が正の数のときは平方根を求めることがでいる．
 根号の中の数字が負の数のときは平方根を求めることができない．

与えられた数値が正の数であるかを調べてから計算する．

正の数 → 計算する．
負の数 → 計算できないことを表示する．

if - else 文（テキスト71ページ）

T : 真（条件が成立）
F : 偽（条件が不成立）

if ( 条件式 ) {ブロックA}
else {
ブロックB}

条件式TF
ブロックB

ブロックA

 「条件式」が成り立てばブロックＡを，成り立たなければブロックＢを実行
 ブロックは単文でも複文でも可能 else以下は省略可能

if - else 文の使用例#include <stdio.h>sqrt関数を使うために必要#include <math.h>int main(int argc, const char * argv[]) {double x;
double y;
条件式
printf("x = ");scanf("%lf", &x);
条件が成り立つif ( x < 0 ) {場合に実行されprintf("負なので計算できません\n");る部分}
else {
条件が成り立たy = sqrt(x);ない場合に実行printf("sqrt(%f) = %f\n", x, y);される部分}
return 0;}

3. 比較演算

（テキスト69ページ）

 条件式の中には，比較演算や論理演算を書く．

演算子
<<=>
>=
==!=

意味
左辺が右辺より小さい
左辺が右辺以下
左辺が右辺より大きい
左辺が右辺以上
左辺が右辺と等しい
左辺が右辺と等しくない

等号を2つ続ける比較演算の例「左辺が右辺以上」の意味
if(age >= 20 ){printf("You may drink alcoholic beverage.");}else{
printf("You must not drink alcoholic beverage.");}4. else - if を用いた多分岐（テキスト75ページ）

if ( 条件式１ ) {ブロックA}else if( 条件式２ ) {ブロックB}
else {
ブロックC}
ブロックA，ブロックB，ブロックCのうち，いずれか1つが実行される．

条件式１TF
条件式２FブロックC

ブロックAT
ブロックB

多分岐の例#include <stdio.h>
int main(int argc, const char * argv[]) {int a;printf("年齢を入力してください：");scanf("%d", &a);
if ( a >= 18 ) {printf("大人料金1,000円\n");A}else if( a >= 12 ) {printf("中・高生料金800円\n");B}else {
Cprintf("子供料金500円\n");}return 0;}

このうちの１つが実行される．

5. if 文の入れ子
 if - else 文のブロックの中に if - else 文を記述しても構わない．
if ( 条件式１ ) {if ( 条件式２ ) {ブロックA}
ブロックB}
else {ブロックC}

条件式１FT
条件式２F
ブロックC

ブロックB

TブロックA

6. 論理演算（テキスト69ページ）

 真，偽に関する論理的な演算を行う．

演算子

意味A && B

A かつ BA ¦¦ B

A または B!A

Aでない
AやBは条件式である

比較演算と論理演算の組み合わせ
論理演算子

例）
if ( ( m == 1 ) ¦¦ ( m == 2 ) ) {y = y – 1;m = m + 12;}

比較演算子
m が 1 または m が 2 の時に限り実行

月の最後の日を表示するプログラム#include <stdio.h>/* 入力した月の日数を表示する */int main(int argc, const char * argv[]) {int month, days;
printf("日数を知りたい月は？ ");scanf("%d", &month);if (month == 2){ /* 2月のとき */days = 28;}
else if((month==4) ¦¦ (month==6) ¦¦ (month==9) ¦¦ (month==11)){/* 4,6,9,11月のとき */days = 30;}else{ /* それ以外の月のとき */days = 31;}
printf("%d月は%2d日です\n", month, days);return 0;}

7. switch 文（テキスト78ページ）

switch ( 条件式 ) {case 定数式１：ブロックA
case 定数式２：ブロックB

default：ブロックC}
 条件式が定数式と一致する場合，その後のブロックを break または「}」が現れるまで実行 ブロックは単文でも複文でも可能
 どの case にも当てはまらない場合は，default 以
下を実行（省略も可能）switch 文の使用例#include <stdio.h>
int main(int argc, const char * argv[]) {int a;
printf("選択してください\n");printf("\t大人＝1\n\t中・高生＝2\n\t子供＝3\n\t\t：");scanf("%d", &a);
switch (a) {case 1:printf("大人料金1,000円\n");break;
case 2:
printf("中・高生料金800円\n");break;
default:
printf("子供料金500円\n");}return 0;}

月の最後の日を表示するプログラム(2)#include <stdio.h>/* 入力した月の日数を表示する */int main() {int month, days;
printf("日数を知りたい月は？");scanf("%d", &month);switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:days = 31;
break;

case 4:case 6:case 9:case 11:days = 30;
break;
case 2:days = 28;
break;
default:}
printf("%d月は%2d日です.",
month, days);}8. 今日の練習問題(1)LevelCCBA問題
1つの整数を入力すると，その絶対値を表示するプログラムを作成せよ(abs関数は使わないこと)．
１つの整数を入力すると，その平方根を表示するプログラムを作成せよ．
7.5練習問題3のプログラムを作成せよ．
7.5練習問題9のプログラムを作成せよ．

今日の練習問題(2) ２次方程式 ax2 + bx + c = 0 の解を求めるプログラムを作りなさい．
 重解を正しく表示しなさい．
 実数解を持たない場合は，「実数解なし」と表示しなさい．
（判別式 b2 - 4ac の値で条件分岐する．）
 解が２つあるので，変数「x1」と「x2」に値を代入する．
 2次方程式の解の公式は下のとおり−b + b 2 − 4ac
x1 =2a−b − b 2 − 4ac
x2 =2a第1回C言語レポート課題
課題： 条件判定を利用したプログラムを作成する
形式： プログラムだけを提出するのではなく，プログラムの説明を書くこと．実行結果をキャプチャして貼付けること．
問題： テキスト pp.80~82の練習問題から１つ以上を選んで答えなさい〆切： クラスによって案内がある