...

1回のプログラム実行で

by user

on
Category: Documents
2

views

Report

Comments

Transcript

1回のプログラム実行で
  条件分岐(2)
  Switch case 文
  繰り返し処理の実現
・整数を入力し,その数が5の倍数かどうかを判定
・月を入力して,その季節を表示
1回のプログラム実行で,
・うるう年かどうかの判定
1回だけ判定
同じ判定を何回か繰り返すには?
第3回
プログラミング入門2
2
1
  ソースファイル名: list0317.c 読み込んだ整数値を3で割った
剰余を表示(if文使用)
/* 読み込んだ整数値を3で割った余りを表示 */
#include <stdio.h>
int main(void)
{
int num;
printf("整数を入力してください:");
scanf("%d", &num);
同じ式が2回登場 → 無駄?
if (num % 3 == 0)
puts(“3で割った余りは0です");
else if (num % 3 == 1)
puts(" 3で割った余りは1です");
else
puts(“3で割った余りは2です");
処理を自分で記述
return (0);
}
第2回
プログラミング入門2
3
  単一の条件式の値によって,処理を複数に分岐させる場合
→ 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);
}
第2回
プログラミング入門2
4
2
条件式①
switch ( num % 3 ) {
①の値が
0の場合
case 0 : puts(“3で割り切れます );
break ;
case 1 : puts(“余りは1です );
break ;
case 2 : puts(“余りは2です );
break ;
1の場合
2の場合
}
(Switch文終了)
break で switch文を抜ける
()カッコ内の式を評価し,case で書かれた
値と一致するところにプログラムの流れを移行
プログラミング入門2
第2回
5
  ソースファイル名: list0319.c
/* switch文の動作を確認するプログラム */
#include <stdio.h>
int main(void)
{
int
sw;
printf("整数を入力してください:");
scanf("%d", &sw);
switch (sw) {
case 1 : puts("A");
case 2 : puts("C");
case 5 : puts("D");
case 6 :
case 7 : puts("E");
default : puts("F");
}
return (0);
}
第2回
puts("B"); break;
break;
break;
break;
新しい default :
break; がない
break; がない
switch文の動作を確認
プログラミング入門2
6
3
switch (sw) {
case 1
case 2
case 5
case 6
case 7
: puts("A"); puts("B"); break;
: puts("C");
: puts("D"); break;
:
: puts("E"); break;
default : puts("F"); break;
}
“sw” が 1, 2, 5, 6, 7 以外の場合
第2回
プログラミング入門2
7
  Switch文
→ 単一の式の値によって,プログラムの流れを分岐
  if 文
→ 複数の式の値によって,複雑な条件判断
を行い,処理を分岐することができる
第2回
プログラミング入門2
8
4
  同じ処理を繰り返すには・・・
 
 
プログラム中に同じ命令を何度も繰り返して書く?
数回なら良いが,数百回,数千回↑となったら…
  条件により,繰り返し処理をするかをどうかを決定
  C言語では,
 
 
 
do∼ while文
while文
for文
を用途に応じて使い分ける
プログラミング入門2
第3回
9
  問)1から100までの8の倍数を全て表示しなさい。
例) #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);
}
第3回
プログラミング入門2
10
5
  問)1から100までの8の倍数を全て表示しなさい。(for文使用)
例) #include
<stdio.h>
int main(void)
{
int
b, i ;
for ( i=1; i <= 12; i++ ){
b=8*i;
printf( “%d\n“, b );
for文
}
return (0);
}
  一定回数の繰り返し処理に使用
  3つの部分からなる
A
B
i : 繰り返す回数を制御する
ための変数(添え字)
C
for ( i=1; i <= 12; i++ ){
Aでiを1で初期化
b=8*i;
printf( “%d\n“, b );
Bが満たされているか評価
×
ループ本体
}
11
プログラミング入門2
第3回
A 前処理: 繰り返しを行う前に一度だけ実行
ループを脱出
○
ループ本体
を実行
Cを実行
B 制御式: 条件式Bを満たしていれば(非0ならば),ループの本体を実行
C 後処理: ループ本体の最後に実行
第3回
プログラミング入門2
12
6
A
B
C
i : 繰り返す回数を制御する
ための変数(添え字)
for ( i=1; i <= 12; i++ ){
b=8*i;
printf( “%d\n“, b );
Aでiを1で初期化
Bが満たされているか評価
ループ本体
}
×
ループを脱出
A 前処理: 添え字 i を1で初期化(1からスタート!)
○
ループ本体
を実行
Cを実行
B 制御式: i が12以下の間,ループの本体を実行
C 後処理: ループ本体を実行後, i++ (iの値を1だけ増やす)
13
プログラミング入門2
第3回
  以下のプログラムを,値を変えて実行し,for文の動作を理解
