繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか...

20
1 第3回 プログラミング入門2 2 条件分岐(2) Switch case 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定 ・月を入力して,その季節を表示 ・うるう年かどうかの判定 1回のプログラム実行で, 1回だけ判定 同じ判定を何回か繰り返すには?

Upload: others

Post on 14-Oct-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

1

第3回 プログラミング入門2 2

  条件分岐(2)   Switch case 文

  繰り返し処理の実現

 ・整数を入力し,その数が5の倍数かどうかを判定  ・月を入力して,その季節を表示

 ・うるう年かどうかの判定 1回のプログラム実行で, 1回だけ判定

同じ判定を何回か繰り返すには?

Page 2: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

2

第2回 プログラミング入門2 3

  ソースファイル名: list0317.c 読み込んだ整数値を3で割った剰余を表示(if文使用)

/* 読み込んだ整数値を3で割った余りを表示 */

#include <stdio.h>

int main(void) {

int  num;

printf("整数を入力してください:"); scanf("%d", &num);

return (0); }

if (num % 3 == 0) puts(“3で割った余りは0です");

else if (num % 3 == 1) puts(" 3で割った余りは1です");

else puts(“3で割った余りは2です");

処理を自分で記述

同じ式が2回登場 → 無駄?

第2回 プログラミング入門2 4

  単一の条件式の値によって,処理を複数に分岐させる場合 → if文よりも簡潔に記述できる!

  ソースファイル名: list0318.c /* 読み込んだ整数値を3で割った余りを表示 */

#include <stdio.h>

int main(void) {

int  num;

printf("整数を入力してください:"); scanf("%d", &num);

switch ( num % 3 ) { case 0 : puts(“3で割り切れます”); break ; case 1 : puts(“余りは1です”); break ; case 2 : puts(“余りは2です”); break ; }

return (0); }

Page 3: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

3

第2回 プログラミング入門2 5

switch ( num % 3 ) {

 case 0 : puts(“3で割り切れます”); break ;  case 1 : puts(“余りは1です”);   break ;   case 2 : puts(“余りは2です”);   break ;

}

条件式①

①の値が 0の場合

(Switch文終了) break で switch文を抜ける

1の場合

2の場合

()カッコ内の式を評価し,case で書かれた 値と一致するところにプログラムの流れを移行

第2回 プログラミング入門2 6

  ソースファイル名: list0319.c

/* switch文の動作を確認するプログラム */ #include <stdio.h>

int main(void) {

int sw;

printf("整数を入力してください:"); scanf("%d", &sw);

switch (sw) {  case 1 : puts("A"); puts("B"); break;  case 2 : puts("C");  case 5 : puts("D"); break;  case 6 :  case 7 : puts("E"); break;  default : puts("F"); break; }

return (0); }

break; がない

break; がない

新しい default : switch文の動作を確認

Page 4: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

4

第2回 プログラミング入門2 7

switch (sw) {

case 1 : puts("A"); puts("B"); break; case 2 : puts("C"); case 5 : puts("D"); break; case 6 : case 7 : puts("E"); break;

default : puts("F"); break;

} “sw” が 1, 2, 5, 6, 7 以外の場合

第2回 プログラミング入門2 8

  Switch文 → 単一の式の値によって,プログラムの流れを分岐

  if 文  → 複数の式の値によって,複雑な条件判断

    を行い,処理を分岐することができる

Page 5: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

5

第3回 プログラミング入門2 9

 同じ処理を繰り返すには・・・   プログラム中に同じ命令を何度も繰り返して書く?

  数回なら良いが,数百回,数千回↑となったら…

 条件により,繰り返し処理をするかをどうかを決定

  C言語では,

  do~ while文   while文   for文

を用途に応じて使い分ける

第3回 プログラミング入門2 10

#include <stdio.h>

int main(void) {

int a, b;

a = 1; b = 8 * a; printf( “%d\n“, b );

a = 2; b = 8 * a; printf( “%d\n“, b );

・・・・・・ ・・・・・・省略 a = 12; b = 8 * a; printf( “%d\n“, b ); return (0);

}

  問)1から100までの8の倍数を全て表示しなさい。

例)

Page 6: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

6

第3回 プログラミング入門2 11

