21
ココココココココココ ココココココココココココココ C ココ)(6) コココココ コ 1.2( switch コ コココ 、) コココココココ 2.( while コfor コ )

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

  • Upload
    elle

  • View
    64

  • Download
    0

Embed Size (px)

DESCRIPTION

コンピュータ基礎実験  第9 回. コンピュータープログラミング ( C 言語)(6) 1.条件分岐2( switch 文、復習) 2.繰り返し処理( while 文、 for 文 ). 条件分岐 2 (復習、 switch 、 case 文). 多重分岐(3重以上)には、 switch 、 case 文を使います 多重分岐は、2重分岐の多段化でも可能ですが、見づらく、 switch 、 case 文のほうが見やすくなる場合があります。 どちらを使っても結果は同じです。見やすい(慣れている)方を使ってください。. switch 、 case 文. switch 文. - PowerPoint PPT Presentation

Citation preview

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

コンピュータ基礎実験 第9回コンピュータープログラミング( C 言語)(6)1.条件分岐2( switch 文、復習)2.繰り返し処理( while 文、 for 文 )

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

条件分岐 2 (復習、 switch 、 case 文)多重分岐(3重以上)には、 switch 、 case文を使います多重分岐は、2重分岐の多段化でも可能ですが、見づらく、 switch 、 case 文のほうが見やすくなる場合があります。どちらを使っても結果は同じです。見やすい(慣れている)方を使ってください。

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

switch ( 式 ){case 定数 1: 文 1;break;case 定数 2: 文 2;break; …………..default: 文 ;

}

switch 文

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

switch 、 case 文

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

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

4

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

前回発展課題 8-6 その1: ex8-6-1.c

switch(month){ case 1: days=day; rest=m12-days; break; case 2: days=m1+day; rest=m12-days; break; case 3: days=m2+day; rest=m12-days; break; case 4: days=m3+day; rest=m12-days; break; case 5: days=m4+day; rest=m12-days; break; case 6: days=m5+day; rest=m12-days; break; case 7: days=m6+day; rest=m12-days; break; case 8: days=m7+day; rest=m12-days; break; case 9: days=m8+day; rest=m12-days; break; case 10: days=m9+day; rest=m12-days; break; case 11: days=m10+day; rest=m12-days; break; case 12: days=m11+day; rest=m12-days; break; } printf("%d 日目です。あと %d 日残っています。 \n",days,rest); return 0;}

5

#include <stdio.h>

int is_leap_year(int year);

