第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'); }
© Copyright 2024 ExpyDoc