Document

C言語
第4講
生物機能制御学講座 濱田
農学部7号館209室
1
本日の講義内容
•
•
•
•
おさらい
変数
式と演算子 テキスト Lesson 4
計算プログラムの作成
アンケート
2
アンケート結果
質問および要望
1.授業内容がよくわからない!
2.終了時刻を守ってほしい!
3.いくつか組み合わせるのが難しい!
4.プログラムを打つのが大変!
5.前回の最後の問題の回答がほしい!
6.わかってきた!
7.進度が速い!!
3
本講義の第1目標
汎用性の高い計算プログラムの開発
適用例:ミカエリスーメンテン式など
プログラムの処理内容
計算条件の入力
式の計算
計算結果の出力
キーワード
定数・係数・初期条件
printf scanf getchar
方程式・公式・四則演算
データ更新・結果表示
printf
4
変数
文字型 char
整数型 int
まとめ
○
○
○
○
○
○
○
浮動小 float
数点型 double
変数は、値を格納する
変数は、名前と型を指定して宣言する
変数名は、識別子を使う
変数に値を代入するときは‘=’を使う
変数に新しい値を代入すると、値が入れ替わる
キーボード入力した数値を受入れる 「scanf」
キーボード入力した文字を受入れる 「getchar」
5
文字と数値と変数
問題 以下の出力を実行するプログラムを作成してください。
% a.out
あなたの性別を入力してください
printf
性別 (M/F) = M
scanf
あなたの年齢を入力してください
getchar
年齢 (歳) = 21
あなたの身長を入力してください。
身長 (cm) = 160.5
----------------------------------------------あなたは、性別M・年齢21歳・身長160.5cmです!
%
6
文字と数値と変数(解答例)
#include <stdio.h>
main()
{
char c; int age; float height;
printf(“あなたの性別を入力してください \n”);
printf(“性別 (M/F) =”);
c = getchar();
printf(“あなたの年齢を入力してください \n”);
printf(“年齢 (歳) =”);
scanf(“%d”,&age);
続く
変数宣言
気配り!
質問 ?
性別入力
気配り!
質問 ?
年齢入力
7
文字と数値と変数(解答例)
続き
printf(“あなたの身長を入力してください \n”);
printf(“身長 (cm) = ”);
scanf(“%f”,&height);
printf(“----------------------------------------------- \n”);
printf(“あなたは、性別%c・年齢%d歳・身長%4.1f
cmです!\n”,c,age,height);
気配り!
質問 ?
身長入力
結果出力
}
printf() getchar() scanf() %4.1f
8
本講義の第1目標
汎用性の高い計算プログラムの開発
適用例:ミカエリスーメンテン式など
プログラムの処理内容
計算条件の入力
式の計算
計算結果の出力
キーワード
定数・係数・初期条件
printf scanf getchar
方程式・公式・四則演算
方程式・公式・四則演算
データ更新・結果表示
printf
9
式と演算子
算術式
y = a + b;
において、プログラムでは、
式
: 右辺 a + b
演算子 : 右辺の四則演算子など +
オペランド : 演算対象 a , b
値
: 左辺 y
という。
コンピュータは、①右辺(a+b)を計算して、
②左辺(y)に代入し、処理を終了する。
10
主な演算子
記号
+
ー
*
/
%
=
++
ーー
名前
加算
減算
乗算
除算
剰余算
代入
インクリメント
デクリメント
プログラム記述例
y = a + b;
y = a - b;
y = a * b;
y = a / b;
y = a % b;
y = a;
y = a++;
y = a--;
11
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--;
12
代入演算子
記号
+=
ー=
*=
/=
%=
名前
加算代入
減算代入
乗算代入
除算代入
剰余代入
プログラム記述例
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;
13
演算子の優先順位
四則演算の優先順位
数学の演算と同じ
( )を使う場合も数学の演算と同じ
y = a + b * (c + d) 1
2
3
優先順位が等しければ左から評価
y = a + b1 - d
2
14
演算子の優先順位
四則演算の優先順位 (その2)
演算は左からだが、
( )の演算から開始
y = a * b + (c + d) 2
1
()の必要性が
ない式でも
3
代入の場合は右からである!(特例)
y = a = b = 11
2
15
型変換(問題提起)
数を格納する変数において
識別
int
float
double
記憶桁 小数有効桁
±E10
0
±E38
7
±E308
15
記憶桁
int < float < double
小数桁
int < float < double
記憶容量が異なる変数を混在して計算可能?
16
型変換が必要なわけ
記憶容量が小さい変数から大きい変数に代入
int i; float f; double d;
f = i; d = f; d = i;
数値があふれない。小数点以下を切り捨てられない。
記憶容量が大きい変数から小さい変数に代入
int i; float f; double d;
i = f; f = d; i = d;
いつも気を
配ること!
数値があふれ、小数点以下を切り捨てられる懸念あり!
17
異なる型の演算1
整数型と浮動小数点型の積算
int i; float f; double d, dd;
dd = i * d;
d
= i * f;
演算は右辺から行なわれるので、整数型と小
数点型の演算は小数点型にそろえられる
記憶容量の大きい型に変換してから演算される
18
異なる型の演算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の割り算
19
キャスト演算子:演算前に一時的に型を変換する!
式と演算子
問題 1
片道 A kmの道のりを往路は B km/hr
で、復路は C km/hrで移動しました。平均
時速(V_ave km/hr)を求めるプログラム
を作成しましょう。
A=10km、B=10km/hr、C=5km/hrのとき、
V_aveは?
20
式と演算子
問題 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の関係はどんなグラフ形状になります
か?
21
Michaelis-Menten’s Eq.
基質濃度をS、反応速度をVとする
ミカエリスーメンテンの式は以下の通りです。
V _ max  S
V
Km  S
ここで、V_max は最大生成速度、
Km はミカエリス定数である。
22
次回の予定
○ 場合に応じた処理
(テキスト:Lesson5)
if 文 case 文 !?
23
おわりに
• さて、問題です。
1. 「y=y+a」を代入演算子を用いて表すと?
2. 「a=1」のとき「y=a++」でyはいくら?
3. 「キャスト演算子」は何?
4. その他、質問など
24
式と演算子
問題 1
片道 A kmの道のりを往路は B km/hr
で、復路は C km/hrで移動しました。平均
時速(V_ave)を求めるプログラムを作成し
ましょう。
A=10km、B=10km/hr、C=5km/hrのとき、
V_aveは?
25
本講義の第1目標
汎用性の高い計算プログラムの開発
適用例:ミカエリスーメンテン式など
プログラムの処理内容
計算条件の入力
式の計算
計算結果の出力
キーワード
定数・係数・初期条件
printf scanf getchar
方程式・公式・四則演算
方程式・公式・四則演算
データ更新・結果表示
printf
26
式と演算子
問題 1 プログラム解答例(主要部のみ)
float A,B,C;
printf(“片道距離 A km = ”);
scanf(“%f”,&A);
printf(“往路速度 B km/hr = ”);
scanf(“%f”,&B);
printf(“復路速度 C km/hr = ”);
scanf(“%f”,&C);
続く
27
式と演算子
問題 1 プログラム解答例(主要部のみ)
T_Ouro = A/B; /*往路所要時間 */
続き
T_Fukuro = A/C; /*復路所要時間 */
T_OandF = T_Ouro+T_Fukuro;
/*往復所要時間 */
D_Kyori = 2*A;
/*往復距離 */
V_ave = D_Kyori/T_OandF; /*平均速度 */
printf(“V_ave=%6.3fkm/hr”,V_ave);
答え
V_ave = 6.66km/hr
28
式と演算子
問題 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の関係はどんなグラフ形状になります
か?
29
式と演算子
問題 2 プログラム解答例(主要部のみ)
printf(“V_max = ”);
scanf(“%f”,&V_max);
printf(“Km = ”);
scanf(“%f”,&Km);
printf(“S = ”);
scanf(“%f”,&S);
V = V_max*S/(Km+S); /*M-M Eq.*/
printf(“V_max = %6.4f\n”,V);
30
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]
31
開発の手続き
プログラムの作成手順
キーワード
処理手順の流れを熟考
アルゴリズム・フローチャート
編集画面でソースコードを作成
コーディング・プログラミング
ソースコードをコンパイル
コンパイル (機械語へ翻訳)
ソースコードのエラーを駆除
デバッグ
プログラムの実行
a.out ・ エグゼ
% mule prog1.c
% cc prog1.c
% a.out32