プログラミング入門2004

第7回[平成16年6月1日(火)]:PN04ー07.ppt
繰り返し構造(for文)と
増(減)・複合代入演算子
今日の内容
1
2
3
4
5
6
構造化プログラム(復習)
繰り返し構造(do文,while文)の復習と演習
繰り返し構造(for文)と制御変数
後置増(減)分演算子・前置増(減)分演算子
複合代入演算子
演習
皆さんのミニレポートから
• 演習(4)の閏年を求める問題で、
今日の授業の長さがちょうど良いです。でも、量は多くて、
内容も難しいので、理解しにくいです。
if(
(y%4==0) && ・・・ で、
(y%4)
&& ・・・ はダメでしょうか?
• if(
doは「する」、whileは「の間は」
y%4 が 0 の時に y%4==0 が true
•→カウントの所を間違えた。(・・・)の後に
; を付けない物
→が出てきたので注意したい。?
y%4 が 0 なら非0(true)ではないので false
今回は、switch文があったり、do-while文、while
• 今回の授業は、大体のことは分かったのですが、理屈が
文といろいろ新しいことをやったので、少し難しく感じた。
分かったとしても、実践とかなるとなかなかうまくいかない
今回の理解度75%ぐらい。
のが痛いところかなって思います。
• 何とか理解できました。演習で頑張りたいです。何となく
一気にやってすこし理解が追いつかなかったですが、プ
リントや教科書を読み返して理解したいです。
ですが、教室が少し暑く感じます(毎回)。
• do-whileとwhileの文はすごく難しかったです。次回
いつも授業の始めに中央のディスプレイが見えないので、
ちゃんと中央のディスプレーも付けてほしい。注意します
はもっと詳しくやるので必ず出席してdo-while文と
• while文をマスターしたいです。
去年服部先生に習ったような内容になってきた。
•
• 最初の方は良く分かった。でも、最後が難しい。
何とか理解できたと思う。復習をしっかりしておきたい。
復習
構造化プログラミング
• 順次構造
A
B
• 選択構造
true
判断
・二者択一、
複数場合分け
A
・if文、switch文
false
B
• 繰り返し(反復)構造
・定数回繰り返し、前判断、後判断
・for文、while文、do-while文
どの構造も入口と出口
が一つだけ
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
pとqのいずれかが非0(true,1)なら 1(true)
演算子の優先順位:教科書177頁を常に参照
do-while文(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;
kとjの
値は?
前置演算子
評価前に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(" :素数です。");