プログラミング入門2 第2回 演算と型 条件分岐 芝浦工業大学情報工学科 青木 義満 今回の講義内容 いろいろな演算(四則演算) 整数だけでなく小数データも!(int以外の変数の型) 前回 → 点数の合計 今回 → 平均点(小数データ) 演算と型の関係 第2回 プログラミング入門2 2 前回の復習も兼ねて… キーボードから2つの整数を読み込み、和を表示するプログラムを作 成せよ。 これに他の演算(差,積,商,剰余) を加えていく 第2回 プログラミング入門2 3 四則演算 コンピュータに様々な計算を実行させる → 四則演算が基本 (和、差、積、商) 四則演算を実現する演算子(演算の働きを持った記号) 演算子 用法 + a+b aとbの和 ー a-b aとbの差 * a*b aとbの積 / a/b aをbで割った商 % a%b aをbで割った剰余 a + 第一(左)オペランド 説明 b 第二(右)オペランド 二項演算子 第2回 プログラミング入門2 4 四則演算の例題 ソースファイル名:list0201.c 目的: 四則演算を実行し、結果を確認する(特に / , % 演算子の結果に注意) /* 読み込んだ二つの整数値の和・差・積・商・剰余を表示 */ #include <stdio.h> int main(void) { int vx, vy; puts("二つの整数を入力してください。"); printf("整数vx:"); scanf("%d", &vx); printf("整数vy:"); scanf("%d", &vy); printf("vx + vy = %d\n", vx + vy); printf("vx - vy = %d\n", vx - vy); printf("vx * vy = %d\n", vx * vy); printf("vx / vy = %d\n", vx / vy); printf("vx %% vy = %d\n", vx % vy); return (0); } 第2回 プログラミング入門2 5 型と演算結果の関係 整数 / 整数 商の整数部 5 / 3 → 1, 3 / 5 → 0 整数 % 整数 剰余 5 % 3 → 2, 3 % 5 → 3 整数(int型)と整数(int型)の四則演算 第2回 プログラミング入門2 結果も整数 6 整数演算から実数演算へ これまでの計算 → 整数のみ(int型) 実際の数値計算では、実数計算がほとんど 例) 点数の平均点を求める 平方根の計算 sin, cos その他 第2回 プログラミング入門2 7 平均値を求めるプログラム(整数版) ファイル名:heikin_int.c /* 2科目の点数の平均を表示するプログラム 整数版*/ #include <stdio.h> int main(void) { int sugaku; int english; int heikin; printf(“数学の点数は?: ”); scanf(“%d”, &sugaku); printf(“英語の点数は?: ”); scanf(“%d”, &sugaku); heikin = (sugaku + english) / 2; •演算は、*, / (乗算、除算)が優先される •+, -を先に計算させる場合には、 半角( )でくくる /* 平均点を求める */ printf(“平均点は、%d 点 です。”, heikin ); return(0); } 第2回 プログラミング入門2 8 平均値を求めるプログラム(実数版) ファイル名:heikin_dbl.c /* 2科目の点数の平均を表示するプログラム 実数版*/ #include <stdio.h> int main(void) { int sugaku; int english; int を double に! double heikin; printf(“数学の点数は?: ”); scanf(“%d”, &sugaku); printf(“英語の点数は?: ”); scanf(“%d”, &sugaku); heikin = (sugaku + english) / 2.0; • 割る数を 2 → 2.0 に! /* 平均点を求める */ printf(“平均点は、%f 点 です。”, heikin ); return(0); } 第2回 %d を %f に! プログラミング入門2 9 解説 ~ 変数の”型”と”実体” C言語 実数を 浮動小数点数で表す 整数 → int 型 浮動小数点 → double型,float型 整数 変数の宣言 宣言 型名 変数名 int sugaku; タコ焼のカタ (設計図) タコ焼 (実体) int型 sugaku double型 heikin 浮動小数点数 変数の宣言 型名 宣言 第2回 変数名 double heikin; プログラミング入門2 10 int, double型に対するprintf, scanf関数 int型の場合 double型の場合 printf printf( “%d”, no ); printf( “%f ”, no ); scanf scanf( “%d”, &no ); scanf( “%lf ”, &no ); 忘れずに! 忘れずに! %lf (パーセント・エル・エフ) 第2回 プログラミング入門2 11 double型変数への値の入力と表示 ファイル名:list0207.c 目的: double型変数に対する printf, scanf の使い方をマスター /* 二つの実数値を読み込んで和・差・積・商を実数で表示 */ #include <stdio.h> int main(void) { double /* 浮動小数点数 */ vx, vy; puts("二つの数を入力してください。"); printf("実数vx:"); scanf("%lf", &vx); printf("実数vy:"); scanf("%lf", &vy); printf("vx + vy = %f\n", vx + vy); printf("vx - vy = %f\n", vx - vy); printf("vx * vy = %f\n", vx * vy); printf("vx / vy = %f\n", vx / vy); return (0); } 第2回 プログラミング入門2 12 型と代入(重要!) int型変数に小数値(double)を代入すると…… 9.99 9.99 小数点以下は切り捨て! 型に入らない! nx int型 dx OK! double型 double型に整数値(int)を代入すると… 9 dx printf → 9.000000 double型 第2回 プログラミング入門2 13 型と演算(重要!) 同じ型どうし、異なる型どうしの演算 5 / 2 → 2 → int int / int 5.0 / 2.0 → 2.0 double / double → double 同じ型どうしの演算 5.0 / 2 5 / 2.0 double / int int / double 格上げ 格上げ 5.0 / 2.0 → 2.5 double / double → double 5.0 / 2.0 → 2.5 double / double → double 異なる型どうしの演算 第2回 プログラミング入門2 14 型と演算 重要 異なる型どうしの演算では、 小さい方の型のオペランドは、より大きい方の型に変換 された上で演算が行われる int double < 整数のみ 実数 第2回 プログラミング入門2 15 例題(演算と型) ソースファイル名:list0208.c (p.29) 確認事項: 同じ型,異なる型どうしの演算結果 /* 型と演算について確認する */ #include <stdio.h> int main(void) { int double printf("n1 = %d\n", n1); printf("n2 = %d\n", n2); printf("n3 = %d\n", n3); printf("n4 = %d\n\n", n4); n1, n2, n3, n4; d1, d2, d3, d4; printf("d1 = %f\n", d1); printf("d2 = %f\n", d2); printf("d3 = %f\n", d3); printf("d4 = %f\n", d4); n1 = 5 / 2; n2 = 5.0 / 2.0; n3 = 5.0 / 2; n4 = 5 / 2.0; d1 = 5 / 2; d2 = 5.0 / 2.0; d3 = 5.0 / 2; d4 = 5 / 2.0; 第2回 return (0); } プログラミング入門2 16 キャスト演算子 ~ 値の型を(強引に)変換 (型) aの値を型名で指定された値に 変換したものを生成 a 例1) (double) 5 → 5.0 を生成 (int) 2.55 → 2 を生成 例2) int na, nb; double heikin; heikin = (double) (na + nb) / 2 ; 85(int型) na = 40; nb = 45; 代入 85.0(double型) 45.2 (double) 第2回 85.0 / 2 (double) / (int) プログラミング入門2 17 if文による条件分岐 条件にもとづいて、プログラムの流れを変える 例えば、 キーボードから入力した整数値が… ・ もし、5で割り切れなかったら、“5の倍数でありません。” と表示する。 ・ そうでなかったら(5で割り切れたら)、“5の倍数です。” と表示する。 第2回 プログラミング入門2 18 例題 ~ 最初のif文プログラム ソースファイル名: list0301.c 概要: 読み込んだ整数値が5で割り切れないかどうか判定 目的: if 文の動作を確認 /* 読み込んだ整数値は5で割り切れないか */ #include <stdio.h> int main(void) { int %: 余り if文 vx; printf("整数を入力してください:"); scanf("%d", &vx); if (vx % 5) puts("その数は5で割り切れません。"); return (0); } 第2回 プログラミング入門2 19 例題解説(1) ~ if文の動作 式 if (vx % 5) 文 puts("その数は5で割り切れません。"); 構文 if ( 式 ) vxが5の倍数 → vx%5 = 0 vxが5の倍数でない → vx%5 ≠0(非ゼロ) 文 •(式)を評価 •式の結果が非0だったら、文を実行 •式の結果が0だったら、文を実行せず 第2回 プログラミング入門2 20 例題~ if文プログラム(2) ソースファイル名: list0303.c 概要: 割り切れなくても,割り切れても,その結果を表示 目的: if ~else~文の動作を確認 #include <stdio.h> int main(void) { int If~else~文 vx; printf("整数を入力してください:"); scanf("%d", &vx); if (vx % 5) puts("その数は5で割り切れません。"); else puts(“その数は5で割り切れます。"); return (0); } 第2回 プログラミング入門2 21 例題解説(2): if~else~文の動作 If(もしも~なら・・・),else(それ以外の時は・・・)という意味 式 if (vx % 5) puts("その数は5で割り切れません。"); else puts(“その数は5で割り切れます。"); 文1 文2 構文 if ( 式 ) 式を評価,その値が, 文1 else 第2回 文2 もし(if),非0だったら・・・ → 文1 を実行 そうでなければ(else),(0以外であれば) → 文2 を実行 プログラミング入門2 22 「式の評価」とは?? C言語における「式」 x (int型変数) 38 (int型定数) x + 38 (演算) X 15 + 53 全てその値を評価できる 「式」 38 X % 38 7 2 5 式全体の評価値 式全体の評価値 第2回 5 プログラミング入門2 23 値を比較するには? ~ 等価演算子,関係演算子 条件分岐における条件判定 人間の日常生活の中での様々な判断は,1つの条件,またはいくつかの条件を総合し て判断している。 例えば… 只今の所持金は財布の中の2000円のみ 欲しい品物が2000円より高い → 買えない 2000円以下 → 買える! 大学の成績評価 A(80~100),B(70~79),C(60~69),D(~59) 駅から歩くか,学バスが来るまで待つか,タクシーに乗るか 判断要素: 天候,次のバスが来るまでの時間,所持金,疲労度,授業までの残り時間 など ある値の大小によって,処理を分岐する必要になる! 第2回 プログラミング入門2 24 値比較のプログラム(1) ファイル名:list0306.c /* 読み込んだ二つの整数値は等しいか */ #include <stdio.h> int main(void) { int x1, x2; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &x1); printf("整数2:"); scanf("%d", &x2); if (x1 == x2) puts("それらの値は同じです。"); else puts("それらの値は違います。"); return (0); } 第2回 プログラミング入門2 25 値比較のプログラム(2) ファイル名:list0307.c /* 読み込んだ二つの整数値は等しいか */ #include <stdio.h> int main(void) { int x1, x2; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &x1); printf("整数2:"); scanf("%d", &x2); if (x1 != x2) puts("それらの値は違います。"); else puts(“それらの値は同じです。"); return (0); } 第2回 プログラミング入門2 26 等価演算子 2つの式の値が等しいか,等しくないかを判定 ==演算子 a == b aとbの値が等しければ1,そうでなければ0 !=演算子 a != b aとbの値が等くなければ1,そうでなければ0 等価演算子 値が1(等しい) if (x1 == x2) 値が0 (等しくない) puts("それらの値は同じです。"); else puts("それらの値は違います。"); 第2回 プログラミング入門2 ※ != はこの逆 27 3つ以上の条件分岐をするには? これまでは流れを2つに分岐 → 3つ以上の場合は? 例) 所持金2,000円 (1) 商品が2,000円より高かったら,惜しくも買えない. (2) 商品が2,000円ピッタリだったら,ビンゴ. (3) 商品が2,000円より安ければ,余裕で買える. 値が等しいかどうかを判定:等価演算子(==,!=) 値の大小を比較する演算子が必要!! 値の比較により,処理の流れを3つに分岐したい 第2回 プログラミング入門2 28 値比較のプログラム(3) ファイル名:list0309.c /* 読み込んだ整数値の符号を判定 */ #include <stdio.h> int main(void) { int no; printf("整数を入力してください:"); scanf("%d", &no); if (no == 0) puts("その数は0です。"); else if (no > 0) puts("その数は正です。"); else puts("その数は負です。"); return (0); } 第2回 プログラミング入門2 29 3つ以上の分岐: if ~, else if ~, else ~ if(条件式1) ① 文1 else if(条件式2) ② 文2 else ③ 文3 If(もし) 条件1であれば,文1実行 ①でなく,条件2であれば,文2実行 ①, ②のどの条件にもあてはまらない場合 ① if (no == 0) puts("その数は0です。"); ② else if (no > 0) puts("その数は正です。"); ③ else ①,②以外,つまり,0でも正でもない場合 puts("その数は負です。"); ※else if は何個でも書ける. 第2回 プログラミング入門2 30 大小関係を比較する ~ 関係演算子 < 演算子 a<b aがbより小さければ1,そうでなければ0 >演算子 a>b aがbより大きければ1,そうでなければ0 <=演算子 a <= b aがb以下であれば1,そうでなければ0 >=演算子 a >= b aがb以上であれば1,そうでなければ0 if ( a >= b 第2回 ) ○ → 値は1 × → 値は0 プログラミング入門2 31 2つの整数の大きい方の値を求める(1) ファイル名:list0310.c /* 2つの整数の大きい方の値を求める */ #include <stdio.h> int main(void) { int n1, n2; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &n1); printf("整数2:"); scanf("%d", &n2); if (n1 > n2) printf("大きい方の値は%dです。\n", n1); else printf("大きい方の値は%dです。\n", n2); return (0); } 第2回 プログラミング入門2 32 2つの整数の大きい方の値を求める(2) ファイル名:list0311.c 求めた値を,後の処理のために変数に格納 /* 2つの整数の大きい方の値を求める */ #include <stdio.h> int main(void) { int n1, n2, max; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &n1); printf("整数2:"); scanf("%d", &n2); if (n1 > n2) max = n1; else max = n2; printf("大きい方の値は%dです。\n", max); return (0); } 第2回 プログラミング入門2 33 大きい方の値, 小さい方の値両方を求める(3) ファイル名:list0315.c /* 2つの整数の大きい方,小さい方の値両方を求める */ #include <stdio.h> int main(void) { int n1, n2, max, min; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &n1); printf("整数2:"); scanf("%d", &n2); if (n1 > n2) { max = n1; min = n2; } else { max = n2; min = n1; } 今までに無かった中括弧 } 文が2つ(複数) 今までに無かった中括弧 } 文が2つ(複数) printf("大きい方の値は%dです。\n", max); printf("小さい方の値は%dです。\n", min); return (0); } 第2回 プログラミング入門2 34 複合文(ブロック) 重要 単一の文が要求されるところで,複数の文を実行しなければ ならない時には,{}の中にまとめて,複合文(ブロック)として実現. 例1) if (n1 > n2) { max = n1; min = n2; } 複合文(ブロック) ※文が一つの場合, {}は書いても書かなくてもOK. 実はこんなところにも… #include <stdio.h> int main(void) { printf(“こんにちは。”); return (0); } 第2回 複合文(ブロック) プログラミング入門2 35 複数の条件から判断 ~ 論理演算子 一つの条件だけでなく,複数の条件が成立,またはどちらからか が成立した時,というように複数の条件から処理を判断. 例) とある飲み会へ参加しようかどうか迷っている (1)友人AとBが両方とも(AかつB)参加表明 → 私も参加 (2)友人AとBの少なくともどちらかが(AまたはB)参加表明 → 参加微妙 (3)友人AとB,両方とも不参加 → 私も不参加 論理演算子 第2回 プログラミング入門2 の導入 36 論理演算子 ~ AかつB,AまたはB の実現 読み込んだ月から季節を判定するプログラム 仕様 整数値(月:変数名 month )を入力 その数字が, 3,4,5 → 春 6,7、8 → 夏 9,10,11 → 秋 12,1,2 → 冬 条件を ?以上?以下で表現できる 条件を 12または1または2 と表現できる と判定したい 第2回 プログラミング入門2 37 論理演算子 条件の「かつ」,「または」を表現 &&(and) 演算子 a && b aとbがどちらも非0であれば1,そうでなければ0 || (or)演算子 a || b aとbの一方でも非0であれば1,そうでなければ0 例) もし,3月以上(かつ)5月以下だったら… 3 <= month <= 5 ①,②の両方成り立てば○ 第2回 「かつ」 ① month >= 3 && ② month <= 5 ○(1:正) ○(1:正) ○(1:正) ×(0:誤) ×(0:正) ○(1:正) ×(0:誤) ×(0:誤) プログラミング入門2 → ○(1:正) →×(0:誤) →×(0:誤) →×(0:誤) 38 論理演算子 条件の「かつ」,「または」を表現 &&(and) 演算子 a && b aとbがどちらも非0であれば1,そうでなければ0 || (or)演算子 a || b aとbの一方でも非0であれば1,そうでなければ0 例) 12月,または1月だったら 「または」 ① ② month == 12 || month == 1 ○(1:正) ○(1:正) ○(1:正) ×(0:誤) ×(0:正) ○(1:正) ×(0:誤) ×(0:誤) 第2回 ①,②のどちらかが成り立てば○ → ○(1:正) →○(1:正) →○(1:正) →×(0:誤) プログラミング入門2 39 季節判定プログラム(論理演算子) ファイル名:list0316.c /* 読み込んだ月の季節を表示 */ #include <stdio.h> int main(void) { int month; /* 月 */ printf("何月ですか:"); scanf("%d", &month); if (month >= 3 && month <= 5) puts("春です。"); else if (month >= 6 && month <= 8) puts("夏です。"); else if (month >= 9 && month <= 11) puts("秋です。"); else if (month == 1 || month == 2 || month == 12) puts("冬です。"); else puts("そんな月はありませんよ!!\a"); return (0); } 第2回 プログラミング入門2 40 もう一つの条件分岐文 ~ switch 文 ソースファイル名: list0317.c 読み込んだ整数値を3で割っ た剰余を表示(if文使用) /* 読み込んだ整数値を3で割った余りを表示 */ #include <stdio.h> int main(void) { int num; printf("整数を入力してください:"); scanf("%d", &num); 同じ式が2回登場 → 無駄? if (num % 3 == 0) puts(“3で割った余りは0です"); else if (num % 3 == 1) puts(" 3で割った余りは1です"); else puts(“3で割った余りは2です"); 処理を自分で記述 return (0); } 第2回 プログラミング入門2 41 switch 文 単一の条件式の値によって,処理を複数に分岐させる場合 → if文よりも簡潔に記述できる! ソースファイル名: list0318.c /* 読み込んだ整数値を3で割った余りを表示 */ #include <stdio.h> int main(void) { int num; printf("整数を入力してください:"); scanf("%d", &num); switch ( num % 3 ) { case 0 : puts(“3で割り切れます”); break ; case 1 : puts(“余りは1です”); break ; case 2 : puts(“余りは2です”); break ; } return (0); } 第2回 プログラミング入門2 42 switch文の構造 条件式① switch ( num % 3 ) { ①の値が 0の場合 case 0 : puts(“3で割り切れます”); case 1 : puts(“余りは1です”); case 2 : puts(“余りは2です”); 1の場合 2の場合 break ; break ; break ; } (Switch文終了) break で switch文を抜ける ()カッコ内の式を評価し,case で書かれた 値と一致するところにプログラムの流れを移行 第2回 プログラミング入門2 43 switch文の break; と default : の役割 ソースファイル名: list0319.c /* switch文の動作を確認するプログラム */ #include <stdio.h> int main(void) { int sw; printf("整数を入力してください:"); scanf("%d", &sw); switch (sw) { case 1 : puts("A"); case 2 : puts("C"); case 5 : puts("D"); case 6 : case 7 : puts("E"); default : puts("F"); } return (0); } 第2回 puts("B"); break; break; がない break; break; がない break; break; 新しい default : switch文の動作を確認 プログラミング入門2 44 switch (sw) { case 1 case 2 case 5 case 6 case 7 : puts("A"); puts("B"); break; : puts("C"); : puts("D"); break; : : puts("E"); break; default : puts("F"); break; “sw” が 1, 2, 5, 6, 7 以外の場合 } 第2回 プログラミング入門2 45 switch文 と if文 Switch文 → 単一の式の値によって,プログラムの流れを分岐 if 文 → 複数の式の値によって,複雑な条件判断 を行い,処理を分岐することができる 第2回 プログラミング入門2 46 演習課題(簡単な数値計算) 1. 身長を整数値として読み込んで(scanf)、それに対する標準体重を実数で表示(printf)す るプログラムを作成せよ。なお、標準体重の計算式は以下で与えられるものとする。 標準体重 = (身長-100)×0.9 kadai2-1.c 2. あるサッカーチームのゴール決定率を計算・表示するプログラムを作成せよ。 ただし、決定率は小数点2桁まで表示すること。 手順) ・チーム名を表示(printf) ・シュート数を入力 ・ゴール数を入力 ・ゴール決定率を計算(ゴール数÷シュート数)×100 (%) ・ゴール決定率を表示 (小数点2桁まで) 第2回 プログラミング入門2 kadai2-2.c 47 演習課題(条件分岐) 3.if文を用いて,点数を入力すると、その評価を出力するプログラム を作れ。 なお評価は、以下のとおりとする。 kadai2-3.c ・80点以上: A(優), 70点以上80点未満: B(良),60点以上70点未満: C(可), 60点未満: D(不可) 4.月を数字で読込み,その月が何日あるかを表示するプログラムを 作れ。なお、1〜12以外の数字を入力した際には、”1〜12まで の数字を入力してください ”と表示すること。 ただし, ・2月 →28日 ・ 4, 6, 9, 11 → 30日 ・1,3,5,7,8,10,12 → 31日 第2回 kadai2-4.c プログラミング入門2 48 プログラミング入門2 レポート課題(第1回目) 演習課題1〜4のプログラムを作成し,動作確認した上で ソースファイル4つ(それぞれ,kadai2-1.c 〜 kadai2-4.c) をメール に添付して提出せよ。 (授業中にできた課題は授業中にチェックしてもらうこと。) 提出方法: メールの題名(subjet)を, “学籍番号”+”自分の苗字”(全て半角英数文字にて)とする。 例) L02001 aoki 提出先: [email protected] (青木アドレス) 提出期限: 10月12日(金) 18:00まで(時間厳守) 第2回 プログラミング入門2 49 次回の講義予定 繰り返し文 で、プログラミングの幅を広げよう! 第2回 プログラミング入門2 50
© Copyright 2024 ExpyDoc