プログラミング入門 第5回講義 第5回講義 制御の流れ(1) ループ(その1) - while - インデント(3) ループとは(7)

Slides:



Advertisements
Similar presentations
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
Advertisements

1 繰り返し処理 while 文 と do 文 所定回反復(特定回数の繰り返し)には for 文を用いた while( 式 ) 文 式が真であるかぎり、文を繰り返し実行する 繰り返す回数が不定の場合に用いる 繰り返し回数が明示的に決まらない場合には while 文、 do 文を用いる ある手順を、例えば.
7/10 if 文課題 力作が多くて感心! 演習1:キーボードから2つの整数を入力し、小さい方の数字を 表示せよ。
ループで実行する文が一つならこれでもOK
4章 制御の流れ-3.
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
プログラミング基礎I(再) 山元進.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
6/26 前回復習 for文、while文による繰り返し計算
基礎プログラミングおよび演習 第9回
プログラミング基礎I(再) 山元進.
多重ループ 繰り返し構造:補足事項 第8回目 [6月8日、H.16(‘04)] 本日のメニュー 1)前回の課題について
多重ループ 繰り返し構造:補足事項 第8回目 [6月12日、H.15(‘03)] 本日のメニュー 1)前回の課題について
コンピュータープログラミング (C言語)(6) 1.条件分岐2(switch文、復習) 2.繰り返し処理(for文、while文)
第6章 2重ループ&配列 2重ループと配列をやります.
プログラミング入門 第6回講義 第5回講義 制御の流れ(1) ループ(その2) - for - for文(3)
プログラミング入門2 第3回 繰り返し文 芝浦工業大学情報工学科 青木 義満
配列(1) 第9回目 [6月15日、H.16(‘04)] 本日のメニュー 1)前回の課題について 2)前回の宿題について 3)配列 4)課題
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
プログラムの制御構造 選択・繰り返し.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
繰り返し計算 while文, for文.
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング入門 電卓を作ろう・パートIV!!.
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
アルゴリズムとプログラミング (Algorithms and Programming)
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
知能情報工学演習I 第12回(後半第6回) 課題の回答
04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラムの制御構造 配列・繰り返し.
C言語講座第二回 2017 分岐とループと乱数.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
第4章 反復作業を楽にする方法!! ~繰り返しその1 while~
基礎プログラミング演習 第6回.
情報処理Ⅱ 第3回 2007年10月22日(月).
プログラミングⅡ 第2回.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
プログラミング基礎a 第4回 C言語によるプログラミング入門 条件判断と反復
第2回独習Javaゼミ 第3章 セクション4~5 発表者 直江 宗紀.
ウェブデザイン演習 第6回.
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
C言語講座 制御(選択) 2006年 計算技術研究会.
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
プログラミング入門 第4回講義 選択(分岐) - if, switch/case - データ構造とアルゴリズム(2)
プログラミング基礎演習 第4回.
ループだよ!難しいよ! 第5章 while(ループ);.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラミング1 プログラミング演習I 第2回.
プログラミング序論演習.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
第2章 数値の入力と変数 scanfと変数をやります.
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
C言語講座 四則演算  if ,  switch 制御文.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
知能情報工学演習I 第10回( C言語第4回) 課題の回答
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
アルゴリズム ~すべてのプログラムの基礎~.
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
ファーストイヤー・セミナーⅡ 第10回 if文による選択処理(2).
Presentation transcript:

プログラミング入門 第5回講義 第5回講義 制御の流れ(1) ループ(その1) - while - インデント(3) ループとは(7) プログラミング入門  第5回講義 第5回講義 制御の流れ(1) ループ(その1) - while - インデント(3) ループとは(7) フローチャート(8) ループの種類・while文(10) 代入演算子(14) インクリメント・デクリメント(15) 無限ループ(20)   マークのあるサンプルプログラムは /home/course/prog0/public_html/2013/lec/source/ 下に置いてありますから、各自自分のディレクトリに コピーして、コンパイル・実行してみてください