せよ。(カウントアップ)
#include <stdio.h>
int main(void)
{
int
i;
初期化の値 終了条件
for ( i=1; i <= 12; i++ ){
printf( “%d\n“, i );
}
いくつずつ値を
増やすか?
例えば,
i += 2
i += 3
などと変更してみると?
return (0);
}
第3回
プログラミング入門2
14
7
  以下のプログラムを,値を変えて実行し,for文の動作を理解
せよ。(カウントダウン)
#include <stdio.h>
int main(void)
{
int
i;
for ( i=12; i >=1 ; i-- ){
変更!
printf( “%d\n“, i );
}
return (0);
}
プログラミング入門2
第3回
15
  読み込んだ整数の個数だけ,*を連続表示
  ソースファイル名: list0413.c (p.76)
#include <stdio.h>
int main(void)
{
int
i, no;
printf(“input number:");
scanf("%d", &no);
文が一つだけなら,
For文の{ }は省略可能
(if文と同様)
for (i = 1; i <= no; i++)
putchar( ’*’ );
putchar('\n');
putchar ( ’* );
return (0);
}
第3回
内の1文字を出力する命令
プログラミング入門2
16
8
for (i = 1; i <= no; i++)
putchar( ’*’ );
1 ∼ nまで,
n回の繰り返し
for (i = 0; i < no; i++)
putchar( ’*’ );
0 ∼ n-1 まで,
n回の繰り返し
第3回
プログラミング入門2
17
  整数を入力し,それが5の倍数かどうかを判定する。
  判定後,もう一度処理を続けるかどうかを確認して,要望に応じて処
理を繰り返す
→ プログラムを起動しなおす必要がなく,何度でも繰り返すことが可能とな
る!!
第3回
プログラミング入門2
18
9
#include <stdio.h>
・ファイル名
: list0401.c (p.60)
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);
繰り返し制御
(do ∼ while文)
} while(cont == 0);
return(0);
}
19
プログラミング入門2
第3回
構文
do { 文 } while(式)
• 「文」をまずは必ず一回は実行
• その後,式の値を評価し,
• 式の結果が非0(真)だったら、再度文を実行
• 式の結果が0(偽)だったら、繰り返し処理(ループ)を抜ける
do {
命令文
printf("Continue? Yes=0, No=9 : ");
scanf("%d", &cont);
cont は0
} while (cont == 0);
cont は非0
第3回
プログラミング入門2
20
10
  ソースファイル名: 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);
}
プログラミング入門2
第3回
21
  初期化: 変数の生成時に,指定された値である初期値を格納
変数宣言と初期化を同時に行う場合
int no = 1;
変数 no を宣言し,1で初期化
変数宣言と初期化を別に行う場合
int no;
no = 1;
変数 no を宣言
noに1を代入
重要
変数を宣言する時には,特に不要でない限り,
必ず初期化を行うこと!!
初期化しない場合,変数には適当な値
がセットされている(値の保証がない)
第3回
プログラミング入門2
22
11
  List 4-4 : 1から5までの和を求めるプログラム
int no = 1;
int sum = 0;
noを初期化(これを1∼5まで変化させる)
和を格納するための変数
do {
sum = sum + no;
no = no + 1;
} while (no <= 5);
ループ1回目
sum = 0 + 1;
no = 1 + 1;
→ sum=1, no=2
ループ4回目
sum = 6 + 4;
no = 4 + 1;
→ sum=10, no=5
ループ2回目
sum = 1 + 2;
no = 2 + 1;
→ sum=3, no=3
ループ5回目
sum = 10+ 5;
no = 5 + 1;
→ sum=15, no=6
no が5以下の間,繰り返す
ループ3回目
sum = 3+ 3;
no = 3 + 1;
→ sum=6, no=4
while (no <= 5);
条件満たさず
ループ脱出!
プログラミング入門2
第3回
23
  複合代入演算子
 
演算と代入を同時に実行
sum = sum + no; → 元々のsumの値にnoを足した値を,新しいsumとする(代入)
no = no + 1;
→ 元々のnoの値に1を足した値を,新しいnoとする(代入)
複合代入演算子を用いて
簡単に表すと・・・
sum += no;
no += 1;
sumの値をnoだけ増やす
noの値を1だけ増やす
他に,-=, *=, /=, %= など
第3回
プログラミング入門2
24
12
  複合代入演算子
 
