講義用スライド

情報処理技法
(Cプログラミング)I 第4回 ー プログラム実行・条件分岐 ー 担当: 荻田 武史 本日の授業内容 •  講義で使うC言語のコンパイラ(GCC)
について •  GCCによるプログラムのコンパイル・
プログラムの実行方法 •  C言語で体格指数BMIを計るプログラ
ムを完成させる 2
GCCについて •  GCC (GNU C Compiler) – 多くのプラットホームに移植されてい
るフリーなCコンパイラ。 – ほとんどのPC-UNIXには標準搭載 – Windowsでも、Cygwinという環境を導入
すると使うことが可能 3
コンパイル・実行(1) Emacsなどのエディタを使って、C言語のプログラ
ムを作った後に、それをコンパイルして実行。 srcfile.c ⇒ .c : C言語のファイル コンパイル&リンク $ gcc srcfile.c ⇒ a.out という実行ファイルが作成される。 カレントディレクトリに a.out が既にある場合
はそれを上書きしてしまうため良くない。 $ ./a.out 実行 4
コンパイル・実行(2) コンパイルをするときに、オプションをつ
けることによって、作成される実行ファ
イル名を自分で指定することができる。 $ gcc srcfile.c -o exefile ⇒ exefile という実行ファイルが作成される。 $ ./exefile 実行 5
BMIとは? •  身長と体重から肥満度を測定するための指数 BMI指数 = 体重(kg) ÷ 身長(m)2 BMI指数 18.5未満 18.5以上25未満 25以上30未満 30以上 判定 やせぎみ 標準体重 やや肥満 太り過ぎ 6
失敗プログラム(1) bmi2-1.c #include <stdio.h> int main(void) { int height; int meter_height; printf("Input height>"); scanf("%d", &height); meter_height = height / 100; printf("height..%d(m)\n", meter_height); return 0; } 7
失敗の理由(1) •  変数meter_heightは整数型なので、小数
を含む値を扱えない? •  小数も扱える実数型(浮動小数点型)が必
要 8
変数: 実数型(浮動小数点型)
double <書き換え> int meter_height; ⇒ double meter_height; printf("height..%d(m)\n", meter_height); ⇒ printf("height..%f(m)\n", meter_height); ※ 他にfloatという実数型もあるが、ここでは
doubleを基本に考える。 9
失敗プログラム(2) bmi2-2.c #include <stdio.h> int main(void) { int height; double meter_height; printf("Input height>"); scanf("%d", &height); meter_height = height / 100; printf("height..%f(m)\n", meter_height); return 0; } 10
失敗の理由(2) •  int型同士の演算の結果はint型になる(除算の場
合は、通常は切り捨て)。 meter_height = height / 100; int型 •  int型とdouble型の演算はdoubleで行われる。 ⇒ heightをdouble型にするか、100を100.0に変え
る(両方やっても良い)。 11
成功プログラム bmi2-3.c #include <stdio.h> int main(void) { int height; double meter_height; printf("Input height>"); scanf("%d", &height); この演算はdoubleで実行
される meter_height = height / 100.0; printf("height..%f(m)\n", meter_height); return 0; } 12
BMI指数の計算プログラム bmi3.c #include <stdio.h> int main(void) { int height; int weight; double meter_height; double bmi; printf("Input height>"); scanf("%d", &height);
printf("Input weight>"); scanf("%d", &weight); meter_height = height / 100.0; bmi = weight / (meter_height * meter_height); printf("BMI..%f\n", bmi); return 0; }
13
if文による条件分岐 •  BMI指数が計算できたとして、以下の場合
分けによって判定したい。 BMI指数 18.5未満 18.5以上25未満 25以上30未満 30以上 判定 やせぎみ (Underweight) 標準体重 (Normal) やや肥満 (Overweight) 太り過ぎ (Obese) 14
if文の形式 比較演算子 if (条件式) { 文の並び } else { 文の並び } 意味 数学 演算子 等しい = == 等しくない ≠ != より小さい < < より大きい > > 以下 ≦ <= 以上 ≧ >= 見やすくする ための字下げ (インデント) 論理演算子 意味 演算子 かつ && または || 15
BMIの判定表を素直に解釈すると・・・ if (bmi < 18.5) { printf("Underweight\n"); } if (bmi >= 18.5 && bmi < 25) { printf("Normal\n"); } if (bmi >= 25 && bmi < 30) { printf("Overweight\n"); } if (bmi >= 30) { printf("Obese\n"); } BMI指数 判定 18.5未満 Underweight 18.5以上25未満 Normal 25以上30未満 Overweight 30以上 Obese 16
•  一番最初のif文で「やせぎみ
(Underweight)」と判定された場合でも、
最後のif文まで実行される。 •  最初のif文で「18.5より小さいか?」の
比較と、次のif文で「18.5以上か?」の
比較がある。つまり、同じ数との比較が 2回もある。 ⇒ 無駄が多い 17
else を利用してみると・・・ BMI指数 if (bmi < 18.5) { 18.5未満 printf("Underweight\n"); 18.5以上25未満 } else { 25以上30未満 if (bmi < 25) { 30以上 printf("Normal\n"); } else { if (bmi < 30) { printf("Overweight\n"); } else { printf("Obese\n"); } } } 判定 Underweight Normal Overweight Obese 18
不要な中括弧を省くと・・・ BMI指数 if (bmi < 18.5) { 18.5未満 printf("Underweight\n"); 18.5以上25未満 } else 25以上30未満 if (bmi < 25) { 30以上 printf("Normal\n"); } else if (bmi < 30) { printf("Overweight\n"); } else { printf("Obese\n"); } 判定 Underweight Normal Overweight Obese 19
改行位置と字下げを調整すると・・・ if (bmi < 18.5) { printf("Underweight\n"); } else if (bmi < 25) { printf("Normal\n"); } else if (bmi < 30) { printf("Overweight\n"); } else { printf("Obese\n"); } BMI指数 判定 18.5未満 Underweight 18.5以上25未満 Normal 25以上30未満 Overweight 30以上 Obese このように else if を並べる書き方は、 非常によく使われる。 20
BMIの完成プログラム (実習) •  これまでの話を総合して、身長(cm)と体
重(kg)を入力したら、BMI指数と判定を画
面に出力するプログラムを作成する。 21
次回の予定 •  ループ(繰り返し)・配列 22