1 / 21

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

コンピュータ基礎実験  第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 ]

ciaran-fry
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. コンピュータ基礎実験 第8回 コンピュータープログラミング (C言語)(5) 1.条件分岐1(if文、復習) 2.条件分岐2(switch,case文)

  2. 条件分岐1(if文、復習) • キーボードからの入力や、計算結果に応じて処理内容を変える場合があります • C言語では、「2重分岐」と「多重分岐」の2種類が用意されています • 2重分岐: 「if文」⇒2股に分かれる • 多重分岐:「switch~case文」⇒3股以上に分かれる

  3. 判断と分岐 ■ 2重分岐 …条件式により2分岐選択制御 [ if 〜 else]  if 文 if (条件式) 文1; else 文2; 条件式 (1)関係演算 … 2つの値の大小関係の比較 (2) 論理演算 … 条件を満たすか否かを判定

  4. ■ 1.関係係演算子 条件式の書き方 (Ex.1) a+b= c a+b== c (Ex.2) a+b≧c a+b>= c

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

  6. 「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); 頭をそろえる(インデント)

  7. 前回課題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> を書き加えること

  8. 前回課題7-4の条件わけ • 2次方程式は判別式「d=b*b-4*a*c」で解が分類されます • 「dが0か?」と「dが正か負か?」の2段階で条件わけしてみます。 No D=0? D>0? 一段階目 No Yes 二段階目 Yes 2複素解 2実解 重解

  9. 枠の準備 • 二段階の枠を先に準備して、それから条件を入力します if( ){ } else{ if( ){ } else{ } } if( d==0){ 重解の時の文; } else{ if( d>0 ){ 2実解の時の文; } else{ 2複素解の時の文; } }

  10. フローチャートとソース • フローチャートとプログラムソースは一対一に対応しています if( d==0){ 重解の時の文; } else{ if( d>0 ){ 2実解の時の文; } else{ 2複素解の時の文; } } No 一段階目 D=0? D>0? No Yes 二段階目 Yes 2複素解 2実解 重解

  11. 複素解の表し方 • 複素解のとき、どうやって複素数を表せばいいでしょう? • 複素数:「実部」と「虚部」 • 「実部」+「虚部」 i • 解の公式による実部と虚部 • 実部:e=-b/2/a、虚部:f=±sqrt(4*a*c-b*b) 「printf(”%f + %f i”,e,f);」

  12. 前回課題7-4回答例ex7-4.c 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); } }

  13. 条件分岐2(switch、case文) • 多重分岐(3重以上)には、switch、case文を使います • 多重分岐は、2重分岐の多段化(例:2次方程式の解ex7-4.c)でも可能ですが、見づらく、switch、case文のほうが見やすくなる場合があります。 • どちらを使っても結果は同じです。見やすい(慣れている)方を使ってください。

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

  15. /* ex. 8-1 */ #include <stdio.h> int main(void) { intDayNumber; printf("曜日の番号 (1…7) を入力してください:"); scanf("%d", &DayNumber); printf("この日は何曜日?: "); switch(DayNumber){ case 1: printf(" 月曜日 \n"); break; case 2: printf(" 火曜日 \n"); break; case 3: printf(" 水曜日 \n"); break; -----  (中略) ----- case 7: printf(" 日曜日 \n"); break; default: printf("入力番号が正しくありません. \n"); } } switch 文 switch (式){ case 定数1: 文1; break; case 定数2: 文2; break; ………….. default: 文;}

  16. /* 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"); } } (注) switch 文は 文字(char型) でも受けられる 注意!

  17. /* ex. 8-1b */ #include <stdio.h> Iint main(void) { intDayNumber; printf("曜日の番号 (0=日,1=月,2=火,…,6=土) を入力してください:"); scanf("%d", &DayNumber); printf("この日は何曜日?: "); switch(DayNumber){ case 1: case 2: case 3: case 4: case 5: printf(" 平日です. \n"); break; case 6: case 0: printf(" 週末です. \n"); break; default: printf("入力番号が正しくありません.\n"); } } (注) switch 文では 複数のcase句 をまとめることも できる switch (式){ case 定数1: case 定数2: 文1; break; case 定数3: 文3; break; ………….. default: 文;}

  18. 例題8-2: 電卓プログラム1 2実数a,bを入力し、その後、1-4の整数を入力し、1なら和、2なら差、3なら積、4なら商を計算するプログラムを作れ(ex8-2.c ) #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"); } }

  19. 課題8-3: 電卓プログラム2 「12.3 + 45.6」と入力すると、和、差、積、商を計算するプログラムを作れ。数字と演算子の間はスペースで区切るとし、演算子としては「+」「-」「*」「/」の4つがあるとする。(ex8-3.c ) • 「演算子を表す文字」はchar型変数に記録することができる • 文字は「’」(クオート)で囲むことをわすれるな

  20. 課題8-4: 今年の月と日を入力し、それが今年の1月1日から数えて何日目かを求めるプログラムを作成せよ. ( ex8-4.c ) ヒント: 前月までの月の合計数に日を加えればよい。 (5月29日なら1月~4月の日の合計に29を加えればよい) 課題8-5: 今年(2014年)の1月1日は水曜日でした.今年の月と日を入力し,それが何曜日であるかを出力するプログラムを作成せよ. (ex8-5.c ) 発展課題8-6: 知りたい年月日がその年の元日(これを第1日目とする)から数えて何日目で,大晦日まで何日残っているかを計算するプログラムを作成せよ.ただし,考えている年がうるう年であるか,そうでないかにより計算を区別するものとする..(ex8-6.c )

  21. 実習結果のレポート • 3つのソースファイル「ex8-3.c」、「ex8-4.c」、「ex8-5.c」を添付ファイルにしてメールを送ってください。 • 宛先: muroo@cc.tuat.ac.jp • 件名:コンピューター基礎実験8 • 本文:感想および一言

More Related