プログラミング入門2003

第7回[平成15年6月5日(木)]:PN03ー07.ppt
繰り返し構造(for文)と
増(減)・複合代入演算子
今日の内容
1
2
3
4
5
6
構造化プログラム(復習)
繰り返し構造(do文,while文)の復習と演習
繰り返し構造(for文)と制御変数
後置増(減)分演算子・前置増(減)分演算子
複合代入演算子
演習
復習
構造化プログラミング
• 順次構造
A
B
• 選択構造
true
判断
・二者択一、
複数場合分け
A
・if文、switch文
false
B
• 繰り返し(反復)構造
・定数回繰り返し、前判断、後判断
・for文、while文、do文
どの構造も入口と出口
が一つだけ
false
判断
true
A
論理演算子(p.52-)
復習
•p,q は 非0(true,1)又は0(false)とする
•論理否定演算子(!) → !p
p が非0(true,1) ならば !p は
0(false)
0(false)
1(true)
•論理AND演算子(&&) → p && q
pとqが共に非0(true,1) の時のみ
1(true)
•論理OR演算子(||) → p || q
演算子の優先順位:教科書177頁を常に参照
pとqのいずれかが非0(true,1)なら
復習
do文
• 継続条件式が真(true)の間は文繰り返す
do 文 while ( 条件式 );
do { 文1 ... 文n } while ( 条件
式 );
セミコロンを
忘れない!
k = 1;
do {
printf("A");
k = k + 1;
} while( k<=20000 );
k=1;
printf("A");
k = k + 1;
true
k<=20000
反復を繰り返す条件
false
復習
while文
• 継続条件式が 真(true)の間は文を繰り返す
while ( 条件式 ) 文
while ( 条件式 ) {文1 文2 ... 文n}
反復を続ける条件
k = 1;
while ( k<=20000 )
{
printf("A");
k = k + 1;
}
k=1;
false
k<=20000
true
printf("A");
k = k + 1;
while文 と do文との関係(1)
while文 => do文
false
P
P
false
true
true
S
S
true
P
false
while (P) S
if (P) do S while
(P);
while文 と do文との関係(2)
do文 => while文
S
S
P
true
true
P
false
false
S
do S while (P) ;
S while (P) S
演習
次の仕様のプログラムをそれぞれ作成せよ
(a)while文を使う場合
(b)do文を使う場合
仕様:特別なデータとして「0」が入力さ
れるまで、入力したデータを合計していく
data ? 1
data ? 2
data ? 3
data ? 0
sum = 6
data ? 5
data ? 15
data ? -20
data ? 100
data ? 0
sum = 100
int a, sum;
= 0;
printf("data ? ");
scanf("%d",&a);
while (
) {
=
;
;
;
}
printf("sum = %d\n",sum);
int a, sum;
a = 0;
do {
printf("data ? ");
scanf("%d",&a);
}
printf("sum = %d\n",sum);
定数回繰り返し:for文(p.74)
for(初期設定式;継続条件式;再設定式)文
例 for ( k=1; k<=200; k=k+1)
printf("A");
• 初期設定式では制御変数に初期値を与える
 制御変数(k)は、通常は整数型の変数で繰り
返し回数を数えるカウンターの働きをする
• 継続条件式が 1(true) ならば 文 を実行
• 再設定式で制御変数に新たな値を与える
実行したい文が複数ある → 複合文,複文
for文
for(初期設定式;継続条件式;再設定式)文
例 for ( k=1; k<=200; k=k+1)
printf("A");
k=1
初期設定式
初回の1回のみ
0(false
)で終了
printf("A")
k<=200 ? 継続条件式
1(true
)
なら継続
文
再設定式
k=k+1
文実行後再設定
継続条件式と再設定式
•継続条件式 → 真偽が決まる式
 関係演算(< <= > >=)
 等価演算(== !=)
 論理演算(&& ||)
 整数値(0はfalse, 非0はtrue)
•再設定式 → 制御変数の値を変更する
 制御変数に新しい値を代入
( i=i+1 )
 増減演算子の利用( ++ -- )
増減演算子(p.67,73)
• 変数の値を1ずつ増加(減少)させる
• 制御変数 → 後置・前置いずれも同じ作用
増分演算子 i++ ++i
i = i + 1
減分演算子 i-- --i
i = i - 1
後置演算子
k=n++;
前置演算子
式が評価された後
式が評価される前
で1だけ増減する k=++n; に1だけ増減する
前置・後置の違い
後置演算子
評価後に1増加
n = 5;
k = n++;
j = n;
前置演算子
評価前に1増加
n = 5;
k = ++n;
j = n;
例 1からnまでの総和
int n, i, sum;
n ?
printf("n=>");
i ?
scanf("%d",&n);
sum ?
sum = 0;
for ( i=1; i<=n; i++)
sum = sum + i;
printf("合計は = %d\n",sum);
変数 i と sum の中身を調べてみよう
→ トレース(n に 5 が入力された場
for文 と while文 との関係
for ( A ; P ; C )
S [ループ本体]
;
while (
) {
[ループ本
体]
A
P
true
S
C
false
例 N個の星を連続表示(76頁)
整数 N(=10)が既に入力されているとする。
for ( i = 0; i < N; i++)
putchar('*');
for ( i = 1; i <= N; i++)
putchar('*');
while ( N-- > 0)
putchar('*');
while ( --N >= 0)
putchar('*');
複合代入演算子(p.66-)
• 変数aの値にbを演算@(+ - * / %
等)をし、変数aの値を変化させる
a @= b
a += b
-=
*=
5 /= 3
%=
a
a
a
a
a
a
=
=
=
=
=
=
a
a
a
a
a
a
@
+
*
/
%
b
b
b
b
b
b
for文の演習
1から10までの和を計算するfor文を書け
s=0; n=10;
for (
;
;
) s += i;
100までの偶数について和と二乗和を計算
s1=0; s2=0; b=100;
for (
) {
s1 += i;
s2 += i*i;
}
for文の演習
100から90まで大きい順に値を表示する
for (
)
printf("%3d",i);
200頁の文字コード表から、32[20](16)~
127[7F](16)までの文字を表示する
for (
)
printf("コード:%d は %c\n",i,i);
今日の課題
• 自然数 n について、 1~n までのすべ
ての値に対する剰余を計算して、n の約数
をすべて表示せよ。
 余りがゼロならば約数となる
整数nを入力せよ: 30
約数は、 1 2 3 5 6 10 15 30
• ここで、約数の数が2個(1と自分自身)の
時、n は素数となる。入力したnが 素数で
あった場合、「素数です。」と表示せよ。
整数nを入力せよ: 29
約数は、 1 29 :素数です。
提出用紙に授業への意見・感想・提案も書いて下さい
int n, m, cnt=0;
printf("整数nを入力せよ:\n");
scanf("%d",&n);
printf("約数は、");
for ( m
; m
; m
)
if (
) {
printf(" %3d",m);
cnt =
}
if (
) puts(" :素数です。
P入門(第7回)は
終了です。
次回(第8回)は
6月12日
続いて、P演習に入ります。
では、しばらく休憩します。