情報処理技法 (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
© Copyright 2024 Paperzz