#include <stdio.h>

int main(void) {

int b, i ;

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

b = 8 * i ; printf( “%d\n“, b );

}

return (0); }

  問)1から100までの8の倍数を全て表示しなさい。(for文使用)

例)

for文

第3回 プログラミング入門2 12

ループ本体

  一定回数の繰り返し処理に使用   3つの部分からなる

A B C for ( i=1; i <= 12; i++ ){

b = 8 * i ; printf( “%d\n“, b );

}

A 前処理: 繰り返しを行う前に一度だけ実行

B 制御式: 条件式Bを満たしていれば(非0ならば),ループの本体を実行

C 後処理: ループ本体の最後に実行

i : 繰り返す回数を制御する   ための変数(添え字)

Aでiを1で初期化

Bが満たされているか評価

ループ本体 を実行

Cを実行

ループを脱出

○ ×

Page 7: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

7

第3回 プログラミング入門2 13

ループ本体

A B C for ( i=1; i <= 12; i++ ){

b = 8 * i ; printf( “%d\n“, b );

}

i : 繰り返す回数を制御する   ための変数(添え字)

Aでiを1で初期化

Bが満たされているか評価

ループ本体 を実行

Cを実行

ループを脱出

○ ×

A 前処理: 添え字 i を1で初期化(1からスタート!)

B 制御式: i が12以下の間,ループの本体を実行

C 後処理: ループ本体を実行後, i++ (iの値を1だけ増やす)

第3回 プログラミング入門2 14

  以下のプログラムを,値を変えて実行し,for文の動作を理解せよ。(カウントアップ)

#include <stdio.h>

int main(void) {

int i ;

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

printf( “%d\n“, i );

}

return (0); }

初期化の値 終了条件

いくつずつ値を 増やすか? 例えば,

i += 2 i += 3 などと変更してみると?

Page 8: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

8

第3回 プログラミング入門2 15

  以下のプログラムを,値を変えて実行し,for文の動作を理解せよ。(カウントダウン)

#include <stdio.h>

int main(void) {

int i ;

for ( i=12; i >=1 ; i-- ){

printf( “%d\n“, i );

}

return (0); }

変更!

第3回 プログラミング入門2 16

  読み込んだ整数の個数だけ,*を連続表示   ソースファイル名: list0413.c (p.76)

#include <stdio.h>

