コンピュータ基礎実験 第7回 コンピュータープログラミング (C言語)(4) 1.キーボード入力(復習) 2.条件分岐(if文) 「キーボード入力」、「算術関数」 の復習 コンピューターは、「キーボード」や「マウス」、 「タブレット」などからデータを入力することが 可能 C言語では、「データの入力」も、「関数」(入出 力関数)を利用して実現可能:「scanf()」 三角関数や指数関数など、数学で使う関数 (算術関数)の使用 「#include <math.h>」をソースに書く 算術関数ライブラリをリンク「-lm」 キーボード入力関数「scanf()」 変数型宣言 int a; のあとに scanf(”%d”, &a); とすると,キーボードから入力した整数の値が aに入力される. 注)「a」に「&」を付けるのをわすれるな! 3 • 2つ以上の数の場合も同様に int a, b, c, …, ; ☜ 整数型の 変数の場合 printf(”2つの整数? ”); scanf(”%d %d”, &a, &b); ・ 実数型なら ☜ 実数型の 変数の場合 float x; printf(”x= ”); scanf(”%f”, &x); 文字型変数 ☟ の場合 文字型なら char name[10]; printf(”Name: ”); scanf(”%s”, name); & は不要 4 ■ 前回発展課題 課題 6-5: 三角形の3辺の長さa, b, cを与え,面積を求めるプロ グラム( ex6-5.c )を示せ.ただし,三角形の面積を与える 公式(Heronの公式)は既知とする. Heronの公式 S = s(s - a)(s - b)(s - c) ここで,平方根の計算は where 2s = a + b + c sqrt(…) とすればよい. [ヒント] プログラムの最初に #include <math.h> を加えること 発展課題 6-6: 課題 6-5において,平方根の計算を正確に 計算するプログラムを示せ.( ex6-6.c ) [ヒント]変数をdouble a,b,c,… scanf(”%lf…”,&a, …) 、 printf(”%1.15f…”,a)として下さい. 5 変数の型と表記 型 扱える範囲 printf(scanf)中の表記 文字型 char -127 〜 128 (文字) %c(文字), %d(値) 整数型 int - 2147483648 〜 2147483647 %d 倍長整数型 long - 9223372036854775808 %ld 〜 9223372036854775807 単精度浮動小数点型 有効数字6桁の実数 float 3.4E-38 〜 3.4E+38 %f 倍精度浮動小数点型 有効数字15桁の実数 double 1.7E-308 〜 1.7E+308 %lf (scanf中) 注)printfでは%lfは使わない ⇒間違える人が多いので使 えるように変更された http://www.kijineko.co.jp/tech/superstition s/printf-format-for-double.html 前回発展課題2 回答例 ex6-6.c Ex6-6.c: #include <stdio.h> #include <math.h> int main(void) { double a,b,c,s; printf(”三角形の3辺を入力: ”); scanf(”%lf %lf %lf”,&a,&b,&c); s=(a+b+c)/2; s=sqrt(s*(s-a)*(s-b)*(s-c)); printf(”面積: %1.15f\n”,s); return 0; } コンパイル: $ cc -lm ex6-6.c 7 s=sqrt(s*(s-a)*(s-b)*(s-c)) 上式は「s」についての方程式でしょうか? C言語では、「=」は数学での「=」(右辺と左辺が 等しい)とは意味が異なります C言語での「=」は、「右辺の計算結果」を「左辺 の変数」に記憶させるという意味です(代入) 「x=2*x+1」: 数学では「x=-1」です 「x=1; x=2*x+1」: C言語では「xには3が記憶されて いる」です(「x=3」ではないことに注意) 「x=x+1」を、数学とC言語で考えてみよう 条件分岐1(2重分岐:if文) キーボードからの入力や、計算結果に応じて処 理内容を変える場合があります テレビゲームでもあります 「スライムが仲間になりたそうにこちらをみている」 「仲間にしますか? はい/いいえ」 C言語では、「2重分岐」と「多重分岐」の2種類 が用意されています 2重分岐: 「if文」⇒2股に分かれる 多重分岐:「switch~case文」⇒3股以上に分かれる 判断と分岐 ■ 2重分岐 …条件式により2分岐選択制御 [ if 〜 else] if 文 if (条件式) 文1; else 文2; 条件式 (1)関係演算 … 2つの値の大小関係の比較 (2) 論理演算 … 条件を満たすか否かを判定 ■ 多重分岐…番号による場合分け switch文 〜 case 次回 10 ■ 1.関係係演算子 意味 等しい より大きい 数学記号 C言語 = == 条件式の書き方 > > より小さい < < 等しいか, より大きい ≧ >= 等しいか, より小さい ≦ <= 等しくない ≠ != (Ex.1) a+b = c a+b == c (Ex.2) a+b ≧c a+b >= c 11 ■ 2.論理演算子 A, B のそれぞれを条件式として 意味 A, Bの両者とも成立すれば 真 A, Bのどちらかが成立すれば Aが成立しなければれば 真 真 名前 C言語での表現 論理積 AND A && B 論理和 OR A || B 否定 NOT !A (Ex.1) “x+y = c” と “z > 0” の両方が成立すれば真 x+y == c && z > 0 (Ex.2) “0 < x < 100 ” 0 < x && x < 100 (Ex.3) “x = y = 1” x == 1 && y == 1 (注) || よりも && の方が優先順位は高い. 同じ順位の間では左から順 12 に評価される.また,( ) でくくってあればその中が先に評価される. if文の「入れ子」 if (条件式1) 文1; else if (条件式2) 文2; else if (条件式3) 文3; else 文4; もし,else以下の文が省略され どの条件も満たさないと, 何も実行しないで終了する. (注)文が複数行になる場合は { } で囲む. 1行の文の場合は{ }は省略可能. 文のかたまりが見えやすいように,先頭の文字の頭を下げる(インデント)とよい. 13 if (条件1){ if (条件2) { 文1; } else { 文2; } } else { 文3; } (注)文が複数行になる場合は { } で囲む. 1行の文の場合は{ }は省略可能. 文のかたまりが見えやすいように, 先頭の文字の頭を下げる(インデント)とよい. 14 例題7-1: コンピューターが「2つの数字a,bをいれてください: 」と出力 2数を入力する(スペースを開けて) コンピューター:「和と差を計算(1を入力) 積と商を計算(1以外入力): 」 「1」を入力⇒和と差を出力 「1」以外を入力⇒積と商を出力 第5回:分割コンパイルex5-5-1.c、ex5-5-2.c、ex5-5-3.cで作った2つの プログラムを一つにしたプログラムです。 3つのソースをコピーして、改造しよう(ex7-1-1.c, ex7-1-2.c, ex7-1-3.c) 15 ex7-1-1.c: 例題7-1 1/2 ex7-1-1.c #include <stdio.h> void basiccalc1(float a, float b); void basiccalc2(float a, float b); int main(void) { float a,b; int c; if(c==1){ basiccalc2(a,b); } else{ basiccalc1(a,b); } 別ファイルの「basiccalc1」 と「basiccalc2」を使う printf(”2つの数字を入れてくださ い: ”); scanf(”%f %f”,&a,&b); printf(”和と差を計算(1を入力) 積と商を計算(1以外入力): ”); scanf(”%d”,&c); cが1のときbasiccalc2 それ以外のときbasiccalc1 return 0; } 16 例題7-1 2/2: ex7-1-2.c, ex7-1-3.c ex7-1-2.c: ex7-1-3.c: #include <stdio.h> /* 積と商の計算 */ #include <stdio.h> /* 和と差の計算 */ void basiccalc1(float a, float b) { float c,d; void basiccalc2(float a, float b) { float c,d; c=a*b; d=a/b; printf(”a=%f b=%f の時、”,a,b); printf(”積%f 商%f\n”,c,d); } c=a+b; d=a-b; printf(”a=%f b=%f の時、”,a,b); printf(”和%f 差%f\n”,c,d); } 17 例題7-1分割コンパイルの手順 • 「ex7-1-1.c」をコンパイル $ cc -c ex7-1-1.c ⇒ ex7-1-1.o • 「ex7-1-2.c」をコンパイル $ cc -c ex7-1-2.c ⇒ ex7-1-2.o • 「ex7-1-3.c」をコンパイル $ cc -c ex7-3-3.c ⇒ ex7-3-3.o • 3つのオブジェクトファイルをリンク $ cc ex7-1-1.o ex7-1-2.o ex7-3-1.o ⇒ a.exe 18 課題7-2: 次のプログラム「dq.c」の動作を予測せよ。また、実 際にコンパイルして動作を確かめよ。 #include <stdio.h> #include <unistd.h> int main(void) { int a; printf("ちゃーちゃ ちゃちゃちゃちゃ ちゃちゃちゃ ちゃちゃちゃ ちゃ\n"); sleep(2); printf("ちゃーちゃ ちゃちゃちゃ ちゃ ん\n\n"); sleep(3); printf("「王様」ゆうしゃよ りゅうおうを たおすのじゃ\n"); printf("1: たびにでる 2: たびにでな い\n"); scanf("%d",&a); if(a==1){ sleep(2); printf("メタルスライムがあらわれた \n"); printf("1: たたかう 2: にげる\n"); scanf("%d",&a); if(a==1){ printf("ちゃららっ\n\n"); sleep(1); printf("ゆうしゃのこうげき\n"); sleep(2); printf("メタルスライムに25のダ メージ\n\n"); sleep(2); printf("メタルスライムのこうげき \n"); sleep(2); printf("ゆうしゃに35のダメージ \n\n"); sleep(2); printf("ゆうしゃはしんでしまった \n\n"); sleep(2); } else{ printf("\nメタルスライムのあと なに もであいませんでした\n\n"); sleep(2); printf("\nゆうしゃはへいぼんないっ しょうをおえました\n\n"); sleep(2); } } else{ printf("\nゆうしゃはへいぼんないっ しょうをおえました\n\n"); sleep(2); } printf("「王様」ゆうしゃよ しんでしま うとはなさけない\n"); return 0; } 注) sleep(n)は、n秒間なに もしないで待つ関数 #include <unistd.h>が 必要 19 課題7-3: 「うるう年(閏年)」は, 西暦年数が “400で割り切れる年,または, 4で割り切れかつ100で割り切れない年” と定義されています.西暦年数を入力し,「****年はうるう年 です(ではありません).」というように出力するプログラムを 作成せよ.( ex7-3.c ) 実行例として(1) 2013年 (2) 2012年 (3) 2000年 (4) 1999年 (5) 1900年 が,うるう年かどうか調べよ. 20 課題7-4: 二次方程式 ax2+bx+c=0 の解を具体的に出力するプログラムを 作れ.ただし 解が重解なら 重解 x=… 解が2つの実解なら 相異なる実数解 x =…, … 解が複素数なら 相異なる複素数解 x=… +…i x=… -…i のように表現せよ.( ex7-4.c) 実行例として (1) a=1, b=1, c=-2, (2) a=1, b=-2, c=1, (3) a=1,b=1, c=1 を試みよ. (注) 平方根の計算が必要になるので #include<stdio.h> のつぎに #include<math.h> を書き加えること 21 課題7-5: つぎのようなプログラムを作れ. 1. まず,品物の単価と購入数を入力する. 2. つぎに,消費税(8%)を含めた請求額を表示する. ただし,端数は切り捨てるものとする. 3. 最後に,客の支払った額を入力して,足りていれば おつりの額を,足りなければ不足額を出力する. ( ex7-5.c ) 実行例として次の3つを含み,5つ程度の例を試みてみよ. (1) 単価1000円,購入数3個,客の支払額5000円 (2) 単価1000円,購入数3個,客の支払額3000円 (3)単価5円,購入数3個,客の支払額100円 22 ■ 発展課題 発展課題 7-7: キャラクターベースのロールプレイング ゲームを作成せよ( ex7-6.c ) (補足)優先順位 • ||より&& 同じ順位では 左から順に評価 • If( (A && B) || (C && D)) 括弧内は優先 23 実習結果のレポート • 3つのソースファイル「ex7-3.c」、「ex7-4.c」、 「ex7-5.c」を添付ファイルにしてメールを送って ください。 • 宛先: [email protected] • 件名:コンピューター基礎実験7 • 本文:感想および一言 24
© Copyright 2024 ExpyDoc