プログラミング入門2004

第6回[平成16年5月25日(火)]:PN04ー06.ppt
多岐選択(switch文)と
繰り返し構造
(do-while文、while文)
今日の内容
1
2
3
4
5
構造化プログラム、選択構造(if文)(復習)
論理演算子と演算子の優先順位
多岐選択構造(switch文)
繰り返し構造(do-while文、while文)
演習
皆さんのレポートから
• オープン利用室の CPad の入っているパソコンの台数
を増やしてほしい → センターに問い合わせてみます。
• ギリギリまで授業をすると、次の講義が6号館なのでつ
らい → 数分前に終了するのを目標としましょうか。あ
るいは、開始を5分ぐらい早くするとか。
• 比較的簡単でした。あと、今日ぐらいの授業のスピード
がちょうど良いです。
• 今日は時間内に終わったので良かったです。
• 授業が長いです。早く終わりたい → 90分を有効活用
• 内容が多い、資料は3枚(18スライド)ぐらいが良い。
• 簡単だったような難しかった様な感じで、何とも言い難
かったです。とにかくがんばります。
• 難しそうに感じたけれど、コツをつかめば簡単そう。
皆さんのレポートから
pptの印刷無し5人
• Ifは高校でやった時からよく分からなかったから、しっか
り復習して理解したいと思った。
→ 高校で習ったから分かる、習わなかったから分から
ない、というのはおかしい。
→ 大学で新たに学習する意気込みで勉強しよう
• If文では、何通りもの答えがあったりするから、少し頭
が混乱してしまう。 → まず基本的な考え方を理解する
• If文をもっと詳しく知りたいと思いました。elseの後ろな
どにセミコロン(;)を付けないようにしたいと思います。
• ちゃんと理解できて良かった。If文と3項演算子をしっか
り使い分けるようにしたい。
• Ifが入ってきたので、プログラムが本格的になってくる
ので、気を引き締めたやりたい → 油断大敵ですよ
復習
構造化プログラミング
• 順次構造
A
B
• 選択構造
true
判断
・二者択一、
複数場合分け
A
・if文、switch文
false
B
• 繰り返し(反復)構造
・定数回繰り返し、前判断、後判断
・for文、while文、do-while文
どの構造も入口と出口
が一つだけ
false
判断
true
A
選択構造
復習
• 条件判断によって処理を選択していく構造
• 判断の結果は
非0 : true(Yes)
または
true
false
0 : false(No)
条件
if (条件)
文1 //true
文1
文2
else
文2 //false
菱形の中:0又は非0(1)の結果を持つ式
関係演算子と等価演算子(p.42-)
復習
• 関係演算子:値の大小関係を比較する
関係成立:1(true)、不成立:0(false)
a
a
a
a
< b
<= b
> b
>= b
aがbより小さいなら 1(条件成立)
aがbより小さいか又は等しいなら 1
aがbより大きいなら 1
aがbより大きいか又は等しいなら 1
• 等価演算子:値が等しいかどうかを判定する
関係成立:1(true)、不成立:0(false)
a == b aとbが等しいなら 1
a != b aとbが等しくないなら 1
論理演算子(p.52-)
p,q は 非0(true,1)又は0(false)とする
• 論理否定演算子(!) → !p
p が非0(true,1) ならば !p は 0(false)
0(false)
1(true)
• 論理AND演算子(&&) → p && q
pとqが共に非0(true,1) の時のみ 1(true)
• 論理OR演算子(||) → p || q
pとqのいずれかが非0(true,1)なら 1(true)
演算子の優先順位:教科書177頁を常に参照
論理演算:真(○)偽(×)値表
p
q
p && q p || q !p !q
○ ○
○
○
× ×
○ ×
×
○
× ○
× ○
×
○
○ ×
× ×
×
×
○ ○
演
算
の
優
先
順
位
177
頁
順 位
高
低
種 類
論理否定
乗除演算
加減演算
関係演算
等価演算
論理 AND
論理 OR
代入
演 算 子
!
* / %
+ < > <= >=
= = !=
&&
||
=
演習
次のif文で、年齢(age)が20歳以上
かつ所持金(money)が1000円以上の
場合、に変更してみよう
if (
)
{
puts("You can drink beer");
puts("You can drink wine");
}
else
puts("You can drink juice");
演算子の優先順位
< > <= >=
==
!=
0(false)
a=1; b=2; c=3; d=4;
a != b < c
&&
1(true)
a <= b && c == d
1(true)
0(false)
||
0(false)
a == b >= c || d
0(false)0(false)
1(true)
値4は非0(true)
演習(1)
a,b,c,d,L を以下のような型と値を持つ
変数とするとき、次の論理式の値を求めよ。
double a = 5.7 ; int c = 7 ;
double b = 8.2 ; int d = 4 ;
char
L = ‘W’ ;
変数宣言の時
(1) a < b
初期値を入れる
(2) L == ‘$’
ことが出来る
(初期化)
(3) ‘q’ < ‘r’
(4) -(a-b) > 2.0
(5) (c <= d) || (a == b)
演習(2)
a,b,c,d,L を以下のような型と値を持つ
変数とするとき、次の論理式の値を求めよ。
double a = 5.7 ; int c = 7 ;
double b = 8.2 ; int d = 4 ;
char
L = ‘W’ ;
(6) !(5 == d + 1)
(7) c+d == (c ? 10 : 11)
(8) 1 || b <= 8
(9) (a > 0) && (c != 7)
(10) c*d == L - 59
演習(3)
次の数学上での条件を論理式で表現せよ
(1) x = 5
(2) x ≠ 0
(3) x ≧ 2
(4) 0 < x ≦ 10
(5) x < 0 または x > 10
(6) xは負 または 5 以上で 10 を除く値
演習(4)
西暦 y 年が閏年かどうかを表示せよ
・[yが、4で割り切れて100で割り切れないか、
400で割り切れる年が閏年である]
・『 「 y が 4 で割り切れる」 かつ
「 y が 100 で割り切れない」 』
または 『 y が 400 で割り切れる』
if( (
&&
||
else
puts("閏年だ");
puts("閏年じゃあない");
)
)
多岐選択(p.54-)
• 複数の選択肢から選ぶ
• 式の値によって処理を選択
• 選択肢は幾つあっても良い
• 以下の処理を避けるために
break文を使う
•該当する選択肢が無い場合
は、その他の処理を実行
•その他は無くても良い
break
式
値1
処理A
値2
処理B
値3
処理C
その他
処理D
switch文
• ラベルは式の取りうる値
• break により switch文を抜ける
switch (式) {
case ラベル1 : 文1 break;
case ラベル2 : 文21 文22 break;
case ラベル30 :
case ラベル31 : 文31
case ラベル32 : 文32 break;
:
default : 文n [break;]
}
defaultの部分は省略可能
switch文の例
• month を調べて、日数を days に与える
• month が 1~12 以外の時は ‘入力ミ
ス’と出力する
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("入力ミス");break;}
演習
• 入力された 年(year) と 月(month)
から、その月の 日数(days) を与えるプ
ログラム(部分)を switch文 で書け
 year と month は入力済みとする
 month を調べて days を与える
 ただし、month が 2 の時は、
