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
© Copyright 2025 ExpyDoc