文1 - tsukuba.ac.jp

応用理工学情報処理
第3回(2015年10月19日)
Manaba
https://manaba.tsukuba.ac.jp
の応用理工学情報処理のページ
授業のHP
http://www.ims.tsukuba.ac.jp/~maeshima/joho
1
第3章
プログラムの流れの分岐
2
分岐 とは
今までのプログラム例
変数 a
を宣言
aに値
を代入
流れが一直線
分岐を含むプログラム
変数 a
を宣言
aに値
を代入
作業Bを行う
どんな場合でも同じ作業
aが条件を満たす場合
作業Bを行う
aを評価
作業Cを行う
条件を満たさない場合
流れが二つに分かれる(分岐)
場合によって、作業内容を変える
3
if
(p.42)
#include <stdio.h>
int main(void)
{
int no;
printf("整数を入力してください : ");
scanf("%d", &no);
noを5で割った場合の余りが0でない場合に
実行される
if (no % 5)
puts("その数は5で割り切れません。");
return 0;
}
4
if
if (式)
文1;
指定した条件に合えば
文1を実行する。
式(制御式)を評価して
その値が非0
指定した条件に合う
(式を評価する = 式を計算する )
1,2,3,4 (5で割り切れない場合)
puts(“割り切れません。”)
no % 5
0 (5で割り切れる場合)
なにもしない
5
if-else
(p.45)
#include <stdio.h>
int main(void)
{
int no;
printf("整数を入力してください : ");
scanf("%d", &no);
noを2で割った場合の余りが0でない場合に
実行される
if (no % 2)
puts("その数は奇数です。");
else
puts("その数は偶数です。");
return 0;
noを2で割った場合の余りが0の場合に
実行される
}
6
if-else
if (式)
文1
else
文2
指定した条件(式で表現)に合
えば文1を、合わなければ文
2を実行する。
条件に合うかどうかは、式の値が非0か0か
で判定
1 (2で割り切れない)
文1
puts(“noは奇数”)
no % 2
0 (2で割り切れる)
文2
puts(“noは偶数”)
7
式
(p.27)
1. 変数、定数を演算子で結合したもの
2. 変数、定数それ自体
式の値 = 式の計算結果、
もしくは値それ自身
式の例
1. no%2
2. num
3. 56(定数)
使うことは
ほとんどない
式の値
=no%2の
計算結果
式の値
=numの値
式の値
=定数の値
(この場合 56)
8
if文(式の評価)
(p.46)
if (num)
文1
else
文2
#include <stdio.h>
int main(void)
{
int num;
numの値を評価する
printf("整数を入力してください : ");
scanf("%d",&num);
if (num)
puts("その値は0ではありません。");
else
puts("その値は0です。");
num ≠0
文1
num = 0
文2
return 0;
}
ただ
条件判定 = 式の値の評価
とする考え方は少し分かりにくい。
9
等価演算子
==
二つの値が等しいかどうかを判定
例: x1 == x2
• x1とx2が等しければ
式
x1 == x2
• x1とx2が等しくなければ 式
if (x1==x2)
文1
else
文2
の値は1
の値は0
式 x1 == x2 の値を評価する
1 (等しい)
文1
0 (等しくない)
文2
10
等価演算子の利点
式の値が 0 か 非0 か、など考える必要はない。
命題が”真”か”偽”か
if (x1==x2)
文1
else
文2
“x1とx2は等しい”という命題は真か偽か?
(もしくは”x1とx2は等しいですか?”という問い)
真 (等しい) 又は
偽 (等しくない) 又は
問いに対する答えがYES
問いに対する答えがNO
文1
!=
• x1とx2が等しくなければ 命題
• x1とx2が等しければ
命題
文2
x1 != x2
は真
は偽
11
等価演算子
(p.48)
#include <stdio.h>
int main(void)
{
int n1, n2;
puts("二つの整数を入力してください。");
printf("整数1 : "); scanf("%d", &n1);
printf("整数2 : "); scanf("%d", &n2);
if (n1 == n2)
puts("それらの値は同じです。"); n1とn2の値が等しい場合
else
puts("それらの値は違います。"); 等しくない場合
return 0;
}
12
等価演算子を用いて
偶奇判定(p.45)のプログラムを書き直す(p.49 List 3-8改変)
#include <stdio.h>
int main(void)
{
int no;
printf("整数を入力してください : ");
scanf("%d", &no);
noを2で割った場合の余りが0の場合に
実行される
if ( (no % 2) ==0 )
puts("その数は偶数です。");
else
puts("その数は奇数です。");
return 0;
noを2で割った場合の余りが0でない場合に
実行される
}
こちらのほうが読みやすい (という人がいるかも知れない)
重要: 自分が読みやすいプログラムを書きましょう
13
関係演算子
大小関係を判定する
•a<b
•a>b
• a <=b
• a >=b
aがbよりも小さければ1, そうでなければ0
aがbよりも大きければ1, そうでなければ0
aがb以下ならば1,
そうでなければ0
aがb以上ならば1,
そうでなければ0
関係演算子についても、式の値ではなく、命題が”真”か”
偽”か、と考えるほうが分かりやすい。
“a>b”は真か偽か?
if (a>b)
文1
else
文2
真(a>b)
文1
偽(a=bまたはa<b)
文2
14
関係演算子
(p.50)
#include <stdio.h>
int main(void)
{
int no;
printf("整数を入力してください : ");
scanf("%d", &no);
if (no == 0)
puts("その値は0です。");
else if( no >0 )
puts("その値は正です。");
else
puts("その値は負です。");
return 0;
}
15
演習問題
二つの整数値を読み込んで、後者が前者の約数であるか、そうでないかを
表示するプログラムを作成せよ (教科書p.45 演習3-1)。
つまり
2つの整数を読み込み(読み込んだ順に n1, n2とする)
n1÷n2
が割り切れるかどうかを判定してください。
•
演習問題の提出・出席確認について
• 授業中にプログラムが完成した方は申し出てください。プログラ
ムの確認・出席の確認を同時に行います。完成が確認できた方
は退出しても構いません。
• 授業終了10分前(16:20)の時点でプログラムが未完成の方も、
申し出てください。出席の確認のみを行います。
• 授業終了までにプログラムを完成できなかった方は第4回目の
授業の際に確認を行いますので、それまでに完成させておいて
ください。
16