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