コンピュータ基礎実験  第8 回

22
ココココココココココ ココココココココココココココ C ココ)(5) コココココ コ 1.1( if コ コココ 、) コココココ コ 2.2( switch,case コ )

Upload: ciaran-fry

Post on 31-Dec-2015

26 views

Category:

Documents


2 download

DESCRIPTION

コンピュータ基礎実験  第8 回. コンピュータープログラミング ( C 言語)(5) 1.条件分岐1( if 文、復習) 2.条件分岐2( switch,case 文 ). 条件分岐1( if 文 、復習 ). キーボードからの入力や、計算結果に応じて処理内容を変える場合があります C 言語では、「2重分岐」と「多重分岐」の2種類が用意されています 2重分岐 : 「 if 文」⇒2股に分かれる 多重分岐:「 switch ~ case 文」⇒3股以上に分かれる. 判断と 分岐. ■ 2重分岐 … 条件式 により2分岐選択制御 [ if 〜 else ] - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: コンピュータ基礎実験  第8 回

コンピュータ基礎実験 第8回

コンピュータープログラミング( C 言語)(5)

1.条件分岐1( if 文、復習)2.条件分岐2( switch,case 文 )

Page 2: コンピュータ基礎実験  第8 回

条件分岐1( if 文、復習)キーボードからの入力や、計算結果に応じて

処理内容を変える場合がありますC 言語では、「2重分岐」と「多重分岐」の

2種類が用意されています2重分岐 : 「 if 文」⇒2股に分かれる多重分岐:「 switch ~ case 文」⇒3股以上に分

かれる

Page 3: コンピュータ基礎実験  第8 回

判断と分岐■ 2重分岐   …条件式により2分岐選択制御 [ if 〜 else]

  if 文     if ( 条件式 )   文 1;   else   文 2;

条件式 (1) 関係演算  … 2つの値の大小関係の比較       (2) 論理演算   … 条件を満たすか否かを判定

3

Page 4: コンピュータ基礎実験  第8 回

■ 1.関係係演算子

意味 数学記号 C 言語

等しい = ==

より大きい > >

より小さい < <

等しいか,より大きい

≧ >=

等しいか,より小さい

≦ <=

等しくない ≠ !=

(Ex.1) a+b = c a+b == c

(Ex.2) a+b ≧c a+b >= c

4

条件式の書き方

Page 5: コンピュータ基礎実験  第8 回

意味 名前 C 言語での表現A, B の両者とも成立すれば 真 論理積

ANDA && B

A, B のどちらかが成立すれば  真

論理和OR

A || B

A が成立しなければれば 真 否定NOT

!A

■ 2.論理演算子A, B のそれぞれを条件式として

