プログラミング入門2004

第8回[平成16年6月8日(火)]:PN04ー08.ppt
多重ループ
繰り返し構造:補足事項
今日の内容
1
2
3
4
5
6
繰り返し構造(for)の復習
演算子の復習
多重ループ
繰り返し構造の補足:break文、continue文
その他(プログラムの要素と書式)
演習
皆さんのミニレポートから
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
これで、プログラムに重要なifや繰り返し構造を習得し
とても難しいと思いました。
教科書で復習を!
しばらく休んでいたので、だいぶ進んでいたので頑張っ
て追いつけるようにしたいです。
休まないでね!
たので、後はプログラムを組む考え方の習得をしないと
講義の出欠席を採るのが早い。個々によって2,3分の
いけないと思った。
考え方を身につけるのは大切です
教科書・ppt忘れてしまいました。反省
ズレがあるのでその辺は多めに見て欲しい。
忘れないでね!
今回の授業はdoとwhileの構造についてでしたが、今
さぶいです。冷房より窓を開ける方が今の時期は過ごし
一度だけ、今までの総復習を講義でやらなくてもいい
回の授業だけではまだ完全には理解できない部分が多
やすいと思うのですが・・・。冷房を弱くしましょう
が、。先生のフォルダーにでも復習問題でも設けて欲し
いです。後は、自分で復習するなり演習するなり何とか
い。
そのうち、過去問を掲載します。
だいぶわかった。
goodです
消化しようと思います。
復習よろしく
今週は先週よりは理解することができました。goodです
教の授業は前回のwhile文、do-while文の復習をス
結構覚えることが多くて混乱しました。自分で復習します。
ライドを多く使って説明したので分かりやすかった。
30~40%分かった。
do-while文とwhile文の使い分けが7割ぐらい分か
更に複雑になってきました。良く整理しておいて下さい。
増減演算子や複合代入演算子を習って、プログラムが
りました。また、今回新しくfor文を習ったので分かるよ
少し短くなった気がする。今回は85%以上理解できたと
何となく理解できたと思う。しっかり復習して’何となく’で
うにしておきたいです。
演習をたくさんしよう
思う。
プログラムを書く効率が上がりますよ
はないようにしたい。
もうちょっと早く終わって欲しい。 努力します
今日は途中までの流れは良かったけれど、最後の課題
後置演算子と前置演算子をうっかり使い間違えそうなの
を考える時間がほとんど無かった。
反省します
で、しっかり理解して覚えたい。
復習
構造化プログラミング
• 順次構造
A
B
• 選択構造
true
判断
・二者択一、
複数場合分け
A
・if文、switch文
false
B
• 繰り返し(反復)構造
・定数回繰り返し、前判断、後判断
・for文、while文、do-while文
どの構造も入口と出口
が一つだけ
false
判断
true
A
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
文実行後再設定
演算子の復習
復習
• 複合代入演算子 @=
@ → + - * / % 等
a @= b
a = a @ b
• (前・後)置・(増・減)分演算子
増分演算子 i++ ++i
i = i + 1
減分演算子 i-- --i
i = i - 1
式が評価された後
で1だけ増減する
式が評価される前
に1だけ増減する
(前・後)置(増・減)分演算子の演習
b=5; を実行した後、次の式をそれぞれ別々
に実行すると、a,bの値は?
a b
++b;
b++;
a=++b;
a=b++;
--b;
b--;
a=--b;
a=b--;
一定回数の繰り返し:いろいろ
一定回数を繰り返すfor文とwhile文
例えば、aのn乗を計算する場合
a(=5) を n(=4) 回掛けるとする。
int i, a=5, n=4, f=1; とする
for ( i=0; i<n; i++) f=f*a;
for ( i=1; i<=n; i++) f=f*a;
while ( n-- > 0) f = f*a;
while ( --n >= 0) f = f*a;
一定回数の繰り返し:いろいろ
int i, a=5, n=4, f=1; とする
while (n-->0) f *= a;
n→4,3,2,1
条件(>0)を判断(評価)し、
次に -- を実行する
まず -- を実行し、次に
条件(>=0)を判断(評価)する
n→3,2,1,0
while (--n>=0) f *= a;
nを判断
n=n-1
n→0→-1
n=n-1
nを判断
n→-1
多重ループ(p.78-)
• 次のような九九の表を作ってみよう
j列 →
i行
↓
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
:
9 18 27 36 . . . .
81
for ( i ; i
; i )
{ for ( j ; j
; j )
printf("%3d",i*j);
;
}
演習(つづき)
• 前に作った九九の表に枠などを入れよう
1行目と2行目の間に = だけの行
左端の数字の後に : の列 を入れる
• for と printf を駆使して作ろう
j列
→
→
1: 2 3 4 5 6 7 8 9
i行 ==========================
2: 4 6 8 10 12 14 16 18
3: 6 9 12 15 18 21 24 27
:
:
9: 18 27 36 . . . .
81
演習(つづき)
→
for ( i ; i
; i ) {
printf("%1d:",i);
for ( j ; j
; j )
printf("%3d",i*j);
printf("\n");
if (
) {
for ( k ; k
; k )
j列 →
printf("=");
1: 2 3 4 5 6 7 8 9
printf("\n");i ==========================
2: 4 6 8 10 12 14 16 18
行 3: 6 9 12 15 18 21 24 27
}
:
:
}
9: 18 27 36 . . . .
81
前回の課題の発展問題
• 自然数 n について、 1~n までのすべ
ての値に対する剰余を計算して、n の約数
をすべて表示せよ。また、約数の数が2個
(1と自分自身) 「素数です。」と表示せよ。
整数nを入力せよ: 30
約数は、 1 2 3 5 6 10 15 30
整数nを入力せよ: 29
約数は、 1 29 :素数です。
• 上の課題で、nが 2~500までの数につ
いて調べ、素数表を作れ。 素数は
多重ループを利用する
2
3
5 ・・・
前回の課題
int n, m, cnt=0;
printf("整数を入力せよ\n");
scanf("%d",&n);
printf("約数は");
for ( m ; m
; m )
if (
) {
printf(" %3d",m);
cnt++;
}
if(
) puts(":素数です\n");
int main(void) {
int n, m, cnt;
printf("素数は\n");
for ( n ; n
; n )
{
cnt = 0;
for ( m ; m
; m )
if (
)
;
if (
) printf("%4d",n);
}
}
文字、文字列の出力
putchar('a');
putchar('\n');
一つの文字(含:制御文字)
を出力する(p.69)
puts("番号・氏名");
二つ以上の文字(文字列)を
改行付きで出力する(p.14)
a
'a'(一文字)
と
"a"(文字列)
の違いは?
a \0
終端印
printf("x= %f\n", x);
文字列・書式を用いた値を出力する (p.208)
繰り返し構造内のcontinue文
for文、while文、do文の繰返し部分内
で条件式を用いてcontinueにより繰返
し部分の最後にある } に跳躍できる
while ( ・・ )
{
文1 文2 ・・ 文n-1
if ( 条件式 ) continue;
文n 文n+1 ・・ 文m
}
for文による無限ループとbreak文
for ( ; ; ) 文
は無限ループ(永久に文を実行し続ける)
脱出のためには、break を使う
for ( ; ; ) {
printf("文字を入力(Z,zで終了)?");
scanf(" %c",&c);
if (c=='Z' || c=='z') break;
}
continue文とbreak文
for文、while文、do文の繰り返し部分内で
条件式を用いて、
continue により、繰り返し部分の最後に
ある } に跳躍し、次の繰り返しに移る
break により、繰り返しを終了(脱出)する
while ( ・・ ) {
文1 ・・ 文n-1
if (条件式) continue;
文n ・・ 文m }
プログラムの要素と書式(p.82-)
• キーワード
• 識別子:名前の付けたか
• 区切り子:[ ] ( ) { } : = ; 等
•演算子(p.177)
• 定数、文字列リテラル 'z' 3 "abc" 等
• 自由形式:制限事項あり
• 隣接文字列リテラルの結合 "ab" "cd"
•インデンテーション:リストは読みやすく
インデンテーションの大切さ
for ( i=1; i<=9; i++) {
printf("%1d:",i);
for ( j=2; j<=9; j++)
printf("%3d",i*j);
printf("\n");
if ( i==1 ) {
for ( k=1; k<=26; k++)
printf("=");
printf("\n"); }
}
インデンテーションの大切さ
for ( i=1; i<=9; i++) {
printf("%1d:",i);
for ( j=2; j<=9; j++)
printf("%3d",i*j);
printf("\n");
if ( i==1 ) {
for ( k=1; k<=26; k++)
printf("=");
printf("\n"); }
}
今日の課題
• *を利用して、三角形や四角形を表示して
みよう。(p.80,81)
縦
長
・
横
長
の
四
角
形
辺1:3
辺2:5
***
***
***
***
***
三
角 何段ですか:5
*
形
**
・
逆
***
三
****
角
形 *****
縦長・横長の四角形の表示
/* hen1, hen2 に値を入力する*/
if(
)
{ tate=hen1; yoko=hen2; }
else
{ tate=hen2; yoko=hen1; }
for ( i=1; i<=tate; i++) {
for ( j=1; j<=yoko; j++)
putchar('*');
putchar('\n');
}
三角形・逆三角形の表示
/* ln に段数を入力する*/
for ( i=1; i<=ln; i++ ) {
for ( j=1; j<=ln-i; j++)
putchar(' ');
for ( j=1; j<=i; j++)
putchar('*');
putchar('\n');
}