式と演算子

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