int main(void){ int year, month, day; int days, rest; int ly; int m1=31, m2=59, m3=90, m4=120, m5=151,

m6=181; int m7=212, m8=243, m9=273, m10=304,

m11=334, m12=365;

printf(" 西暦 月 日を入力 : "); scanf("%d %d %d", &year, &month, &day);

ly=is_leap_year(year); m2+=ly; m3+=ly; m4+=ly; m5+=ly; m6+=ly; m7+=ly; m8+=ly; m9+=ly; m10+=ly; m11+=ly; m12+=ly;

「 m2+=ly; 」⇔「 m2=m2+ly; 」

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

前回発展課題 8-6 その2: ex8-6-2.c

6

#include <stdio.h>

int is_leap_year(int year){ /* うるう年なら 1 、そうでなければ 0 を返す */ int m1,m2,m3;

m1=year%400; /* 0 なら 400 で割りきれる */ m2=year%4; /* 0 なら 4 で割りきれる */ m3=year%100; /* 0 なら 100 で割りきれる */

if(m1==0 || (m2==0 && m3!=0)){ printf(“ うるう年です \n"); return 1; } else{ printf(" うるう年ではありません \n"); return 0; }}

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

繰り返し処理コンピュータでは、少しずつ条件を変えながら同じ処理を繰り返す状況がよくでてきます。前回「電卓プログラム2」でも、別の計算を続けてやりたいとき、いちいちプログラムを起動するのは面倒です。C 言語では、繰り返し処理を行うために「 for 文」、「 while 文」が用意されています。「繰り返し」は「ループ」とも呼ばれます

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

繰り返し1:「 for 」ある初期値を与え、それがある条件を満たしている間、同じ処理を繰り返すには、「 for文」を用います。

for ( 初期値の式 ; 条件式 ; ループの終わりに実行する式 ){

文   }

変数に初期値を与え、条件を満たしている場合には「文」を実行する。「文」を実行した後、「ループの終わりに実行する式」を実行し、条件を満たしているか→「文」の実行を繰り返す。

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

例題 9-1:  つぎのプログラムを実行せよ.

■ for 文〜ある操作を,指定した回数だけ繰り返すコマンド/* ex. 9-1   */#include <stdio.h>int main (void){

int i;

for(i=1; i<=10; i++){

printf(" A B C \n");

}return 0;

}

表示したい文字列

変数 i の値を 1 増やしてi=1 から i=10 まで実行[ 実行例 ]

基本構造for( 式 1; 式 2; 式 3)  繰り返す文

式1は,繰り返し操作の初期値式 2 は,条件式で,これを満たせば  繰り返しの操作を実行する式 3 は繰り返しの回数を制御

例題1: ex9-1.c

「 i++; 」⇔「 i=i+1; 」 ( インクリメント )

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

「 for 文」の入れ子課題 6-1:  つぎのプログラムを実行し,結果を比較せよ.

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

int i,j;

for(i=1;i<=10;i++){

for(j=1; j<=10;j++){

printf(”AB ");}

printf(" \n");}return 0;

}

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

int i,j;

for(i=1;i<=10;i++){for(j=1; j<=i;

j++){

printf("AB ");}

printf(" \n");}return 0;

}

例題 2 : ex9-2.c

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

例題 9-3: 整数 n を入力し,1から n までの和を計算するプログラムの例.   ex9-3.c

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

int i,n,wa;printf("1 から n までの和? -->

n を入力して下さい. \n");scanf("%d",&n);

wa=0;for(i=1; i<=n; i++){

wa=wa+i;}printf(" 和は %d です. \n",

wa);return 0;

}

for( 式 1; 式 2; 式 3){  繰り返す文 1;繰り返す文 2;………… ;}

式1は,繰り返し操作の初期値式 2 は,条件式で,これを満たせば  繰り返しの操作を実行する式 3 は繰り返しの回数を制御

■ for 文の基本構造

11

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

配列「繰り返し処理」とともに用いると、非常に便利な機能が「配列」という機能です。「配列」は、ベクトルや行列の成分のように、複数の数字の組み合わせを「添え字」を用いて表す「変数」(数字を記録する箱)のセットです。

a[0] 、 a[1] 、 a[2]… のようにカギ括弧を使う。添え字は 0 からb[0][0] 、 b[0][1]…: 添え字が2変数C[0][0][0] 、 c[0][0][1]… :添え字が3変数

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

例題 9-4 「 for 文」と配列: ex9-4.c前回課題「何日めかプログラム」の改訂版( ex8-6-1.c ex8-6-2.c )

13

#include <stdio.h>int is_leap_year(int year);

int main(void){ int year, month, day; int days, rest; int ly, i; int m[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};

printf(" 西暦 月 日を入力 : "); scanf("%d %d %d", &year, &month, &day);

ly=is_leap_year(year); for(i=2; i<=12; i++){ m[i]+=ly; } days=m[month-1]+day; rest=m[12]-days; printf("%d 日目です。あと %d 日残っています \n",days,rest); return 0;}

#include <stdio.h>

int is_leap_year(int year){ /* うるう年なら 1 、そうでなければ 0 を返す */ int m1,m2,m3;

m1=year%400; /* 0 なら 400 で割りきれる */ m2=year%4; /* 0 なら 4 で割りきれる */ m3=year%100; /* 0 なら 100 で割りきれる */

if(m1==0 || (m2==0 && m3!=0)){ printf(“ うるう年です \n"); return 1; } else{ printf(" うるう年ではありません \n"); return 0; }}

要素数13

m[12]m[0]

繰り返し「 for文」

短くなった!

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

課題 9-5: n 項目までの奇数の和 1+3+5+7… は に等しい。 n項目までの奇数の和を計算するプログラムを「 for 文」を用いて作成し、 n=1, 10, 50, 100 の場合についてこのことを確認せよ。( ex9-5.c)

課題 9-6: 自然対数の底 e(=2.71828…) は次の無限級数で与えられる。

上の無限級数の初めの n 項目までを計算するプログラムを作成せよ。このとき、小数点以下 10 桁 (”%.10f”) で出力せよ。(→ ex9-6.c)WEB 上で e の値を調べ、 n=1, 5, 10, 20 について自分のプログラムで計算し、収束する様子を確認せよ。 (double 変数を使用せよ )注 ) 「 0!= 」 1 です。 

14

n2

12341

1231

121

11

11

!1

0i ie

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

繰り返し2:「 while 」特に初期を与えずに、ある与えられた条件を満たしている間、同じ処理を繰り返すには、「 while 文」を用います。「 while 文」は第一回目の処理を「必ず行うか」または「行わない場合もある」かで、「 while 文」と「 do 〜 while 文」の2種があります。

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

while ( 式 ){ 文   }

■ while 文式が 「真」であるあいだ,文 を繰り返し実行する. (文を実行する前に式を評価するので  初めに式が「偽」であれば1回も実行されない)

do{ 文   } while

( 式 );

■ do 〜 while 文式が 「真」であるあいだ,文 を繰り返し実行する. (文を実行した後で式を評価するので  初めに式が「偽」でも必ず1回は  実行される)お尻の「 ; 」を忘れるな!

16

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

例題 9-7: 電卓プログラム1 (ex8-2.c) の改造 (while 文 )2実数 a, b を入力し、その後、 1-4 の整数を入力し、 1 なら和、 2 なら差、 3 なら積、 4 なら商を表示し、その後 1 を入力すればもう一度、それ以外では終了するするプログラムを作れ ( ex9-7.c )

17

#include <stdio.h>

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

while(d==1){ 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"); } printf(” もう一度 ->1 、終了 ->1 以外 : ”); scanf(”%d”, &d); } return 0;}

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

例題 9-8: 電卓プログラム2 (ex8-3.c) の改造 (do 〜 while 文 )「 12.3 + 45.6 」の様に数学の表記を入力すると、表記に応じて和、差、積、商を何度でも計算するプログラムを作れ。数字と演算子の間はスペースで区切るとし、演算子としては「 + 」「 - 」「 * 」「 / 」の4つがあり、演算子の部分に「 s 」が入力されると計算せずに終了するとする。 ( ex9-8.c )

18

#include <stdio.h>

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

do{ printf(" 計算式を入力(例 123.5 + 43.21 ) : "); scanf("%f %c %f",&a,&c,&b);

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

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

■ 「 for 文」 と 「 while 文」 の関係

for ( 式 1; 式 2; 式 3){    文 }

式 1;while ( 式 2){文  式 3;}

初期 条件判断 再初期化

19

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

課題 9-9: 整数 n を入力し, n 項目までの奇数の和を計算するプログラム(ex9-5.c では for を使って書いた)を, while を使って書き直せ.( ex9-9.c )

20

発展課題 9-10: キーボードから入力された、複数の正の実数について最大値と最小値を求めるプログラムを作成せよ. ただし,データに 0 が入ったら入力を終了するものとする. ( ex9-10.c )

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

実習結果のレポート• 3つのソースファイル「 ex9-5.c 」、「 ex9-6.c 」、「 ex9-9.c 」を添付ファイルにしてメールを送ってください。• 宛先: [email protected]• 件名:コンピューター基礎実験9• 本文:感想および一言

21