復習:if/switch-caseの使い分け 変数の値による場合分けで、しかも場合が比較的多い時 (条件は等号でないといけない事に注意) いくつかの場合の処理が同じなら、breakなしのcaseが使える if文をつかう場面 条件が複雑な時(例えば、「条件AとBの真偽による4つの場合分け」にはswitch-caseを使用する事は非常に難しいだろう) 条件が等号でない場合(!=、<、<=、>、>=など) switch-caseが使える時でも、あまり場合分けが多くない(3個ぐらい)だとif-elseを使用した方がコンパクトにまとめられる

自動的にインデントする方法は、Lec06-15で説明します インデント(段づけ)をしよう! 1 インデント(段づけ)をすると 見やすく、間違いにくく なる 以下のスタイル1、2が標準的。 スタイル1(行数が少なく、コンパクトにまとまる) if (a == b){ printf("a,b were equal\n"); } 自動的にインデントする方法は、Lec06-15で説明します スタイル2(カッコの対応が見易い) if (a == b) { printf("a,b were equal\n"); }

複雑なif文に騙されるな(1) 以下は日付を入力して、それが月の最後の日かどうかを表示するプログラム。(ただし閏年と、あり得ない日付(5月40日など)には対応していない) #include <stdio.h> main() { int m,d; printf("月と日を空白で区切って入力してください : "); scanf("%d %d",&m, &d); if((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12)) if(d == 31) printf(“%d月%d日は月の最後の日\n",m,d); else if((m == 4) || (m == 6) || (m == 9) || (m == 11)) if(d == 30) printf("%d月%d日は月の最後の日\n",m,d); else if(m == 2) if(d == 28) printf("%d月%d日は月の最後の日\n",m,d); else printf("%d月%d日は月の最後の日ではない\n",m,d); } みかけは正しそうだが、実際はうまく動かない /home/course/prog0/public_html/2013/lec/source/lec05-1.c

複雑なif文に騙されるな(2) 前頁のプログラムをちゃんとインデント(if-elseの関係に注目して段づけする)してみると、以下のようになり、論理的におかしい事が分かる。 #include <stdio.h> main() { int m,d; printf("月と日を空白で区切って入力してください : "); scanf("%d %d",&m, &d); if((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12)) if(d == 31) printf("%d月%d日は月の最後の日\n",m,d); else if((m == 4) || (m == 6) || (m == 9) || (m == 11)) if(d == 30) printf("%d月%d日は月の最後の日\n",m,d); else if(m == 2) if(d == 28) printf("%d月%d日は月の最後の日\n",m,d); else printf(“%d月%d日は月の最後の日ではない\n",m,d); } /home/course/prog0/public_html/2013/lec/source/lec05-2.c

複雑なif文に騙されるな(3) これが正しいプログラム(インデントも正しくされている) #include <stdio.h> main() { int m,d; printf("月と日を空白で区切って入力してください : "); scanf("%d %d",&m, &d); if(((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12))&&(d == 31)) printf("%d月%d日は月の最後の日\n",m,d); else if(((m == 4) || (m == 6) || (m == 9) || (m == 11))&&(d == 30)) else if((m == 2)&&(d == 28)) printf("%d月%d日は月の最後の日\n",m,d); else printf("%d月%d日は月の最後の日ではない\n",m,d); } lec05-3c.cは更に閏年にも対応した /home/course/prog0/public_html/2013/lec/source/lec05-3{a,b,c}.c

繰り返し(ループ)とは何か(p.132) ある条件が成立している間、 同じ処理を何度も繰り返すこと Cの繰り返しの命令(文) お金がある限り宝くじを買う グラウンドを20周する Cの繰り返しの命令(文) while, for, (do-while) 2

フローチャート(p.60) 前回既に登場 下のような図形を有向線でつないで処理の手順(アルゴリズム)を表す 処理 起点・終点 入出力 分岐 ループ開始 ループ終了 キー入力 真 真の場合の処理 条件分岐 偽 偽の場合の処理 画面出力