int main(void) {

int i, no;

printf(“input number:"); scanf("%d", &no);

for (i = 1; i <= no; i++) putchar( ’*’ );

putchar('\n');

return (0); }

文が一つだけなら, For文の{ }は省略可能 (if文と同様)

putchar ( ’*’ );  ’’内の1文字を出力する命令

Page 9: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

9

第3回 プログラミング入門2 17

for (i = 1; i <= no; i++) putchar( ’*’ );

for (i = 0; i < no; i++) putchar( ’*’ );

0 ~ n-1 まで, n回の繰り返し

1 ~ nまで, n回の繰り返し

第3回 プログラミング入門2 18

  整数を入力し,それが5の倍数かどうかを判定する。   判定後,もう一度処理を続けるかどうかを確認して,要望に応じて処理を繰り返す

→ プログラムを起動しなおす必要がなく,何度でも繰り返すことが可能となる!!

Page 10: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

10

第3回 プログラミング入門2 19

#include <stdio.h>

int main(void) {

int cont; int no;

do {

printf("input number : "); scanf( "%d", &no );

if( no % 5 ) puts("5の倍数ではない"); else puts("5の倍数です");

printf("Continue? Yes=0, No=9 : "); scanf("%d", &cont);

} while(cont == 0); return(0);

}

これまでのプログラム

繰り返し制御 (do ~ while文)

・ファイル名  : list0401.c (p.60)

第3回 プログラミング入門2 20

do { 文 } while(式) 構文

• 「文」をまずは必ず一回は実行 • その後,式の値を評価し,

• 式の結果が非0(真)だったら、再度文を実行 • 式の結果が0(偽)だったら、繰り返し処理(ループ)を抜ける

do { 命令文 printf("Continue? Yes=0, No=9 : "); scanf("%d", &cont);

} while (cont == 0);

cont は0

cont は非0

Page 11: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

11

第3回 プログラミング入門2 21

  ソースファイル名: list0404.c   1から5までの和を求めて表示   ポイント: do文の動作理解と変数の初期化

#include <stdio.h>

int main(void) {

int no = 1; int sum = 0;

do {

    sum = sum + no;     no = no + 1;

} while (no <= 5);

printf( “1+2+3+4+5= %d\n", sum); return(0);

}

注目!

第3回 プログラミング入門2 22

  初期化: 変数の生成時に,指定された値である初期値を格納

int no = 1; 変数 no を宣言し,1で初期化

変数宣言と初期化を同時に行う場合

変数宣言と初期化を別に行う場合

int no; no = 1;

変数 no を宣言 noに1を代入

変数を宣言する時には,特に不要でない限り,

必ず初期化を行うこと!!

重要

初期化しない場合,変数には適当な値 がセットされている(値の保証がない)

Page 12: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

12

第3回 プログラミング入門2 23

  List 4-4 : 1から5までの和を求めるプログラム

int no = 1; int sum = 0;

do {     sum = sum + no;     no = no + 1;

} while (no <= 5);

noを初期化(これを1~5まで変化させる) 和を格納するための変数

no が5以下の間,繰り返す

ループ1回目  sum = 0 + 1;  no = 1 + 1;  → sum=1, no=2

ループ2回目  sum = 1 + 2;  no = 2 + 1;  → sum=3, no=3

ループ3回目  sum = 3+ 3;  no = 3 + 1;  → sum=6, no=4

ループ4回目  sum = 6 + 4;  no = 4 + 1;  → sum=10, no=5

ループ5回目  sum = 10+ 5;  no = 5 + 1;  → sum=15, no=6

while (no <= 5); 条件満たさず

ループ脱出!

第3回 プログラミング入門2 24

  複合代入演算子   演算と代入を同時に実行

sum = sum + no;   → 元々のsumの値にnoを足した値を,新しいsumとする(代入)

no = no + 1; → 元々のnoの値に1を足した値を,新しいnoとする(代入)

sum += no; no += 1;

他に,-=, *=, /=, %= など

複合代入演算子を用いて 簡単に表すと・・・

sumの値をnoだけ増やす

noの値を1だけ増やす

Page 13: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

13

第3回 プログラミング入門2 25

  複合代入演算子   演算と代入を同時に実行

sum = sum + no;   → 元々のsumの値にnoを足した値を,新しいsumとする(代入)

no = no + 1; → 元々のnoの値に1を足した値を,新しいnoとする(代入)

sum += no; no += 1;

他に,-=, *=, /=, %= など

複合代入演算子を用いて 簡単に表すと・・・

sumの値をnoだけ増やす

noの値を1だけ増やす

第3回 プログラミング入門2 26

 後置増分・減分演算子   変数の値を1つだけ増やす,減らす

no = no + 1; → 元々のnoの値に1を足した値を,新しいnoとする(代入)

no += 1;

複合代入演算子を用いて 簡単に表すと・・・

noの値を1だけ増やす

後置増分演算子を用いて 簡単に表すと・・・

no++; 後置増分演算子

no = no – 1;

no -= 1;

no -- ; 後置減分演算子

Page 14: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

14

第3回 プログラミング入門2 27

#include <stdio.h>

int main(void) {

int i ;

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

printf( “%d\n“, i );

}

return (0); }

i+=2 iを2づつ増やす

第3回 プログラミング入門2 28

・list0404を複合代入演算子,後置増分演算子を使って書き換えよ。

#include <stdio.h>

int main(void) {

int no = 1; int sum = 0;

do {

    sum += no;     no ++;

} while (no <= 5);

printf( “1+2+3+4+5= %d\n", sum); return(0);

}

Page 15: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

15

第3回 プログラミング入門2 29

  List4-6を do-while文でなく,for文で実現せよ。   時間: 5分

#include <stdio.h>

int main(void) {

int i; int sum = 0;

for ( i=1; i <=5; i++) {     sum += i; }

printf( “1+2+3+4+5= %d\n", sum); return(0);

}

第3回 プログラミング入門2 30

while(式){  文   } 構文

•  式の値を評価し, • 式の結果が非0(真)の間,文を繰り返し実行 • 式の結果が0(偽)だったら、繰り返し処理(ループ)を抜ける

  最も簡単な繰り返し制御文   条件によっては,一度も文を実行しないこともある。 → do, while文は必ず一度文を実行

Page 16: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

16

第3回 プログラミング入門2 31

  ソースファイル名: loop.c

#include <stdio.h>

int main(void) {

int i=0;

while ( 1 ) {     i++; printf( “羊が%d匹”, i ); } return(0);

}

常に非0(真)! 無限に繰り返す!

見飽きたら,CTRL+C で終了!

第3回 プログラミング入門2 32

  100匹目まで数えたら,寝る #include <stdio.h>

int main(void) {

int i;

i = 0; while (       ) {     i++; printf( “羊が%d匹\n”, i ); } printf( “グーグー\n” );

return(0); }

  ?

for文と同じような動作

カウンタ変数の初期化

繰り返しの条件

カウンタ変数のカウントアップ

Page 17: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

17

第3回 プログラミング入門2 33

i = 0;

while ( i < 100 ) {     i++; printf( “羊が%d匹\n”, i ); }

  For文: カウンタ変数の初期化と増減のさせ方,終了条件をまとめて記述 → 見やすく簡潔な表現!!

for ( i=1; i <= 100; i++ ) { printf( “羊が%d匹\n”, i ); }

カウンタ変数の初期化

繰り返しの条件

カウンタ変数のカウントアップ

まとめて記述!

第3回 プログラミング入門2 34

  ソースファイル名: break.c

#include <stdio.h>

int main(void) {

int i ;

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

if( i == 5 ){ break; } printf( “%d\n“, i );

}

return (0); }

ループを 強制的に脱出

Page 18: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

18

第3回 プログラミング入門2 35

  ソースファイル名: continue.c

#include <stdio.h>

int main(void) {

int i ;

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

if( i == 5 ){ continue; } printf( “%d\n“, i );

}

return (0); }

iが5の時だけ, ループを飛ばす

第3回 プログラミング入門2 36

  while文   最も単純

  ある条件の真・偽で繰り返すかどうかを判定

  場合によっては,一度も文を実行しないこともある

  do~while文   ある条件の真・偽で繰り返すかどうかを判定

  必ず一度は文を実行 → 一度処理を実行し,その後キーボードからの入力により 繰り返し処理を行うかどうかを決める場合に有効

  for文   一定回数だけ処理を繰り返す場合,while文よりも見やすく記述できる

※ループを強制的に終了: break ※ループをスキップ: continue

Page 19: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

19

第3回 プログラミング入門2 37

1.Switch文を使用し,月を数字で読込み,その月が何日あるかを表示するプログラムを作れ。なお、1~12以外の数字を入力した際には、”1~12までの数字を入力してください”と表示すること。

  ただし,

   ・2月 →28日    ・ 4, 6, 9, 11  → 30日    ・1,3,5,7,8,10,12 → 31日

ファイル名:kadai3-1.c

2. 読み込まれた整数値以下である正の2のべき乗の数を昇順(小さい順)に表示するプログラムを作成せよ。 例) 整数を入力してください : 19    2 4 8 16  ファイル名:kadai3-2.c

3.Kadai3-1 で作成した月を数字で読込み,その月が何日あるかを表示するプ   ログラムを,繰り返して判定できるように変更せよ。ただし,0を入力した時に,ループを終了するようにせよ。

(do – while文を使用) ファイル名:kadai3-3.c ポイント:入力された数が0でない間,処理を繰り返す

第3回 プログラミング入門2 38

4.キーボードから生徒数を整数で入力し,その人数分のテストの点数  (0点~100点満点)を入力,点数の合計点と平均点を表示する  プログラムを作成せよ。

ファイル名:kada3-4.c

注)

 ・人数分の点数の読込みと合計点算出には,繰り返し文を用いること!

 ・平均点は小数で求めること。

Page 20: 繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか …yaoki/pro2/pro2-03.pdf · 条件分岐(2) Switch case 文 繰り返し処理の実現 ・整数を入力し,その数が5の倍数かどうかを判定

20

第3回 プログラミング入門2 39

 次回講義内容

 配列

同じ型のデータの集合を効率良く扱うには?