Presentation is loading. Please wait.

Presentation is loading. Please wait.

コンピュータープログラミング(C言語)(4) 1.キーボード入力(復習) 2.条件分岐(if文)

Similar presentations


Presentation on theme: "コンピュータープログラミング(C言語)(4) 1.キーボード入力(復習) 2.条件分岐(if文)"— Presentation transcript:

1 コンピュータープログラミング(C言語)(4) 1.キーボード入力(復習) 2.条件分岐(if文)
コンピュータ基礎実験 第6回 コンピュータープログラミング(C言語)(4) 1.キーボード入力(復習) 2.条件分岐(if文)

2 「キーボード入力」、「算術関数」 の復習 コンピューターは、「キーボード」や「マウス」、「タブレット」などからデータを入力することが可能
C言語では、「データの入力」も、「関数」(入出力関数)を利用して実現可能:「scanf()」 三角関数や指数関数など、数学で使う関数(算術関数)の使用 「#include <math.h>」をソースに書く 算術関数ライブラリをリンク「-lm」(Eclipseが行う)

3 キーボード入力関数「scanf()」 変数型宣言 int a; のあとに scanf(”%d”, &a);
とすると,キーボードから入力した整数の値が aに入力される. 注)「a」に「&」を付けるのをわすれるな!

4 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); ☜ 実数型の   変数の場合 & は不要

5 ■ 前回発展課題 課題 EX5-5: 三角形の3辺の長さa, b, cを与え,面積を求めるプログラム( EX5-5.c )を示せ.ただし,三角形の面積を与える公式(Heronの公式)は既知とする.   Heronの公式   ここで,平方根の計算は sqrt(…) とすればよい. [ヒント] プログラムの最初に #include <math.h> を加えること 発展課題 EX5-6: 課題 5-5において,平方根の計算を正確に計算するプログラムを示せ.( EX5-6.c ) [ヒント]変数をdouble a,b,c,…  scanf(”%lf,…”,&a, …) 、printf(”%1.15f…”,a)として下さい.

6 変数の型と表記 型 扱える範囲 printf(scanf)中の表記 文字型 char -127 〜 128 (文字)
-127 〜 128 (文字) %c(文字), %d(値) 整数型  int    〜 %d 倍長整数型  long %ld 単精度浮動小数点型  float 有効数字6桁の実数 3.4E-38 〜 3.4E+38 %f 倍精度浮動小数点型  double 有効数字15桁の実数 1.7E-308 〜 1.7E+308 %lf (scanf中) 注)printfでは%lfは使わない⇒間違える人が多いので使えるように変更された

7 前回発展課題2 回答例 EX5-6.c EX5-6.c: コンパイル: $ gcc -lm EX5-6.c (Eclipse が自動で行う)
#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; } 注目! コンパイル: $ gcc -lm EX5-6.c (Eclipse が自動で行う)

8 s=sqrt(s*(s-a)*(s-b)*(s-c))
「x=2*x+1」: 数学では「x=-1」です 「x=1; x=2*x+1;」: C言語では「xには3が記憶されている状態になっている」です 「x=x+1」を、数学とC言語で考えてみよう

9 条件分岐1(2重分岐:if文) キーボードからの入力や、計算結果に応じて処理内容を変える場合があります テレビゲームでもあります
「スライムが仲間になりたそうにこちらをみている」 「仲間にしますか? はい/いいえ」 C言語では、「2重分岐」と「多重分岐」の2種類が用意されています 2重分岐: 「if文」⇒2股に分かれる 多重分岐:「switch~case文」⇒3股以上に分かれる

10 判断と分岐 ■ 2重分岐 …条件式により2分岐選択制御 [ if 〜 else]  if 文 if (条件式) 文1; else 条件式
  文1;  else   文2; ■ 多重分岐…番号による場合分け  switch文 〜 case 条件式 (1)関係演算  … 2つの値の大小関係の比較 (2) 論理演算    … 条件を満たすか否かを判定 次回

11 ■ 1.関係係演算子 数学記号 C言語 = == > < ≧ >= ≦ <= ≠ != 条件式の書き方
意味 数学記号 C言語 等しい = == より大きい > より小さい < 等しいか, >= <= 等しくない != 条件式の書き方 (Ex.1) a+b = c  a+b == c (Ex.2) a+b ≧c  a+b >= c

12 ■ 2.論理演算子 A, B のそれぞれを条件式として 意味 名前 C言語での表現 A && B A || B !A
論理積 AND A && B A, Bのどちらかが成立すれば  真 論理和 OR A || B Aが成立しなければれば 真 否定 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 (注) || よりも && の方が優先順位は高い. 同じ順位の間では左から順   に評価される.また,( ) でくくってあればその中が先に評価される.