繰り返しのフローチャート 九九の七の段の計算 yに7を代入 繰り返し: xを1から9まで1ずつ増加 zにx*yの計算結果を代入 zの値を表示 図的表現例 九九の七の段の計算 yに7を代入 繰り返し: xを1から9まで1ずつ増加    zにx*yの計算結果を代入    zの値を表示 繰り返しここまで フローチャート xを1から9まで1ずつ増加 z=x*y; zを表示

ループの種類(p.132) 見張り方式(while) 今回とりあげます カウンタ方式(for) 次回とりあげます ある特定の条件を満たしている間は、処理を 繰り返す(例:aが0より大きい間) 一般に繰り返し回数は あらかじめ決まっていない カウンタ方式(for)  次回とりあげます ループの回数を数える変数(カウンタ変数などと呼ぶ)を用いて繰り返し処理を決定する(例:10回) 一般的に繰り返し回数は 固定 3 4

while 文(見張り方式に良く使われる)(p.132) 条件式が真の間はループの中身を実行し続け、条件式が偽になれば終了(ループの次の文を実行)する while(条件式){ 文; ... }

ループのサンプルプログラム A B #include <stdio.h> main() { int i,total;  ループのサンプルプログラム 1+2+3....と順に加えていって、初めて和が25を超える数と、その時の和を求める #include <stdio.h> main() { int i,total; i = 0; total = 0; while( total <= 25 ){ i = i + 1; total = total + i; } printf("数は %d で、和は %d です\n", i, total); std1dc1{s1000000}1: gcc lec05-7.c std1dc1{s1000000}2: ./a.out 数は 7 で、和は 28 です std1dc1{s1000000}3: 5 A B /home/course/prog0/public_html/2013/lec/source/lec05-4.c

実行経過 値 ループ A地点 B地点 i total 1回目 1 2回目 2 3 3回目 6 4回目 4 10 5回目 5 15 6回目 値     ループ A地点 B地点 i total 1回目 1 2回目 2 3 3回目 6 4回目 4 10 5回目 5 15 6回目 21 7回目 7 28 8回目 ループから脱出(ループは7回まわった) 6 7

代入演算子について(p.87) =以外に, +=, -=, *=, /=, %=がある x += y ⇒ x = x + y

インクリメント・デクリメント演算子 (p.135) ループの中で、カウンタ変数を使う例が多い。 繰り返し回数の把握、回数に応じた制御。 変数に1を加える操作   インクリメント i++, ++i 変数から1減じる操作   デクリメント i--, --i 符号の位置が、前(前置)と後(後置)で 意味が違う → 次ページ

前置と後置の違い(p.136) 前置(++i、--i) ⇒ iに1加え(減じ)てから、 値を返す 単独で使用する場合は前置でも後置でも同じ i = i + 1; j = i; と同じ 8 9 例:i=6の時、実行後の値は j = ++i; ⇒ i:7 , j:7 j = i++; ⇒ i:7 , j:6 j = i; i = i + 1; と同じ 前置 後置 例:i=6の時、実行後の値は ++i; ⇒ i:7 i++; ⇒ i:7 前置 後置

インクリメント・デクリメント 前置と後置の違い #include <stdio.h> main() { int i, j; i = 0; j = 0; while( i < 5 ) { j = ++i; printf( "前置: i は %d, j は %d です\n", i, j ); } j = i++; printf( "後置: i は %d, j は %d です\n", i, j ); 2つの整数i, jは 最初0に初期化 前置の値をjに代入 今度は後置の値をjに代入。 /home/course/prog0/public_html/2013/lec/source/lec05-5.c

前のプログラムの出力結果 一見似たようなループなのだが、左にあるように出力結果が異なる。 前置: i は 1, j は 1 です 前置・後置を組み合わせて使う場合、この点に注意する。 前置: i は 1, j は 1 です 前置: i は 2, j は 2 です 前置: i は 3, j は 3 です 前置: i は 4, j は 4 です 前置: i は 5, j は 5 です 後置: i は 1, j は 0 です 後置: i は 2, j は 1 です 後置: i は 3, j は 2 です 後置: i は 4, j は 3 です 後置: i は 5, j は 4 です

