Document

C言語
第7講
生物機能制御学講座 濱田
農学部7号館209室
1
本日の講義内容
•
•
•
•
おさらい
論理演算子 ・ switch 文
何度も繰り返す
テキスト Lesson 6
プログラムの作成
アンケート
2
アンケート結果
質問および要望
1.セグメント例外って? scanf(”%f”,&a)
2.乱数のしくみは?
3.switch構文でdefault文をつかわなくて
もよいか? → OK!
4.問題の占いで、毎回、「大吉」がでる!
→ 乱数? switch(変数)?
5.うぅ~ん、むずかしい
! 4名
6.今回はわかった! 7名
3
論理演算
離散系の数学において
A
B
A or B
if文などの条件式に
論理演算を用いると、汎用性の
高いプログラムができる!
Here!
A and B
A nor B
4
論理演算子
論理演算
A or B
A and B
A nor B
論理演算子
A || B
A && B
!(A || B)
ただし、
1.AとBは関係演算子を用いた条件式である。
2.論理演算子は関係演算子より演算優先
順位が低い。
3.論理演算は、条件式の複合演算である。 5
論理演算子(適用例1)
先週の問題で、四則演算子を見分ける場合
if ((c==‘+’) || (c==‘*’)) {
1
2 3
printf(“加積算です!\n”) }
else if ((c==‘-’) || (c==‘/’)) {
printf(“減除算です!\n”) }
else {
printf(“演算できません\n”) }
演算順位は左から!
6
論理演算子(適用例2)
先週の問題で、四則演算子を見分ける場合
if ((c==‘+’) || (c==‘*’)
論理演算を
重複させる!
||(c==‘-’) || (c==‘/’)) {
printf(“四則演算子です!\n”) }
else {
printf(“四則演算子ではありません\n”) }
四則演算子でない場合: 「・・ではありません」と出力
ブロック{}がたくさんでてきます。{}のペアの位置に気配りを!7
switch 文
if文と同様に、条件によって処理を制御する!
構文
式or変数と定数値が
switch (式or変数) {
一致すれば、そのあと
の文からbreakまでを
case 定数値1 :
実行する!
文1; 文2; ・・・ break;
case 定数値2 :
式or変数と定数値が
文3; 文4; ・・・ break; 一致しないときは、
defaultの部分(省略
default :
可能)を実行する!
文5; 文6; ・・・ break;
}
8
switch 文 (適用例)
char seiseki;
seiseki = getchar();
switch (seiseki) {
case ‘A’ :
printf(“優\n”); break;
case ‘B’ :
printf(“良\n”); break;
成績別に
『優』・『良』・『可』
を表示する
case文の設定数
は、いくつでも良い
default :
printf(“可\n”); break;
}
9
switch 文
問題 占運術ソフトの開発
好きな整数と日付(yymmdd)を入力し、switch
文を用いて、その日の運勢(?)を表示するプロ
グラムを作成しよう!
アルゴリズム(一例)
1.好きな整数と日付を入力
2.好きな整数と日付を用いて乱数を発生
3.乱数値にしたがって、運勢(大吉・吉・・・など)
とコメントを表示!(switch文?)
注意:占い結果を本気にしてはいけません 10
問題のアルゴリズム
フローチャート
はじまり
整数入力
日付入力
乱数発生
細目決定
switch文を利用
はい
細目=1
いいえ
はい
細目=2
大吉
中吉
いいえ
小吉
おわり
11
switch 文 (問題解答例)
主要部のみ
main()
{
int No,Date,Index;
/*変数宣言*/
printf(“Input Your Favorite No. = ”);
scanf(“%d”,&No);
printf(“Input date = ”);
scanf(“%d”,&Date);
/*条件入力*/
srand(No*Date);
Index = rand() % 3;
/*乱数発生*/
12
switch 文 (問題解答例)
主要部のみ
switch (Index) {
/*剰余で以って運を導く*/
case 0 :
printf(“大吉 (^^) \n”); break;
case 1 :
printf(“中吉 (^^; \n”); break;
default : /* case 2 : との記載も可 */
printf(“小吉 (;д;) \n”); break;
}
} /* main() end. */
13
何度も繰り返す
用途例
○ 繰返し入力または出力
printf, scanf
○ 繰返し演算
n
X  i
i 1
m
Y   j
j 1
印刷が薄
くてごめん
なさい
Z  !
○ 繰返し実行
a.outを終了せずに何度も
同じプログラムを実行する。
14
繰返し文
C言語の繰返し文
人気No.1
○ for 文
for(i=1;i<=n;i++) { 文・・・ }
人気No.2
○ while 文
while(i<=n) { 文・・・ }
○ do ~ while 文
do { 文・・・ }while (i<=n);
15
for 文
構文
for(初期値設定の式;条件式;変化量) {
文1; 文2; ・・・・・
条件式が真の場合:{}内を実行!
}
初期値設定の式
制御変数(カウンタ)を準備
カウンタの初期値設定
条件式
if 文でも用いた条件式
カウンタの最大(最小)値を判定
変化量
初期値からの増分(減分)
備考
カウンタの変数宣言(int型)
16
for 文(実施例1)
for文のカウンタを出力するプログラム(主要部のみ)
main()
カウンタとカウンタ最大値の変数宣言
{
int i,max; カウンタ初期値 カウンタ条件式(最大値まで)
max = 3;
for(i=1;i<=max;i++)
printf(“カウンタ =
} /* for end */
} /* main end */
カウンタ増分
{
%d です \n”,i);
% a.out
カウンタ = 1 です
カウンタ = 2 です
カウンタ = 3 です
17
for 文(実施例2)
[1..5]の整数和を演算するプログラム(主要部のみ)
main()
整数和の変数宣言
{
int sum,i;
カウンタ初期値
カウンタ条件式(最大値まで)
sum = 0;
カウンタ増分
for(i=1;i<=5;i++) {
sum = sum + i; /* sum += i;も可*/
} /* for end */
printf(“整数和 = %d です \n”,sum);
} /* main end */
% a.out
整数和 = 15 です
18
for 文(実施例2)
sum = 0;
for(i=1;i<=5;i++) {
sum = sum + i; /* sum += i;も可*/
} /* for end */
i番目の繰返し 新しいsum = sum + i
1
1
0
1
2
3
1
2
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
5
15
10
5
19
while 文
構文
while(条件式) {
文1; 文2; ・・・・・
条件式が真の場合:{}内を実行!
}
条件式
if 文でも用いた条件式
例:カウンタ最大(最小)値を判定
備考1
条件式では、関係演算子 or
論理演算子を適用
条件式の評価値はwhile{}内
で更新される(ことが多い)
20
備考2
while 文(実施例1)
カウンタを出力するプログラム(主要部のみ)
main()
カウンタとカウンタ最大値の変数宣言
{
int i,max;
カウンタ条件式(最大値まで)
i = 1; max = 3;
while(i<=max) {
printf(“カウンタ = %d です \n”,i);
i++;
カウンタ増分
% a.out
} /* while end */
カウンタ = 1 です
} /* main end */
カウンタ = 2 です
21
カウンタ = 3 です
while 文(実施例2)
[1..5]の整数和を演算するプログラム(主要部のみ)
main()
整数和の変数宣言
{
int sum,i;
カウンタ条件式(最大値まで)
sum = 0; i = 1;
while(i<=5) {
sum = sum + i; /* sum += i;も可*/
i++;
カウンタ増分
} /* while end */
printf(“整数和 = %d です \n”,sum);
} /* main end */
% a.out
22
整数和 = 15 です
do{}while 文
構文
do{
文1; 文2; ・・・・・ 最低1回は{}が実行される
条件式が真の場合:{}内を実行
} while(条件式)
条件式
備考1
備考2
if 文でも用いた条件式
例:カウンタ最大(最小)値を判定
条件式では、関係演算子 or
論理演算子を適用
条件式の評価値はdo{}while内
で更新される(ことが多い)
23
do{}while 文(実施例1)
カウンタを出力するプログラム(主要部のみ)
main()
カウンタとカウンタ最大値の変数宣言
{
% a.out
int i,max;
カウンタ = 1 です
カウンタ = 2 です
カウンタ = 3 です
i = 1; max = 3;
do{
printf(“カウンタ = %d です \n”,i);
i++;
カウンタ増分
}while(i<=max) /* while end */
カウンタ条件式(最大値まで)
} /* main end */
24
do{}while 文(実施例2)
[1..5]の整数和を演算するプログラム(主要部のみ)
main()
整数和の変数宣言
{
% a.out
int sum,i;
整数和 = 15 です
sum = 0; i = 1;
do{
sum = sum + i; /* sum += i;も可*/
カウンタ条件式(最大値まで)
i++;
} while(i<=5) /* while end */
printf(“整数和 = %d です \n”,sum);
} /* main end */
25
文のネスト(入れ子)
for文、if文などの多重の繰り返しを行う
注意:カウンタ変数は別にすること
int i,j;
for(i=1;i<=10;i++) {
f
for(j=1;j<=10;j++) {
f
o
o
i
if (i<j) {
r
r
f
printf(“i<jだよ!\n”);
i
}
j
L
B
l
o
else {
L
o
o
printf(“i>=jだよ!\n”);
o
c
p
}
o
k
p
} /* for j end. */
} /* for i end. */
26
break文とcontinue文
繰り返し処理の流れの変更に適用!
break文
構文 break;
→ break文以後の繰り返し処理を強制的に終了し、
for・while・if・switch文などのブロックから抜
け出る。
continue文
構文 continue;
→ continue文以後のその回の繰り返し処理を
飛ばし、 for・while文などのブロックの先頭へ戻
り、次の繰り返し処理を継続する(カウンタは+1)。
27
何度も繰り返す
印刷が薄
くてごめん
なさい
問題 常微分方程式の解の計算
常微分方程式
dX
k
X t  0  X 0
(先週のちからだめし)
dt
X0=10、k=1.0の場合、X(t=10)は?
解析解と比較してください。
X=f(t)
X
アルゴリズム
Xi
dX
X i  X i 1 
 ti  ti 1 
dt
初期値と添え字iに着目して
t=10まで繰り返し計算する!
Xi-1
X0
t
0
ti-1 ti
10
28
何度も繰り返す
印刷が薄
くてごめん
なさい
問題の常微分方程式の解析解の導出
常微分方程式
dX
k
X t  0  X 0
(変数分離法)
dt
1st step)
4th step)
X  X 0  kt
dX  kdt
2nd step)

X
5th step)
X  10.0  1.0 10  20.0
t
dX   kdt
X0
0
3rd step)
X  X 0  kt
t
0
→
t
X
X0 →
X
29
次回の予定
○ 配列 (テキスト:Lesson7)
何度も繰り返す
行列の演算
○ ちからだめし! 其の2
回帰直線(最小二乗法)の公式を導出して
きてください。
30
おわりに
• さて、問題です。
1.何度も繰り返す構文を挙げてください。
2.繰り返しブロックを強制的に終了する構文を
挙げてください。
3.その他、質問など
31