13 例1:2分岐「偶数 or 奇数?」 int a; … if (a%2==0){ printf(”aは偶数”); } else {
条件:2で割り切れる? a%2==0 NO YES もし,else以下の文が省略され どの条件も満たさないと, 何も実行しないで終了する. aは偶数 aは奇数 (注)文が複数行になる場合は { } で囲む.    1行の文の場合は{ }は省略可能.    文のかたまりが見えやすいように,    先頭の文字の頭を下げる(インデント)とよい.

14 例2:入れ子の2分岐「正 or 負 or 0?」 int a; … if (a>0){ printf(”aは正”); } else{
条件1:0より大きい? a>0 NO 条件2:0より小さい? a<0 YES NO YES aは正 aは負 aは0 (注)文が複数行になる場合は { } で囲む.    1行の文の場合は{ }は省略可能.    文のかたまりが見えやすいように,    先頭の文字の頭を下げる(インデント)とよい.

15 例題EX6-1: コンピューターが「2つの実数a,bをいれてください: 」と出力    2数を入力する(スペースを開けて) コンピューター:「和と差を計算(1を入力) 積と商を計算(1以外入力): 」 「1」を入力⇒和と差を出力    「1」以外を入力⇒積と商を出力 第4回:分割コンパイルの練習プロジェクト「EX4-8」と「EX4-9」を組み合わせたプログラムです。 EX4-8.c → EX6-1.c EX4-8-1.c → EX6-1-1.c EX4-9-1.c → EX6-1-2.c のように3つのソースをコピーして、改造しよう。

16 例題EX6-1 1/2 EX6-1.c EX6-1.c: #include <stdio.h>
cが1のときbasiccalc2 それ以外のときbasiccalc1 EX6-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; printf(”2つの実数を入れてください: ”); scanf(”%f %f”,&a,&b); printf(”和と差を計算(1を入力) 積と商を計算(1以外入力): ”); scanf(”%d”,&c); if(c==1){ basiccalc2(a,b); } else{ basiccalc1(a,b); return 0; 別ファイルの「basiccalc1」と「basiccalc2」を使う

17 例題EX6-1 2/2: EX6-1-1.c, EX6-1-2.c EX6-1-1.c: EX6-1-2.c:
#include <stdio.h> /* 積と商の計算 */ void basiccalc1(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); } #include <stdio.h> /* 和と差の計算 */ 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); }

18 例題EX6-1分割コンパイルの手順 (Eclipse が自動で行う)
「EX6-1.c」をコンパイル $ gcc -c EX6-1.c ⇒ EX6-1.o 「EX6-1-1.c」をコンパイル $ gcc -c EX6-1-1.c ⇒ EX6-1-1.o 「EX6-1-2.c」をコンパイル $ gcc -c EX6-1-2.c ⇒ EX6-1-2.o 3つのオブジェクトファイルをリンク $ gcc EX6-1.o EX6-1-1.o EX6-1-2.o ⇒ EX6-1.exe

19 課題EX6-2: 次のプログラムの動作を予測せよ。また、実際にコンパイルして動作を確かめよ。(コピー&ペーストOK)
#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){ 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"); printf("メタルスライムのこうげき\n"); printf("ゆうしゃに35のダメージ\n\n"); printf("ゆうしゃはしんでしまった\n\n"); } else{ printf("\nメタルスライムのあと なにもであいませんでした\n\n"); printf("\nゆうしゃはへいぼんないっしょうをおえました\n\n"); sleep(2); } else{ printf("「王様」ゆうしゃよ しんでしまうとはなさけない\n"); return 0; 注) sleep(n)は、n秒間なに   もしないで待つ関数   #include <unistd.h>が   必要

20 課題EX6-3:  「うるう年(閏年)」は,   西暦年数が   “400で割り切れる年,または,    4で割り切れかつ100で割り切れない年” と定義されています.西暦年数を入力し,「****年はうるう年です(ではありません).」というように出力するプログラムを作成せよ.( EX6-3.c )  実行例として(1) 2018年 (2) 2017年 (3) 2000年 (4) 1999年   (5) 1900年 (6)自分が生まれた年  が,うるう年かどうか調べよ. ヒント:「4で割り切れる」⇒「4で割った余りが0」 ||より&& 同じ順位では左から順に評価 If( (A && B) || (C && D))   括弧内は優先 (補足)優先順位

21 二次方程式 ax2+bx+c=0 の解を具体的に出力するプログラムを 作れ.ただし 解が重解なら  重解 x = …
課題EX6-4:  二次方程式 ax2+bx+c=0 の解を具体的に出力するプログラムを 作れ.ただし  解が重解なら  重解 x = …  解が2つの実解なら  相異なる実数解 x =…, …  解が複素数なら  相異なる複素数解 x = … + … i x = … - … i のように表現せよ.( EX6-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> を書き加えること

22 ヒント 「x=2.400000+12.30000i」と表示させるには float a=2.4,b=12.3;
printf(”x=%f+%fi”,a,b);

23 課題EX6-5: つぎのようなプログラムを作れ.
1. まず,品物の単価と購入数を入力する. 2. つぎに,消費税(8%)を含めた請求額を表示する.     ただし,端数は切り捨てるものとする. 3. 最後に,客の支払った額を入力して,足りていれば     おつりの額を,足りなければ不足額を出力する. ( EX6-5.c )  実行例として次の3つを含み,5つ程度の例を試みてみよ. (1) 単価1000円,購入数3個,客の支払額5000円 (2) 単価1000円,購入数3個,客の支払額3000円 (3)単価5円,購入数3個,客の支払額100円 ヒント:整数型で計算すれば自動的に端数切捨てになります

24 発展課題EX6-6: キャラクターベースのロールプレイングゲームを作成せよ( EX6-6.c )
■ 発展課題 発展課題EX6-6: キャラクターベースのロールプレイングゲームを作成せよ( EX6-6.c )

25 実習結果のレポート 課題6-4のソースファイル「EX6-4.c」、を添付ファイルにしてメールを送ってください。
宛先: 件名:コンピューター基礎実験6 本文:感想および一言


Download ppt "コンピュータープログラミング(C言語)(4) 1.キーボード入力(復習) 2.条件分岐(if文)"

Similar presentations


Ads by Google