インクリメント演算子・代入演算子の使用例  インクリメント演算子・代入演算子の使用例 #include <stdio.h> main() { int i,total; i = 0; total = 0; while( total <= 25 ){ i++; total += i; } printf("数は %d で、和は %d です\n", i, total); Lec05-12のプログラムlec05-4.cを書き換えた この場合は前置でも後置でも構わない /home/course/prog0/public_html/2013/lec/source/lec05-6.c

whileを使った無限ループ while(1)で制御される構造は、 条件式が常に真(1)なので無限ループである。 ある条件を満たした時にループを脱出するよう、 if文でbreakを入れる使い方がある。 (入力制限・エラー処理などを、while(1){ … }でくくる) 10 while( 1 ){ printf("\n0から100までの整数を入力しなさい\n"); scanf("%d", &a); if (a >= 0 && a <= 100) break; } breakについて 第3回講義で出て来た caseからの脱出と同様、ループからの脱出にも使われる 詳しい説明は次回(第6回)講義で行う

無限ループの例(Lec05-12を改変) #include <stdio.h> main() { int i,total; while(1){ if (total > 25) break; i = i + 1; total = total + i; } printf("数は %d で、和は %d です\n", i, total); 元は「和が25以下だったらループ 『継続』 」という条件だったので,   while(total <= 25) としていた。 今度は『終了』条件なので条件式が逆になっている。 和が25を越えたら無限ループを脱出する。 無限ループ 11 /home/course/prog0/public_html/2013/lec/source/lec05-7.c

ループとifの組み合わせ例 ある地点から別の地点へ徒歩で行く場合の所要時間を考えるプログラム 途中に信号が5カ所あるとする 信号間の所要時間は3分 信号が赤だったら信号待ちでさらに1分(計4分) 信号が青か赤かを入力して、所要時間を積算する 最後に積算結果を表示する 右の実行例では、青が3回、赤が2回 所要時間は3+3+4+4+3=17分 std1dc1{s1000000}1: ./a.out 1番目の信号は(青:0, 赤:1)?:0 2番目の信号は(青:0, 赤:1)?:0 3番目の信号は(青:0, 赤:1)?:1 4番目の信号は(青:0, 赤:1)?:1 5番目の信号は(青:0, 赤:1)?:0 所要時間は17分でした

ループとifを使用したサンプルプログラム #include <stdio.h> main () { int i = 1; int signal; int time = 0; while (i <= 5) { printf("%d番目の信号は(青:0, 赤:1)?:", i); scanf("%d", &signal); if (signal == 0) time += 3; else time += 4; i++; } printf("所要時間は%d分でした\n", time); 信号の回数(カウンタ) 信号の状態 所要時間 の3つが必要な変数 信号の回数を監視 信号の状態に応じて所要時間を加算(代入演算子を使っている) 12 信号の回数を加算 /home/course/prog0/public_html/2013/lec/source/lec05-8.c

ループとswitch-caseの組み合わせ例 先の例に信号が点滅していた場合を追加 点滅していたら急ぎ足になるので2分で行けるとする 危ないので実際には走らないこと 3通りになるのでswitch-caseを用いる 前ページプログラムのwhileの中だけ右に示す i = 1; while (i <= 5) { printf("%d番目の信号は(青:0, 赤:1, 点滅:2)?: ", i); scanf("%d", &signal); switch (signal) { case 0: time += 3; break; case 1: time += 4; case 2: time += 2; } i++; 実行例 std1dc1{s1000000}1: ./a.out 1番目の信号は(青:0, 赤:1, 点滅:2)?:0 2番目の信号は(青:0, 赤:1, 点滅:2)?:0 3番目の信号は(青:0, 赤:1, 点滅:2)?:2 4番目の信号は(青:0, 赤:1, 点滅:2)?:1 5番目の信号は(青:0, 赤:1, 点滅:2)?:0 所要時間は15分でした /home/course/prog0/public_html/2013/lec/source/lec05-9.c