(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

5

( 注 ) || よりも && の方が優先順位は高い. 同じ順位の間では左から順  に評価される.また, ( ) でくくってあればその中が先に評価される.

Page 6: コンピュータ基礎実験  第8 回

「 if 文」の書き方(コツ)If 文は、カッコが多いので、先にカッコを書

いてしまうのがコツです。

後から ( ) 内に条件式、 { } 内に文を書きます。

if(){}else{}

if(x>=0){ printf(”|x|=%f\n”,x);}else{ printf(”|x|=%f\n”,-x);}

頭をそろえる(インデント)

カッコ類は左の例のようにそろえると見やすいです(他のスタイルもあります)

•( )内に条件式: x>=0•初めの { } 内に文1 : printf(”|x|=%f\n”,x);•次の { } 内に文2: printf(”|x|=%f\n”,-x);

Page 7: コンピュータ基礎実験  第8 回

前回課題 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を試みよ.

7

(注) 平方根の計算が必要になるので   #include<stdio.h>  のつぎに  #include<math.h>  を書き加えること

Page 8: コンピュータ基礎実験  第8 回

前回課題7 - 4の条件わけ2次方程式は判別式「 d=b*b-4*a*c 」で解が

分類されます「 d が 0 か?」と「 d が正か負か?」の2段

階で条件わけしてみます。D=0?

重解

D > 0?

2実解 2複素解

一段階目

二段階目Yes

No

Yes

No

Page 9: コンピュータ基礎実験  第8 回

枠の準備二段階の枠を先に準備して、それから条件

を入力しますif( ){}else{ if( ){ } else{ }}

if( d==0){ 重解の時の文 ;}else{ if( d>0 ){ 2実解の時の文 ; } else{ 2複素解の時の文 ; }}

Page 10: コンピュータ基礎実験  第8 回

フローチャートとソースフローチャートとプログラムソースは一対

一に対応していますif( d==0){ 重解の時の文 ;}else{ if( d>0 ){ 2実解の時の文 ; } else{ 2複素解の時の文 ; }}

D=0?

重解

D > 0?

2実解

2複素解

一段階目

二段階目Yes

No

Yes

No

Page 11: コンピュータ基礎実験  第8 回

複素解の表し方複素解のとき、どうやって複素数を表せばい

いでしょう?複素数:「実部」と「虚部」「実部」+「虚部」 i

解の公式による実部と虚部実部: e=-b/2/a 、虚部: f=±sqrt(4*a*c-b*b)

「 printf(”%f + %f i”,e,f); 」

Page 12: コンピュータ基礎実験  第8 回

前回課題7 - 4回答例ex7-4.c

12

Ex7-4.c: #include <stdio.h>#include <math.h>

int main(void){ float a,b,c,d;

printf("2 次方程式の係数 a, b, c をいれてください( ax^2+bx+c=0 ) : "); scanf("%f %f %f",&a,&b,&c); d=b*b-4*a*c;

if(d==0){ printf(" 重解 :\n x=%f\n",-b/2/a); } else{ if(d>0){ printf(" 相異なる実数解 :\n x=%f, %f\n",(-b+sqrt(d))/2/a,(-b-sqrt(d))/2/a); } else{ printf(" 相異なる複素数解 :\n x=%f+%fi, %f-%fi\n",-b/2/a,sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a); } } return 0;}

Page 13: コンピュータ基礎実験  第8 回

条件分岐 2 ( switch 、 case 文)多重分岐(3重以上)には、 switch 、 case

文を使います多重分岐は、2重分岐の多段化(例:2次方

程式の解 ex7-4.c )でも可能ですが、見づらく、 switch 、 case 文のほうが見やすくなる場合があります。

どちらを使っても結果は同じです。見やすい(慣れている)方を使ってください。

Page 14: コンピュータ基礎実験  第8 回

switch ( 式 ){case 定数 1: 文

1;break;

case 定数 2: 文2;

break; …………..default: 文 ;

}

switch 文

式の値が 定数1と等しければ 文1を実行 定数2と等しければ 文2を実行  …… .   それ以外なら 文 を実行

(注) 1. case 1 など のあとにコロン (:) が必要. 2. break に出会うと switch{} から抜ける. break がないとそれ以下の文を実行する. 3.どれとも一致しなければ default ( 省略することも可能) 14

switch 、 case 文

Page 15: コンピュータ基礎実験  第8 回

/* ex. 8-1   */#include <stdio.h>int main(void){

int n;

printf(" 曜日の番号 (1…7) を入力してください :");

scanf("%d", &n);printf(" この日は何曜日? : ");switch(n){

case 1: printf(" 月曜日 \n");break;

case 2: printf(" 火曜日 \n");break;

case 3: printf(" 水曜日 \n");break;

    -----   (中略) -----case 7: printf(" 日曜日 \n");

break;default: printf(" 入力番号が正しくあ

りません . \n");}

}

switch ( 式 ){case 定数 1:

文 1;break;

case 定数 2: 文 2;break;

…………..default: 文 ;

}

switch 文

15

Page 16: コンピュータ基礎実験  第8 回

( 注 )switch 文は文字 (char 型 )でも受けられる

/* ex. 8-1a   */#include <stdio.h>int main(void){

char x;

printf(“ 曜日の記号 (a…g) を入力してください :");

scanf("%c", &x);printf(" この日は何曜日? : ");switch(x){

case 'a': printf(" 月曜日 \n");break;

case 'b': printf(" 火曜日 \n");break;

case 'c': printf(" 水曜日 \n");break;

    -----   (中略) -----case 'g': printf(" 日曜日 \n");

break;default: printf(" 入力記号が正しくあり

ません . \n");}

}

注意!

16

Page 17: コンピュータ基礎実験  第8 回

switch ( 式 ){case 定数 1:

case 定数 2: 文 1;break;

case 定数 3: 文 3;break;

…………..default: 文 ;

}

( 注 )switch 文では複数の case 句をまとめることもできる

/* ex. 8-1b   */#include <stdio.h>int main(void){

int n;

printf(" 曜日の番号 (0= 日, 1= 月, 2= 火,… ,6= 土 ) を入力してください :");

scanf("%d", &n);printf(" この日は何曜日? : ");switch(n){

case 1: case 2: case 3: case 4: case 5: printf(" 平日です. \n");

break;case 6: case 0: printf(" 週末です. \n");

break;default: printf(" 入力番号が正しく

ありません .\n");}return 0;

}17

Page 18: コンピュータ基礎実験  第8 回

例題 8-2: 電卓プログラム1

2実数 a, b を入力し、その後、 1-4 の整数を入力し、 1 なら和、 2 なら差、 3 なら積、 4 なら商を計算するプログラムを作れ ( ex8-2.c )

18

#include <stdio.h>

int main(void){ float a,b; int c;

printf("2 つの実数 a, b を入力してください : "); scanf("%f %f",&a,&b); printf(" a=%f, b=%f\n",a,b); printf(“ 計算の種類( 1: 和、 2: 差、 3:積、 4: 商) : "); scanf("%d",&c);

switch(c){ case 1: printf("%f+%f=%f\n",a,b,a+b); break; case 2: printf("%f-%f=%f\n",a,b,a-b); break; case 3: printf("%f*%f=%f\n",a,b,a*b); break; case 4: printf("%f/%f=%f\n",a,b,a/b); break; default: printf(" 入力が間違っています \n"); } return 0;}

Page 19: コンピュータ基礎実験  第8 回

課題 8-3: 電卓プログラム2

「 12.3 + 45.6 」と入力すると、和、差、積、商を計算するプログラムを作れ。数字と演算子の間はスペースで区切るとし、演算子としては「 + 」「 - 」「 * 」「 / 」の4つがあるとする。( ex8-3.c )

19

•「演算子を表す文字」は char 型変数に記録することができる• 「 1 2 a 」 なら scanf(”%f %f %c”,&a,&b,&c); (a,b float 型、 c

char 型 )•文字は「’」 ( クオート ) で囲むことをわすれるな

Page 20: コンピュータ基礎実験  第8 回

課題 8-4: 今年の月と日を入力し、それが今年の 1月 1日から数えて何日目かを求めるプログラムを作成せよ. ただし、うるう年は考えないとする。 ( ex8-4.c ) ヒント : 前月までの月の合計数に日を加えればよい . (5月 29日なら1月~4月の日の合計 (31+28+31+30)に 29 を 加えればよい)

課題 8-5: 今年 (2015年 ) の 1月 1日は木曜日でした.今年の月と日を入力し,それが何曜日であるかを出力するプログラムを作成せよ.( ex8-5.c ) ヒント:1月1日から数えて何日目かを7で割ったあまりを利用     1月1日(1日目)が木曜なら、1月2日(2日目)は何曜日? 20

Page 21: コンピュータ基礎実験  第8 回

発展課題 8-6:知りたい年月日がその年の元日(これを第1日目とする)から数えて何日目で,大晦日まで何日残っているかを計算するプログラムを作成せよ.ただし,考えている年がうるう年であるか,そうでないかにより計算を区別するものとする.. ( ex8-6.c )

21

Page 22: コンピュータ基礎実験  第8 回

実習結果のレポート• 3つのソースファイル「 ex8-3.c 」、

「 ex8-4.c 」、「 ex8-5.c 」を添付ファイルにしてメールを送ってください。

• 宛先: [email protected]• 件名:コンピューター基礎実験8• 本文:感想および一言

22