演算と代入を同時に実行
sum = sum + no; → 元々のsumの値にnoを足した値を,新しいsumとする(代入)
no = no + 1;
→ 元々のnoの値に1を足した値を,新しいnoとする(代入)
複合代入演算子を用いて
簡単に表すと・・・
sum += no;
no += 1;
sumの値をnoだけ増やす
noの値を1だけ増やす
他に,-=, *=, /=, %= など
25
プログラミング入門2
第3回
  後置増分・減分演算子
 
変数の値を1つだけ増やす,減らす
no = no + 1;
→ 元々のnoの値に1を足した値を,新しいnoとする(代入)
複合代入演算子を用いて
簡単に表すと・・・
no += 1;
noの値を1だけ増やす
後置増分演算子を用いて
簡単に表すと・・・
no = no – 1;
no -= 1;
no -- ;
no++;
後置減分演算子
後置増分演算子
第3回
プログラミング入門2
26
13
#include <stdio.h>
int main(void)
{
int
i;
for ( i=1; i <= 12; i++ ){
printf( “%d\n“, i );
i+=2
iを2づつ増やす
}
return (0);
}
プログラミング入門2
第3回
27
・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);
}
第3回
プログラミング入門2
28
14
  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
29
構文
while(式){ 文 }
•  式の値を評価し,
• 式の結果が非0(真)の間,文を繰り返し実行
• 式の結果が0(偽)だったら、繰り返し処理(ループ)を抜ける
  最も簡単な繰り返し制御文
  条件によっては,一度も文を実行しないこともある。
→ do, while文は必ず一度文を実行
第3回
プログラミング入門2
30
15
  ソースファイル名: loop.c
#include <stdio.h>
int main(void)
{
int i=0;
常に非0(真)!
無限に繰り返す!
while ( 1 ) {
i++;
printf( “羊が%d匹”, i );
}
return(0);
見飽きたら,CTRL+C で終了!
}
プログラミング入門2
第3回
31
  100匹目まで数えたら,寝る
#include <stdio.h>
int main(void)
{
int i;
カウンタ変数の初期化
i = 0;
繰り返しの条件
?
while ( )
{
カウンタ変数のカウントアップ
i++;
printf( “羊が%d匹\n”, i );
}
printf( “グーグー\n” );
return(0);
}
第3回
for文と同じような動作
プログラミング入門2
32
16
i = 0;
カウンタ変数の初期化
繰り返しの条件
while ( i < 100 ) {
カウンタ変数のカウントアップ
i++;
printf( “羊が%d匹\n”, i );
}
for ( i=1; i <= 100; i++ ) {
printf( “羊が%d匹\n”, i );
}
まとめて記述!
  For文: カウンタ変数の初期化と増減のさせ方,終了条
件をまとめて記述 → 見やすく簡潔な表現!!
プログラミング入門2
第3回
33
  ソースファイル名: 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);
}
第3回
プログラミング入門2
34
17
  ソースファイル名: continue.c
#include <stdio.h>
int main(void)
{
int
i;
for ( i=0; i < 10; i++ ){
if( i == 5 ){
continue;
}
printf( “%d\n“, i );
iが5の時だけ,
ループを飛ばす
}
return (0);
}
第3回
プログラミング入門2
35
  while文
 
 
 
 
最も単純
ある条件の真・偽で繰り返すかどうかを判定
場合によっては,一度も文を実行しないこともある
do∼while文
 
 
ある条件の真・偽で繰り返すかどうかを判定
必ず一度は文を実行
→ 一度処理を実行し,その後キーボードからの入力により
繰り返し処理を行うかどうかを決める場合に有効
  for文
 
一定回数だけ処理を繰り返す場合,while文よりも見やすく記述できる
※ループを強制的に終了: break
※ループをスキップ: continue
第3回
プログラミング入門2
36
18
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文を使用)
ポイント:入力された数が0でない間,処理を繰り返す
ファイル名:kadai3-3.c
第3回
プログラミング入門2
37
4.キーボードから生徒数を整数で入力し,その人数分のテストの点数
(0点∼100点満点)を入力,点数の合計点と平均点を表示する
プログラムを作成せよ。
ファイル名:kada3-4.c
注)
・人数分の点数の読込みと合計点算出には,繰り返し文を用いること!
・平均点は小数で求めること。
第3回
プログラミング入門2
38
19
  次回講義内容
 
配列
同じ型のデータの集合を効率良く扱うには?
第3回
プログラミング入門2
39
20
Fly UP