year の値によって、閏年かどうかを判
断し、 days を与える
switch (month) {
case 1: case 3: case 5: case 7:
case 8: case 10: case 12:
_________; ______
case 4: ________________________
days = 30; ______
case 2:if ( _____________________
____________________
_____________________ )
days = 29;
else
days = 28; _______
_________ printf("月の入力ミス"); }
不定数回の繰り返し(反復)構造
・不定数回反復とは
繰返しの回数が、前もって分からない反復
・継続条件式が満たされている間は繰り返す
do 文 while (条件式);
do {文1 ... 文n} while (条件式);
実行したい文が複数ある→複合文,複文
while (条件式) 文
while (条件式) {文1 文2 ... 文n}
do-while文
• 継続条件式が真(true)の間は文繰り返す
do 文 while ( 条件式 );
do { 文1 ... 文n } while ( 条件式 );
k = 1;
do {
printf("A");
k = k + 1;
} while( k<=20000 );
k=1;
printf("A");
k = k + 1;
true
k<=20000
反復を繰り返す条件
false
while文
• 継続条件式が 真(true)の間は文を繰り返す
while ( 条件式 ) 文
while ( 条件式 ) {文1 文2 ... 文n}
反復を続ける条件
k = 1;
while ( k<=20000 )
{
printf("A");
k = k + 1;
}
k=1;
false
k<=20000
true
printf("A");
k = k + 1;
今回の課題
• キーボードから負の整数が入力されるまで、整
数を入力しそれらを個数を求める部分を書け。
(do-whileの場合とwhileの場合を書く)
int a, count=0;
do {
printf("整数=>");
scanf("%d",&a);
if (
) count =
} while (
);
;
提出用紙に質問・意見・感想・提案等も書いて下さい
今回の課題(do-while場合の別解)
int a, count=0;
printf("整数=>");
scanf("%d",&a);
if ( a >= 0 )
do {
;
printf("整数=>");
scanf("%d",&a);
}
今回の課題(whileの場合)
int a, cnt=0;
printf("整数=>");
scanf("%d",&a);
while (
) {
;
printf("整数=>");
scanf("%d",&a);
}
いずれの場合も結果出力の部分は省略した