プログラミング演習( 1 組) 第 6 回
今日の内容 前回の課題の解説 DEBUG について(エラーの探し方) 今回の課題の説明
タイピング 喰人王を使用して結果を記録する ステージ:第一の店(中華) Excel のシートにスコアを毎回記録してい く – 残り時間⇒ FeedBack ページで報告 – 総タイプ数 – ミスタイプ数 – 正確さ⇒ FeedBack ページで報告 – 喰いっぷり ⇒ FeedBack ページで報告
前回課題(締切: 5/18 ) (1)車の速さ speed と、目的地までの距離 distance を入力させて、目的地までの所要時 間を以下のような表示形式で求めるプログラ ムを作成せよ。 車の速さ (km/h) : 100 距離 (km) : 250 所要時間は、 2 時間 30 分 00 秒です (2) 2 次方程式 a x 2 + b x + c = 0 の解を求める プログラムを作成せよ( a,b,c は入力させよ) x の平方根を求めるプログラムを参考にせよ。
課題1(解答例) int speed; int distance; int time; printf(" 車の速さ "); scanf("%d",&speed); printf(" 目的地までの距離 "); scanf("%d",&distance); time = distance / speed; printf(" 目的地までの所要時間 "); printf("%d 分 \n", time); int 型で宣言 時間の単位に注意 入力処理 計算処理 出力処理
課題1(計算処理) time= distance / speed; 計算処理 整数型と整数型の計算 ⇒ 整数型 問題: distance 、 speed が int 型のとき, distance = 18 、 speed = 10 ならば, distance / speed は,いくらになるか? 問題: distance 、 speed が int 型のとき, distance = 18 、 speed = 10 ならば, distance / speed は,いくらになるか? 答え:1
課題1(計算処理) 所要時間を実数で求めるためには … ? (1)「 distance / speed 」を実数型として 計算 実数型と整数型の計算 ⇒ 実数型 (格上げという) 実数型と実数型の計算 ⇒ 実数型 実数型と整数型の計算 ⇒ 実数型 (格上げという) 実数型と実数型の計算 ⇒ 実数型 (double)distance / speed; → distance を double 型として計算する。 int distance; int speed; double distance; double speed;
課題1(計算処理) 所要時間を実数で求めるためには … ? (2)所要時間を格納する変数 time を実数型として 宣言 int time;double time;
課題1 double Speed_kmph;// 時速 [km/h] double Speed_mps;// 秒速 [m/s] // 時速 [km/h] を秒速 [m/s] に変換 Speed_mps = Speed_kmph / 3.6;
課題1 int AllSecond;// 秒単位の時間 int Hour;// 時 int Minute;// 分 int Second;// 秒 // 秒単位の経過時間を,時・分・秒に分割 Hour = AllSecond / 3600;//1 時間は 3600 秒 Minute = ( AllSecond % 3600 ) / 60;//1 分は 60 秒 Second = AllSecond - Hour*3600 – Minute*60; (または、 Second = ( AllSecond % 3600) % 60; )
double speed; double distance; double time; int AllSecond; int Hour; int Minute; int Second; printf(" 車の速さ (km/h) : "); scanf("%lf",&speed); printf(" 距離 (km) : "); scanf("%lf",&distance); time = distance / speed; AllSecond = time * 3600; Hour = AllSecond / 3600; Minute = (time - Hour) * 60; Second = AllSecond - Hour * Minute * 60; printf(" 所要時間は、 %d 時間 %d 分 %d 秒です \n",Hour,Minute,Second); 嶋田君の解答例
課題2の解く手順 (1) 2 次方程式の係数 a, b, c を入力させる(入力処 理) (2) 2 次方程式の解の公式を利用して,2つの解 を計算する(計算処理) (3)2つの解を表示する(出力処理)
課題2(解答例 2 組:黒武者 さん) int a, b, c; // 入力用 double kai1, kai2, y, root; // 「 kai1 」「 kai2 」は解 y はルートの中身 root は y をルー トに変換 // 画面表示 printf("2 次方程式 ax^2 + bx + c = 0 の解を求める計算をします \n"); //a の値入力 printf("a の値を入力してください \n"); scanf("%d", &a); //b の値入力 printf("b の値を入力してください \n"); scanf("%d", &b); //c の値入力 printf("c の値を入力してください \n"); scanf("%d", &c); 使用する変数を宣言 プログラムの目的を表示 入力処理
課題2(解答例 2 組:黒武者 さん) // ルートの中身 y = b*b - 4*a*c; // ルート変換 root = sqrt(y); // 解の計算 kai1 = (-b + root)/(2 * a); kai2 = (-b - root)/(2 * a); // 結果表示 printf(" 求める解は %.2lf %.2lf\n", kai1, kai2); 計算処理 y (判別式)の計算 sqrt(y) の計算 解1,2を計算 出力処理
解答例(惜しい!) 解の計算部分において、 x1=(-b+sqrt(b*b-4*a*c))/2*a; x2=(-b-sqrt(b*b-4*a*c))/2*a; x1=(-b+sqrt(b*b-4*a*c))/2*a; x2=(-b-sqrt(b*b-4*a*c))/2*a; 問題:どこが、まずいのか? ( 分子 ) / 2 * a 1. 分子を計算 2. 上記結果 / 2 3. 上記結果 * a 1. 分子を計算 2. 上記結果 / 2 3. 上記結果 * a
解答例(惜しい!) 解の計算部分において、 x1=(-b+sqrt(b*b-4*a*c))/2*a; x2=(-b-sqrt(b*b-4*a*c))/2*a; x1=(-b+sqrt(b*b-4*a*c))/2*a; x2=(-b-sqrt(b*b-4*a*c))/2*a; ( 分子 ) / 2 * a; ( 分子 ) / (2 * a); x1=(-b+sqrt(b*b-4*a*c))/( 2*a ); x2=(-b-sqrt(b*b-4*a*c))/( 2*a ); x1=(-b+sqrt(b*b-4*a*c))/( 2*a ); x2=(-b-sqrt(b*b-4*a*c))/( 2*a );
課題( Special ) ( Special ) 2 次方程式 ax 2 +bx+c=0 を解き,因数 分解の形で表示するプログラムを作成せよ. さらに, if 文を使って,重解・虚数解にも対応 させよ( pp 参照).なお,表示方法にも 注意すること 入力: a = 1 b = 1 c = -2 入力: a = 1 b = 1 c = -2 出力: (x - 1)(x + 2) = 0 出力: (x - 1)(x + 2) = 0
Special 課題 大隈君の解答例
DEBUG でよくある間違い 1.「;」の忘れ 2.全角スペースが入っている 3.変数が未定義 4.「 studio.h 」と書いている 4.変数の値が定まっていないのに、計算 に使っている int x; int z; z = x*x; printf(“z = %d\n”,z); int x; int z; z = x*x; printf(“z = %d\n”,z);
例( DEBUG の仕方) int main() { int x; int y; double number; y = x*x; number = y*3 prinf(“number = %d\n”, numbre); reture 0; } この中には、間違いがわざと まちがいが入っています。 分かりますか? この中には、間違いがわざと まちがいが入っています。 分かりますか?
論理演算子 &&(論理積 AND ) (例)条件 A &&条件 B すべての条件を満たす ||(論理和 OR ) ( 例)条件 A ||条件 B どれか一つでも条件を満たす !(否定 NOT ) (例)!条件 A 条件結果を否定する
論理演算( AND ) if ( (a == 3) && (b == 4) ) { 文1; } a が3,bが4と等しい時に,文1が実行さ れる
論理演算( OR ) if ( (a == 3) || (b == 4) ) { 文1; } a が3またはbが4と等しい時に,文1が実行 される
例題 2次方程式の判別式を使って,解の種類 を判別するプログラムを作成せよ. 二次方程式 a*x*x + b*x + c = 0 の解の種類を 調べます. 係数 a は? 1 係数 b は? 5 係数 c は? 4 この2次方程式の解は,虚数解です 二次方程式 a*x*x + b*x + c = 0 の解の種類を 調べます. 係数 a は? 1 係数 b は? 5 係数 c は? 4 この2次方程式の解は,虚数解です
判別式 D を計算 D > 0 D < 0 「2つの実数 解」 と表示 「虚数解」と 表示 「重解」と表 示 TRUE FALSE
解答例 D = b*b-4*a*c; if (D > 0) { printf(“ 2つの実数解です ”); } else if (D < 0) { printf(“ 虚数解です ”); } else { printf(“ 重解です ”); }
今日の課題 課題1:三角形の3辺の長さを入力させて, その大小関係からどのような三角形かを 判定するプログラムを作れ. 課題2:3つの値を入力させて,その中で 最も大きい値を表示するプログラムを作 れ. 一つ目の辺の長さは? 3 二つ目の辺の長さは? 5 三つ目の辺の長さは? 4 この三角形は,直角三角形です! 一つ目の辺の長さは? 3 二つ目の辺の長さは? 5 三つ目の辺の長さは? 4 この三角形は,直角三角形です! 一つ目の値は? 3 二つ目の値は? 8 三つ目の値は? -1 この中で一番大きいのは,8で す! 一つ目の値は? 3 二つ目の値は? 8 三つ目の値は? -1 この中で一番大きいのは,8で す!
注意事項 ソースファイルについて ソースファイルは添付ファイルで送る ソースファイル以外は送らない ソースファイルの名前は,半角のみ使用 メールについて 件名は,学籍番号+半角スペース+氏名 (例) S09F2099 松木裕二 本文にも短いカバーレター(説明)をつける
その他 講義に関する質問・課題提出など: Feed back page : メールアドレスの入力は不要です ニックネームを決めてください( Ranking 表示に使い ます)