文 1

応用理工学情報処理
第4回(2015年10月26日)
manaba
https://manaba.tsukuba.ac.jp
の応用理工学情報処理のページ
授業のHP
http://www.ims.tsukuba.ac.jp/~maeshima/joho
1
第3章
プログラムの流れの分岐(続き)
2
if文の入れ子構造
(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;
}
3
if文の入れ子構造
入れ子になったif文
if (式1)
文1
else if(式2)
文2
else
文3
真(非0)
右のように
考える
if (式1)
文1
else
if(式2)
文2
else
文3
1. 式1が真なら
文1を実行して終了
2. 式1は偽だけど
式2が真なら
文2を実行して終了
3. 式1も式2も偽なら
文3を実行して終了
文1
真(非0)
式1
文2
偽(0)
式2
偽(0)
文3
4
if文の入れ子構造2
(p.52)
#include <stdio.h>
int main(void)
{
int no;
printf("整数を入力してください : ");
scanf("%d", &no);
if (no > 0)
if( no%2 == 0 )
puts(“その数は偶数です。");
else
puts(“その数は奇数です。");
else
puts(“正でない値が入力されました。\a\n");
return 0;
if (式1)
if(式2)
文1
else
文2
else
文3
}
5
if文の応用(三値の最大値)
(p.55)
#include <stdio.h>
int main(void)
{
int n1, n2, n3, max;
puts("三つの整数を入力してください。");
printf("整数1 : "); scanf("%d", &n1);
printf("整数2 : "); scanf("%d", &n2);
printf("整数3 : "); scanf("%d", &n3);
max=n1;
if (n2 > max) max = n2;
if (n3 > max) max = n3;
printf("最大値は%dです。\n", max);
return 0;
}
6
三値の最大値
複数の整数の中の最大値を求める
(if文の応用の一つ)
1. n1最大
2. n2最大
3. n3最大
max=n1;
max=n1;
max=n1;
max=n1;
if (n2 > max) max = n2;
max=n1;
max=n2;
max=n2;
if (n3 > max) max = n3;
max=n1;
max=n2;
max=n3;
(n2>n1の場合)
更に多くの整数や実数の中の最大・最小を求めるには
繰り返し(第4章)と配列(第5章)を使います。
7
条件演算子
(p.56)
#include <stdio.h>
int main(void)
{
int n1,n2,max;
puts("二つの整数を入力してください。");
printf("整数1 :"); scanf("%d",&n1);
printf("整数2 :"); scanf("%d",&n2);
max =
(n1 > n2) ? n1 : n2;
printf("大きい方の値は %d です。\n", max);
return 0;
}
8
条件演算子: ifを使わない分岐
式1 ? 式2 : 式3;
max =
(n1 > n2) ? n1 : n2;
式1の値を評価する
非0 (真、n1>n2)
式2が右辺
の値となる
max=n1
(n1>n2 は真か偽か)
0 (偽, n1<n2またはn1=n2)
式3が右辺
の値となる
max=n2
条件によって、変数に異なる値を代入したい場合に使う
9
条件演算子
(p.57改変)
#include <stdio.h>
int main(void)
{
int n1,n2, sa;
n1>n2 は真か偽か
真(n1>n2)
偽(n1<n2)
sa=n1-n2
sa=n2-n1
puts("二つの整数を入力してください。");
printf("整数1 :"); scanf("%d",&n1);
printf("整数2 :"); scanf("%d",&n2);
sa = (n1 > n2) ? n1 - n2 : n2 - n1;
printf("それらの差は %d です。\n", sa );
return 0;
}
結局
sa = | n1 – n2 |
を計算
10
複合文
複数の文の並びを{}で囲んだもの
{
や
{
文1; 文2; }
文1;
文2;
}
if文などで、複数の処理をしたい場合に使う
if (制御式) {
文1;
文2;
} else {
文3;
文4;
}
一つの文だけの場 if (制御式) {
合でも使ってよい。
文1;
} else {
文2;
}
11
複合文(p.58)
#include <stdio.h>
int main(void)
{
int n1, n2, max, min;
puts("二つの整数を入力してください。");
printf("整数1:"); scanf("%d",&n1);
printf("整数2:"); scanf("%d",&n2);
printf("大きい方の値は %d です。\n", max);
printf("小さい方の値は %d です。\n", min);
return 0;
}
if ( n1 > n2) {
max = n1;
min = n2;
}else{
max = n2;
min = n1;
}
12
論理演算子
複数の条件によって場合分けを行う。
•論理AND演算子
A
&& B
AとBが同時に成立すれば
真(値は1)
成立しなければ 偽(値は0)
“ A かつ B” が真か偽かを判定するために使う。
•論理OR演算子
A
|| B
AとBのいずれか一方が成立すれば
両方とも成立しなければ
真(1)
偽(0)
“A または B” が真か偽かを判定するために使う。
13
論理演算子(p.61)
#include <stdio.h>
int main(void)
{
int month;
printf("何月ですか:");
scanf("%d",&month);
if (month >= 3 && month <= 5 )
printf(“%d月は春です。\n“, month);
else if (month >= 6 && month <= 8 )
printf(“%d月は夏です。\n“, month);
else if (month >= 9 && month <= 11 )
printf(“%d月は秋です。\n“, month);
else if (month == 1 || month == 2 || month == 12 )
printf(“%d月は冬です。\n“, month);
else
printf(“%d月はありませんよ!!\a\n“, month);
return 0;
}
14
ifを使わない分岐: switch文
プログラムの流れを複数に分岐させる
switch (num %3){
case 0 : 文1; break;
case 1 : 文2; break;
case 2 : 文3; break;
}
num%3の値を評価する
num % 3 = 0
num % 3 = 1
num % 3 = 2
switchを使った方が便利な場合:
単一の式の値(num%3など)によって、場合分け
ができる場合
文1
文2
文3
break
次の処理
15
switch文
(p.65)
#include <stdio.h>
int main(void)
{
int no;
printf("整数を入力してください:");
scanf("%d",&no);
switch
case
case
case
}
( no % 3 ) {
0 : puts(“その数は3で割り切れます。”);
break;
1 : puts("その数を3で割った余りは1です。"); break;
2 : puts("その数を3で割った余りは2です。"); break;
return 0;
}
16
breakとdefault
• breakはswitch文の外に出る役割を持つ(switch文では
breakを使わない限り外に出ずに下の文を実行し続ける)。
• defaultはどのcaseにも一致しない場合実行。
swの値を評価する
switch (sw) {
case 1 : 文1;
case 2 : 文2; break;
case 3 : 文3; break;
default : 文4; break;
}
sw = 1
文1
sw = 2
文2
sw = 3
それ以外
文3
文4
次の処理
17
breakとdefault (p.66改 )
#include <stdio.h>
int main(void)
{
int sw;
printf("整数を入力してください: ");
scanf(“%d”, &sw);
switch (sw) {
case 1 : puts("A");
case 2 : puts("B"); break;
case 3 : puts("C"); break;
default : puts("D"); break;
}
return 0;
実行例1
整数を入力してください: 1
A
B
実行例2
整数を入力してください: 2
B
}
18
演習問題
1.
3つの整数値を読み込み、その中の最小値を出力するプログラムを作
成せよ。但し、if文を用いずに条件演算子を用いること。
2.
教科書List 3-4(p.45)のプログラム(一つの整数値を読み込み、それが
奇数か偶数かを判定する)を、if文ではなくswitch文を用いて書き換え
よ(教科書p.67 演習3-12)。
演習問題の提出・出席確認について
• 授業中にプログラムが完成した方は申し出てください。プログラムの確
認・出席の確認を同時に行います。完成が確認できた方は退出しても
構いません。
• 授業終了10分前(16:20)の時点でプログラムが未完成の方も、申し出て
ください。出席の確認のみを行います。
• 授業終了までにプログラムを完成できなかった方は次回の授業の際に
確認を行いますので、それまでに完成させておいてください。
19