繰り返し処理の実現 ・整数を入力し,その数が の倍数かどうか...
TRANSCRIPT
1
第3回 プログラミング入門2 2
条件分岐(2) Switch case 文
繰り返し処理の実現
・整数を入力し,その数が5の倍数かどうかを判定 ・月を入力して,その季節を表示
・うるう年かどうかの判定 1回のプログラム実行で, 1回だけ判定
同じ判定を何回か繰り返すには?
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); }
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文の動作を確認
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 文 → 複数の式の値によって,複雑な条件判断
を行い,処理を分岐することができる
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の倍数を全て表示しなさい。
例)
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を実行
ループを脱出
○ ×
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 などと変更してみると?
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文字を出力する命令
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の倍数かどうかを判定する。 判定後,もう一度処理を続けるかどうかを確認して,要望に応じて処理を繰り返す
→ プログラムを起動しなおす必要がなく,何度でも繰り返すことが可能となる!!
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
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を代入
変数を宣言する時には,特に不要でない限り,
必ず初期化を行うこと!!
重要
初期化しない場合,変数には適当な値 がセットされている(値の保証がない)
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だけ増やす
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 -- ; 後置減分演算子
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);
}
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文は必ず一度文を実行
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文と同じような動作
カウンタ変数の初期化
繰り返しの条件
カウンタ変数のカウントアップ
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); }
ループを 強制的に脱出
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
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
注)
・人数分の点数の読込みと合計点算出には,繰り返し文を用いること!
・平均点は小数で求めること。
20
第3回 プログラミング入門2 39
次回講義内容
配列
同じ型のデータの集合を効率良く扱うには?