C言語 第5講 生物機能制御学講座 濱田 農学部7号館209室 1 本日の講義内容 • • • • おさらい 式と演算子 計算プログラムの作成 場合に応じた処理 テキスト Lesson 5 アンケート 2 アンケート結果 質問および要望 1.代入演算子の恩恵が? 2.キャスト演算子でなく、最初から変数の型を doubleにしていいか? 3.計算結果の出力方法が? 4.前回の問題の解答がほしい! 5.わかってきた! 8名 6.むずかしい ! 8名 7.ゲノム広場にいけなかった人は! 3 式と演算子 算術式 y = a + b; において、プログラムでは、 式 : 右辺 a + b 演算子 : 右辺の四則演算子など + オペランド : 演算対象 a , b 値 : 左辺 y という。 コンピュータは、①右辺(a+b)を計算して、 ②左辺(y)に代入し、処理を終了する。 4 主な演算子 記号 + ー * / % = ++ ーー 名前 加算 減算 乗算 除算 剰余算 代入 インクリメント デクリメント プログラム記述例 y = a + b; y = a - b; y = a * b; y = a / b; y = a % b;(整数型) y = a; y = a++; y = a--; 5 See text p.82. 主な演算例 算術例 y = -a y = a + 1 y = a3 y = aX2+bX+c y = a ÷ b +1 y = (a-1)×(b-1) y = a+1 y = a‐1 プログラム記述例 y = -a; y = a + 1; y = a*a*a; y = a*x*x + b*x + c; y = a/b + 1; y = (a-1)*(b-1); y = a++; y = a--; 6 代入演算子 記号 += ー= *= /= %= 名前 加算代入 減算代入 乗算代入 除算代入 剰余代入 プログラム記述例 y += a; (y=y+a;) y ー= a; (y=y-a;) y *= a; (y=y*a;) y /= a; (y=y/a;) y %= a; (y=y%a;) See text p.89. y = y + a; 同意 x = y + a; y = x; 7 型変換(問題提起) 数を格納する変数において 識別 int float double 記憶桁 小数有効桁 ±E10 0 ±E38 7 ±E308 15 記憶桁 int < float < double 小数桁 int < float < double 記憶容量が異なる変数を混在して計算可能? 8 型変換が必要なわけ 記憶容量が小さい変数から大きい変数に値を代入 int i; float f; double d; f = i; d = f; d = i; 数値があふれない。小数点以下を切り捨てられない。 記憶容量が大きい変数から小さい変数に値を代入 int i; float f; double d; i = f; f = d; i = d; いつも気を 配ること! 数値があふれ、小数点以下を切り捨てられる懸念あり! 9 異なる型の演算1 整数型と浮動小数点型の積算 int i; float f; double d, dd; dd = i * d; d = i * f; 演算は右辺から行なわれるので、整数型と小 数点型の演算は小数点型にそろえられる 記憶容量の大きい型に変換してから演算される 10 異なる型の演算2 キャスト演算子 書式 : 変数の前に(型名)を添付 int i,j; double d,dd; i = 5; j = 4; d = i / j; /*←整数演算*/ dd = (double)i / (double)j; 答え d = 1.0 dd = 1.25 d : 整数i,jの割り算(余りが捨てられる) dd: 倍精度浮動小数点i,jの割り算 11 キャスト演算子:演算前に一時的に型を変換する! 式と演算子 問題1 片道 A kmの道のりを往路は B km/hr で、復路は C km/hrで移動しました。平均 時速(V_ave)を求めるプログラムを作成し ましょう。 A=10km、B=10km/hr、C=5km/hrのとき、 V_aveは? 12 演算のアルゴリズム 問1 調和平均を算出するプログラム プログラムの処理内容 計算条件の入力 式の演算 式の計算 計算結果の出力 手続き 距離 A、 往路速度 B、 復路速度 C を入力! ①往復所要時間を算出 方程式・公式・四則演算 ②往復平均速度を算出 往復平均速度を出力! 13 式と演算子(参考) 問題1 プログラム例その1(入力部) float A,B,C,D,E,F,G,H; /*変数宣言*/ printf(“片道距離 A km = ”); scanf(“%f”,&A); printf(“往路速度 B km/hr = ”); scanf(“%f”,&B); printf(“復路速度 C km/hr = ”); scanf(“%f”,&C); 続く 計 算 条 件 の 入 力 14 式と演算子(参考) 問題1 プログラム例その1(演算・出力部) 続き D = A/B; /*往路所要時間 */ E = A/C; /*復路所要時間 */ 式 の F = D+E; /*往復所要時間 */ 演 G = 2*A; /*往復距離 */ 算 H = G/F; /*平均速度 */ 出 printf(“V_ave=%6.3fkm/hr”,H); 力 答え V_ave = 6.667km/hr 15 式と演算子(参考) 問題1 プログラム例その2(演算・出力部) V_ave = 2*A/(A/B+A/C); /*往路距離/(往路所要時間+復路所要時間) */ 続き 演 算 出 printf(“V_ave=%6.3fkm/hr”,V_ave); 力 答え V_ave = 6.667km/hr 16 式と演算子(参考) 問題1 プログラム例その3(演算・出力部) printf(“V_ave=%6.3fkm/hr”, 2*A/(A/B+A/C)); /*往路距離/(往路所要時間+復路所要時間) */ 答え 続き 演 算 出 力 V_ave = 6.667km/hr 17 式と演算子 問題 2 最大反応速度(V_max)、ミカエリス定数(Km)をも つミカエリスーメンテンの式を用いて、反応速度(V) を算出するプログラムを作成しましょう。 V_max=0.1mg/min, Km=0.02mg/mLのとき、 S=0.0~0.20mg/mL において離散的にデータを サンプリングし、V=0.08mg/minになるSを求めま しょう。SとVの関係はどんなグラフ形状になります か? 18 式と演算子 問題 2 プログラム解答例(主要部のみ) printf(“V_max = ”); 計 scanf(“%f”,&V_max); 算 printf(“Km = ”); 条 件 scanf(“%f”,&Km); 入 printf(“S = ”); 力 scanf(“%f”,&S); V = V_max*S/(Km+S); 演算 printf(“V = %6.4f\n”,V); 出力 19 Profile of the reaction rate 離散的にサンプリングした反応速度を補間し V=0.08mg/minのSを推定した。 0.10 V [mg/min] 0.08 0.06 0.04 0.02 0.00 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 S×10 [mg/mL] 20 場合に応じた処理 もし、○○ならば・・・ △△の場合ならば・・・ など、条件分岐を考慮するとさらに汎用性の高 いプログラムを作成できます。 これをC言語で記載すると、 ○○ : 条件式 ① if ○○ {・・・} ② switch △△ {case ・・・} となり、条件に合致した場合、特別な処理(・・・) を実行する。 21 条件式に用いる関係演算子 関係演算子の心得 (真偽を問う) 演算子 A==B A!=B A>B A>=B A<B A<=B 式が成立する(真)パターン AはBに 等しい (=) AはBに 等しくない (≠) AはBより 大きい (>) AはB 以上 (≧) AはBより 小さい (<) AはB 以下 (≦) 22 if 文(構文 その1) if (条件式) { /* 条件式が真の場合のみ実行*/ 文1; キーポイント 1.文の数はいくらでもよい 文2; 2.必ず{ }で挟むこと! ・・・・・ 3.条件式は()で括ること! } 4.{ }:ブロックという 条件式が偽の場合 { }内は無視される 23 if 文(構文 その2) if (条件式) { /* 条件式が真の場合のみ実行*/ 文1; 文2; ・・・・・ キーポイント } 1.条件式の真偽で異なる処理を実行 else { /* 条件式が偽の場合のみ実行*/ 文3; 文4; ・・・・・ } キーポイント 24 2.else {…} を省略すると 構文その1 if 文(構文 その3) if (条件式1) { /* 条件式1が真の場合のみ実行*/ 文1; 文2; ・・・・・ } else if (条件式2) { キーポイント /* 条件式2が真の場合のみ実行*/ 1.else if は 文3; 文4; ・・・・・ 複数設定 } してよい else { /* 条件式1、2が偽の場合のみ実行*/ 文5; 文6; ・・・・・ 25 } if 文(適用例) 変数AおよびBの関係で次の演算が異なる場合 if (A==B) C=A+B; } else if (A>B) C=A-B; } else if (A<B) C=A*B; } else C=A/B; } { /* A=B ならば実行*/ { /* A>B ならば実行*/ { /* A<B ならば実行*/ { /* 上記に該当なし*/ 26 場合に応じた処理 問題 四則2項演算プログラムを作成しましょう。 アルゴリズム(一例) 1.四則演算子(+,ー,*,/)をキーボード入力 2.もし、1で四則演算子以外が入力されたらはじく! 3.2項(a= ? b= ?)をキーボード入力 4.もし、加算なら a+b=○ いや、減算なら aーb=○ そうでなくって、積算なら a*b=○ それ以外は、除算ということで a / b = ○ 27 と出力する。 次回の予定 ○ 場合に応じた処理 (テキスト:Lesson5) switch 文 !? 論理演算子 関係演算子を複数適用する方法 28 おわりに • さて、問題です。 1. 関係演算子をあげてください。 2. if 文の構文を教えてください。 3. その他、質問など 29 開発の手続き プログラムの作成手順 キーワード 処理手順の流れを熟考 アルゴリズム・フローチャート 編集画面でソースコードを作成 コーディング・プログラミング ソースコードをコンパイル コンパイル (機械語へ翻訳) ソースコードのエラーを駆除 デバッグ プログラムの実行 a.out ・ エグゼ % mule prog1.c % cc prog1.c % a.out30
© Copyright 2024 ExpyDoc