プログラミング入門 第三回講義

プログラミング入門
第4回講義
選択(分岐) - if, switch/case データ構造とアルゴリズム(2)
プログラム制御の基本構造(4)
条件式(6)
多岐選択(11)
switch-case(14)
良くあるミス(20)
マークのあるサンプルプログラムは
/home/course/prog0/public_html/2013/lec/source/
下に置いてありますから、各自自分のディレクトリに
コピーして、コンパイル・実行してみてください
Prog-0 2013 Lec04-1
Copyright (C) 1999 - 2013 by Programming-0 Group
データ構造
データとは問題を解くために必要な情報のこと
データ構造とは データを管理する方法 のこと
1
データ構造は、変数の様々な型や組み合わせによっ
て実現される
通常の変数以外に、例えばプログラミング入門では
「配列」、後期プログラミングCでは「構造体」や「連結
リスト」などが登場する
C++,Javaなどの「オブジェクト指向言語」では
「オブジェクト」とも呼ばれる
Prog-0 2013 Lec04-2
Copyright (C) 1999 - 2013 by Programming-0 Group
アルゴリズム
アルゴリズムとは 問題を解く手順 のこと
いろいろなアルゴリズムに関して、2年前期の
「アルゴリズムとデータ構造」にて講義がある
アルゴリズムを表現するために、言葉やフロー
チャート(後述)で図示する等の方法がある
データ構造を用いてアルゴリズムを実現した
ものが プログラム である
2
3
Prog-0 2013 Lec04-3
Copyright (C) 1999 - 2013 by Programming-0 Group
プログラム制御の基本構造
連接
4
(これまで習った)
手続き(処理、文)を上から順に実行
選択(条件判断) (今日習う)
5
条件の真偽で、次の手続きを選択する
繰り返し(ループ) (次回習う)
6
繰り返し条件が真のとき、繰り返し範囲の手続き
を繰り返し実行する
プログラムは、以上3つの要素の
組み合わせで出来ている!
Prog-0 2013 Lec04-4
Copyright (C) 1999 - 2013 by Programming-0 Group
選択(if文)(p.102)
図的表現例
フローチャート(p.60)
選択(条件式の真偽による)
条件式が真の時だけ、 文を実行
7
if文の形(単文・複文)
if ( 条件式 ) 文 ;
条件式
真
偽
文(文並び)
文が複文の場合は{}で囲む
if(score >= 50) {
printf("得点は%d点でした。\n", score);
表示:“A”
printf("合格です。\n");
}
/home/course/prog0/public_html/2013/lec/source/lec04-1.c
Prog-0 2013 Lec04-5
Copyright (C) 1999 - 2013 by Programming-0 Group
条件式のポイント(p.104)
条件式の値
真 (1) または 偽 (0) を返す
条件式の構文
Cでは、0が偽、
0以外は真である。
つまり、if (0)は常に偽、
if (1), if(3)等は常に真
オペランド1 関係演算子 オペランド2
数学記号
=
≠
≧
≦
<
>
Prog-0 2013 Lec04-6
関係演算子
==
!=
>=
<=
<
>
例
a==b
a!=b
a>=b
a<=b
a<b
a>b
定数,変数,
式のこと
関係演算子の使用上の注意
1. >= を逆に =>と、 <= を =<
と書いてはいけない
2. 関係演算子の間にスペー
スを入れて、< =などと書
いてはいけない
Copyright (C) 1999 - 2013 by Programming-0 Group
条件式の拡張(p.107)
複数関係の表現
条件式の値は真または偽
真または偽を値とする演算→論理演算
8
条件式1 論理演算子 条件式2
意味 論理演算 論理演算子 演算記号
PまたはQ 論理和
OR
||
PかつQ 論理積
AND
&&
Pでない
否定
NOT
!
表現例
P || Q
P && Q
!P
(なお、否定論理演算子の場合は条件式1は不要)
Prog-0 2013 Lec04-7
Copyright (C) 1999 - 2013 by Programming-0 Group
条件式の例
if(0 <= x && x <= 100) printf(..);
もし 0≦x かつ x≦100 が真ならば、条件式が1となり 表示を実行
(つまり0≦x≦100 の時printfを実行する)
注意: if(0 <= x <= 100) とは書けない!!
if(y <= 0 || y >= 100) printf(..);
もし y≦0 または y≧100 が真ならば、条件式が1となり 表示を実行
if( !(x == 3) ) printf(..);
9
もし xが3でない(3以外) が真ならば、条件式が1となり 表示を実行
Prog-0 2013 Lec04-8
Copyright (C) 1999 - 2013 by Programming-0 Group
双岐選択if-else文(p.116)
双岐選択
条件の 真偽 で文(または複文)を選択する
10
双岐選択(if-else)の形
if ( 条件式 ) 文1 ;
else
文2 ;
例:数aの正負を判定し、aの絶対値
の2倍を求め、変数ansに代入する
if(a>0)ans=2*a;
else ans=-2*a;
(文は複文も可)
Prog-0 2013 Lec04-9
図的表現例 フローチャート
a>0
真
正:2*a
偽
負又は0:-2*a
Copyright (C) 1999 - 2013 by Programming-0 Group
双岐選択if–else文サンプル
if( a > 0 ){
ansにaの絶対値
printf("%dは正\n",a);
の2倍を代入
ans = 2 * a;
}
else {
printf("%dは負又はゼロ\n ",a);
ans = -(2 * a);
}
11
/home/course/prog0/public_html/2013/lec/source/lec04-2.c
Prog-0 2013 Lec04-10
Copyright (C) 1999 - 2013 by Programming-0 Group
更に、多岐選択のプログラミング
多岐条件文
いくつもの条件が重なり合った選択
「多岐条件文」の例(p.123~)
if
( 信号 が 青
else if( 信号 が 赤
else if( 信号 が 黄
else 信号の色の誤り;
Prog-0 2013 Lec04-11
それぞれのif-elseのペ
アを色分けしてある
) 進む;
) 止まる;
) 注意;
/*赤青黄以外*/
Copyright (C) 1999 - 2013 by Programming-0 Group
交通信号機:if~else if版(p.125)
#include <stdio.h>
main() {
int signal;
printf("0:red, 1:green, 2:yellow : ");
scanf("%d",&signal);
if(signal == 0) printf("Stop\n");
else if(signal == 1) printf("Go\n");
else if(signal == 2) printf("Be careful\n");
else printf("Look at the traffic signal\n");
}
/home/course/prog0/public_html/2013/lec/source/lec04-3.c
Prog-0 2013 Lec04-12
Copyright (C) 1999 - 2013 by Programming-0 Group
if~else if~else文の図的表現
フローチャート
if(条件式1)
偽
else if(条件式2)
偽
else if(条件式3)
真
文1
真
文2
真
文3
if(条件式1) 文1;
else if(条件式2) 文2;
else if(条件式3) 文3;
else 文4;
偽
文4
Prog-0 2013 Lec04-13
Copyright (C) 1999 - 2013 by Programming-0 Group
多岐選択のもう一つの方法-switch文-(p.117)
条件式の値が、定数式で表せるときは!!
case 2:
switch文
が便利
case 3:
case 1:
case 4:
式の値 = 3のとき、
case 3: の文を選択
switch~case
文の効果
case 5:
その他
case 6:
Prog-0 2013 Lec04-14
Copyright (C) 1999 - 2013 by Programming-0 Group
switch-case文の書式
switch(式){
case 定数式1:
文1;
文2;
…
break;
case 定数式2:
…
break;
default:
…
break;
}
Prog-0 2013 Lec04-15
式の値と定数式の値が
等しい時、「:」に続く文を選択
12
複数の文を書けるが、{}は
必要ない!
switch文か
ら抜ける
13
どのcaseとも値が
不一致のとき選択
14
default中のbreakは
なくても良い
Copyright (C) 1999 - 2013 by Programming-0 Group
入賞者の判別プログラム (p.118)
scanf("%d",&jyuni);
switch(jyuni) {
case 1:
printf("一位\n");
break;
15
case 2:
printf("二位\n");
break;
case 3:
printf("三位\n");
break;
default:
printf("残念\n");
}
Prog-0 2013 Lec04-16
変数 jyuni の値によって
1なら「一位」と表示
2なら「二位」と表示
3なら「三位」と表示
1,2,3位以外なら
「残念」と表示
Copyright (C) 1999 - 2013 by Programming-0 Group
switch~case文のポイント(1)
式の値は、整数(又は文字)
定数式の値は、整数(又は文字)
default は、必ずcase文の最後に記述
一つのswitch-case文の中で、定数式の値が等
しい複数のcase文が存在するのは誤り
16
case 1:
...
break;
case 1:
...
break;
Prog-0 2013 Lec04-17
Copyright (C) 1999 - 2013 by Programming-0 Group
switch~case文のポイント(2)
通常はcaseの最後に必ず break 文をつける。但し、意図して
つけない場合は必ずコメントにてその旨を説明しておく
17
switch(month) {
/* 以下の7つの月は同じ処理なのでbreak省略 */
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("31日まである月\n");
break;
default:
printf("短い月\n");
}
コメントとは?
「/*」と「*/」で囲まれた区間の事で、
この中に記述された事はプログラム
には影響しない。
コメントにはこの例のような注意点
などのメモや、実行方法、作者名、日
付など後で見た時にプログラムを理
解し易くする事を記載する。
/home/course/prog0/public_html/2013/lec/source/lec04-4.c
Prog-0 2013 Lec04-18
Copyright (C) 1999 - 2013 by Programming-0 Group
交通信号機:switch版(p.125)
#include <stdio.h>
main() {
見かけはif-else-if版より
int signal;
長いが、読み易い
printf("0:red, 1:green, 2:yellow : ");
scanf("%d",&signal);
switch(signal) {
case 0:
printf("Stop\n");
break;
case 1:
printf("Go\n");
break;
case 2:
printf("Be careful\n");
break;
default:
printf("Look at the traffic signal\n");
}
/home/course/prog0/public_html/2013/lec/source/lec04-5.c
}
Prog-0 2013 Lec04-19
Copyright (C) 1999 - 2013 by Programming-0 Group
良くあるミス(if編1)
{}のつけ忘れ
このprintfはif文の外なの
で、必ず実行される!
if (a != b)
a = b;
printf("a,b were not equal\n");
正しくは
if (a != b){
a = b;
printf("a,b were not equal\n");
}
Prog-0 2013 Lec04-20
Copyright (C) 1999 - 2013 by Programming-0 Group
良くあるミス(if編2)
if文の内で条件式の後ろに「;」をつけてし
まう(a != b);
if
printf("a,b were not equal\n");
正しくは
条件式に;を付けると、この
printfはif文の外になり、常
に実行!
if (a != b)
printf("a,b were not equal\n");
Prog-0 2013 Lec04-21
Copyright (C) 1999 - 2013 by Programming-0 Group
良くあるミス(if編3)
=と==の間違い
a = 0;
b = 1;
if (a = b){
printf("a,b were equal\n");
}
正しくは
条件式中のaへの代入が実行され、
条件式の値はbの値(1,真)となる。
つまりa,bの値が異なるのに「a,b were
equal」と表示されてしまう。
なお、これは文法ミスではないので、コン
パイル時にエラーにはならない。
a = 0;
b = 1;
if (a == b){
printf("a,b were equal\n");
}
Prog-0 2013 Lec04-22
Copyright (C) 1999 - 2013 by Programming-0 Group
良くあるミス(switch編1)
switch文にbreakを付け忘れる
switch(a){
case 1:
printf("a=1\n");
/* break つけ忘れ */
case 2:
printf("a=2\n");
break;
..
}
Prog-0 2013 Lec04-23
aが1の時、2つとも
表示される。
aが2の時は正常
に動作する。
Copyright (C) 1999 - 2013 by Programming-0 Group
良くあるミス(switch編2)
case文に書けるのは整定数(又は文字定数*)だけ
switch(a){
case 5.2:
printf("a>5\n");
break;
case 2:
printf("a=2\n");
break;
..
}
「case label does not reduce to an integer constant」
と言うメッセージが出てコンパイルエラーになる
Prog-0 2013 Lec04-24
*注:文字に関しては後期プロ
グラミングCにて習う
Copyright (C) 1999 - 2013 by Programming-0 Group