プログラミング入門2003

第6回[平成15年5月29日(木)]:PN03ー06.ppt
多岐選択(switch文)と
繰り返し構造
(do文、while文)
今日の内容
1
2
3
4
5
構造化プログラム、選択構造(if文)(復習)
論理演算子と演算子の優先順位
多岐選択構造(switch文)
繰り返し構造(do文、while文)
演習
皆さんのレポートから
理解度:75%(4人)
• ちょうどよかった。比較的簡単だ。
• 演習問題は、解説を聞けば分かるのだが、自分
では、なかなか答えられない。問題を出されると、
すぐできない。
→ たくさん問題を解いて慣れていくのが良い
• 2時限目には1時限目と同じ説明をする必要はな
いと思う。2時限目は課題だけをセンターモニター
に出しておいて、実践をもっとさせるべきです。
→ 皆さんの意見を聞いてから実施しましょう。
• もう少し速くても良い。
pptの印刷を忘れず
• 復習をもう少しやってほしい。に持参して下さい!
• もっと詳しく説明してほしい。
復習
構造化プログラミング
• 順次構造
A
B
• 選択構造
true
判断
・二者択一、
複数場合分け
A
・if文、switch文
false
B
• 繰り返し(反復)構造
・定数回繰り返し、前判断、後判断
・for文、while文、do文
どの構造も入口と出口
が一つだけ
false
判断
true
A
選択構造
復習
• 条件判断によって処理を選択していく構造
• 判断の結果は
非0 : true(Yes)
または
true
false
0 : false(No)
条件
if (条件)
文1 //true
文1
文2
else
文2 //false
菱形の中:0又は非0の結果を持つ式
関係演算子と等価演算子(p.42-)
復習
• 関係演算子:値の大小関係を比較する
関係成立:1(true)、不成立:0(false)
a < b aがbより小さいなら 1(条件成
立)
a <= b aがbより小さいか等しいなら 1
a > b aがbより大きいなら 1
a
>=
b
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
演算子の優先順位:教科書177頁を常に参照
pとqのいずれかが非0(true,1)なら
論理演算:真(○)偽(×)値表
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
演算子の優先順位
< > <= >=
==
!=
0(false)
a=1; b=2; c=3; d=4;
a != b < c
&&
1(true)
a <= b && c == d
1(true)
0(false
)
a == b >= c || d
0(false)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 ... 文
do文
• 継続条件式が真(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の場合を書く)
int a, count=0;
do {
printf("整数=>");
scanf("%d",&a);
if (
) count
=
;
} while (
);
提出用紙に質問・意見・感想・提案等も書いて下さい
今回の課題(続き:do場合の別解)
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);
}
いずれの場合も結果出力の部分は省略した
P入門(第6回)は
終了です。
次回(第7回)は
6月5日
続いて、P演習に入ります。
では、しばらく休憩します。