情報処理Ⅱ 第3回 2007年10月22日(月).

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

情報処理演習 (秋学期・樋口担当) 2回目 10/1 日本工業大学 コンピュータリテラシーII.
第6回条件による分岐.
ループで実行する文が一つならこれでもOK
4章 制御の流れ-3.
プログラミング言語としてのR 情報知能学科 白井 英俊.
基礎プログラミングおよび演習 第4回 担当:花岡 5階522/520.
Q q 情報セキュリティ 第6回:2005年5月20日(金) q q.
プログラミング基礎I(再) 山元進.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
情報処理Ⅱ 第4回 2007年10月29日(月).
プログラミング入門2 第3回 繰り返し文 芝浦工業大学情報工学科 青木 義満
JAVA入門② 変数と型 式と演算子 制御文.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
プログラムの制御構造 選択・繰り返し.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
情報処理Ⅱ 第2回 2007年10月15日(月).
繰り返し計算 while文, for文.
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
プログラミング論 II 2008年10月30日 文字列
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラムの制御構造 配列・繰り返し.
PHP 概要 担当 岡村耕二 月曜日 2限 平成22年度 情報科学III (理系コア科目・2年生)
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
地域情報学 C言語プログラミング 第2回 変数・配列、型変換、入力 2017年10月20日
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミングⅡ 第2回.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
プログラミング基礎a 第4回 C言語によるプログラミング入門 条件判断と反復
C言語復習 来週もこの資料を持参してください.
情報処理Ⅱ 第2回 2005年10月14日(金).
情報処理Ⅱ 第2回 2006年10月13日(金).
C#プログラミング実習 第2回.
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
C言語講座 制御(選択) 2006年 計算技術研究会.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 第7回 2004年11月16日(火).
情報処理Ⅱ 2005年10月28日(金).
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
プログラミング基礎演習 第4回.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 第2回 2004年10月12日(火).
情報処理Ⅱ 2005年11月25日(金).
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
C言語講座 四則演算  if ,  switch 制御文.
情報処理Ⅱ 2006年10月27日(金).
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
プログラミング演習I 補講用課題
ファーストイヤー・セミナーⅡ 第10回 if文による選択処理(2).
Presentation transcript:

情報処理Ⅱ 第3回 2007年10月22日(月)

本日学ぶこと 制御文 問題 入れ子,多重ループ switch~case 九九の表を出力できる? 1st, 2nd, 3rd, 4th, …, 1000th と順番に序数を生成 できる?

多重ループの準備 大小のサイコロ1個ずつを振ったときの出目は何種類? (大,小)=(1,1),(1,2),…(6,6)の36種類.しかし全てを数え上げるのは手間がかかるし,間違いも起こりやすい. 大の出目は1~6のいずれか.そのそれぞれに対して,小の出目は1~6のいずれか.したがって6×6=36種類.

九九プログラム 方針 1≦i≦9, 1≦j≦9の各(i,j)について,i * jを計算する. 1≦j≦9のそれぞれのjの値に対して, 1≦i≦9のそれぞれのiの値との積を計算し,出力する for (j = 1; j <= 9; j++) { for (i = 1; i <= 9; i++) { printf("%2d ", i * j); } printf("\n"); 上の例では,「forの二重ループ」とも言う. 三重,四重,…と増やすこともできる. for文の中にfor文… for文の「入れ子 (ネスト)」という kuku.c 入p.97 i=3, j=9 リp.252

ループの用語 ループ(loop):反復のこと ループカウンタ:反復処理を制御する変数のこと.for文の中で使われる. 「forループ」,「whileループ」などという. ループカウンタ:反復処理を制御する変数のこと.for文の中で使われる. 2重ループ:ループの中にループを書くこと 多重ループ:2重ループ,3重ループ,4重ループ…の総称

多分岐(1) 構文 if (条件1) { たまに使う if文の中にif文… if 文の「入れ子」 リp.239 if (条件2) {  条件1~2をともに満たすときの処理  } else {  条件1を満たすが,条件2を満たさないときの処理  }  条件1を満たさないときの処理 if文の中にif文… if 文の「入れ子」 リp.239

多分岐(2) 構文(else if文) if (条件1) { よく使う リp.237 条件1を満たすときの処理  条件1を満たすときの処理  } else if (条件2){  条件1は満たさず,条件2を満たすときの処理  } else if (条件3) {  条件1~2は満たさず,条件を3を満たすときの処理  } else {  条件1~3のいずれも満たさないときの処理  } リp.237

AND条件とOR条件 AND条件 OR条件 if (条件1 && 条件2) { if (条件1 || 条件2) { よく使う  条件1~2をともに満たすときの処理  } else {  条件1~2の少なくとも一方を満たさないときの処理  } OR条件 if (条件1 || 条件2) {  条件1~2の少なくとも一方を満たすときの処理  条件1~2をともに満たさないときの処理 「パイプ記号」(Shiftを押し ながら「\」)を2個 「|」の呼称:パイプ,縦棒,pipe,vertical bar 入p.215 リp.161

序数プログラム 方針 1≦number≦1000の各整数に対して(for文を用いて), その序数となる英単語を出力する 出力方法 printf("%dst", 1); ⇒ 1st printf("%dnd", 2); ⇒ 2nd printf("%drd", 3); ⇒ 3rd printf("%dth", 4); ⇒ 4th

序数プログラム 方針(つづき) 接尾辞のつけかた 下2桁が「11」,「12」もしくは「13」のとき,"th" 下1桁が「1」のとき,"st" 下1桁が「2」のとき,"nd" 下1桁が「3」のとき,"rd" それ以外は,"th" 下?桁 整数iの下1桁 ⇒ iを10で割った余り ⇒ i % 10 整数iの下2桁 ⇒ iを100で割った余り ⇒ i % 100 ordinal.c

switch~case 多分岐を実現するもう一つの方法 構文 switch (整数値) { たまに使う コロン …  値1の処理  break;  case 値2:  値2の処理  …  default:  それ以外の処理   } 整数値 値1の処理 値2の処理 それ以外 の処理 break … コロン リp.240, p.242

switch~caseにbreakが なかったら 滅多に使わない 構文 switch (整数値) {  case 値1:  値1の処理  case 値2:  値2の処理  …  default:  それ以外の処理   } 整数値 値1の処理 値2の処理 それ以外 の処理 … リp.244

序数プログラムを書き換える ifをswitch~caseに置き換える ordinal2.c

制御文に関する補足 ブロック breakとcontinue 無限ループ whileとforの使い分け

ブロック 「{ 処理 }」をブロック(複合文)という 「処理」には複数の文が書ける. セミコロンまでが一つの文. 制御文を用いた if (…) {…} なども(セミコロンはなくても)一つの文. ブロックの先頭で,変数を宣言できる.この変数は,ブロックが終わると利用できなくなる. リp.222

{ と } が省略可能なとき 「処理」が一つの文のときは,{ と } を省略できる. if (条件)  処理 ただし,条件を満たすときにする処理,満たさないときにする処理が紛らわしくなるので,常に { と } をつけるようにしておくとよい if (条件) 処理1; 処理2; if (条件) { 処理1; 処理2; } if (条件1) if (条件2) 処理1; else 処理2; if (条件1) { if (条件2) 処理1; } else 処理2; 「処理が一つの文のときは,{ と } を省略できる」の代わりに 「処理は一つの文でなければならない.ここで,文とは,単文,複合文(ブロック),if文,for文,while文,…,である」 と表現することもできる.(リp.215も参照のこと) 条件の真偽にかかわらず 処理2を実行する. 違う! 条件1が真,条件2が偽のとき に限り,処理2を実行する. 違う!

breakとcontinue break continue 注意点 for, while, do, switchの処理の中で使用でき,それぞれのブロックから脱出する. continue for, while, doの処理の中で使用でき,反復の先頭に戻る. forでは,増分してから条件判定へ while, doでは,ただちに条件判定へ 注意点 ifやelseのブロックでbreakをすると,そのブロックではなく,より外側の(forなどの)ブロックから脱出する 入れ子の中から一気に脱出はできない(gotoが必要) リp.263, p.265

無限ループ 例 注意点 while (1) { for (;;) { たまに使う 例 while (1) { 処理 } for (;;) { 注意点 通常は,「処理」の中にif文を設け,何らかの条件でbreakによって抜けるように書く. 条件 (恒真) 処理 リp.254

whileとfor while文をfor文で記述可能 for文をwhile文で記述可能 使い分けは? 条件 処理 初期化 条件 処理 増分 空文 (くうぶん) リp.251

制御文:まとめ 「反復」は,for, while, do~while 「分岐」は,if, switch~case 制御文は入れ子にできる.「{」と「}」の対応に注目して読む breakはブロックを抜け,continueは反復の先頭に戻る.適用される制御文に注意

次に学ぶこと 演算子(Operator) +, -, =, %, ++ ,&& ,||, == など C言語ではどんな演算子が使用できるか? 演算子間の優先順位はどうなっているか? 例: 2 + 3 * 4 と書けば,(2 + 3) * 4 ではなく 2 + (3 * 4) と解釈される.このとき,* は + よりも 優先順位が高いという.

用語説明 演算対象をオペランド(operand)という. 代入できるオブジェクトを左辺値(lvalue)という. y = x + 1; のとき, x と 1 は,演算子 + のオペランド y と x + 1 は,演算子 = のオペランド 代入できるオブジェクトを左辺値(lvalue)という. 例: p = (++q) + 1; としたときの p と q 演算子を適用して値を得ることを評価という. 例: if (x = 3) {...} のとき,「x = 3」により,xに3が代入されるとともに,この式を評価した値は3となる. 「left value」の略 オペランドは「被演算子」ともいう. 「左辺値」について,規格には「代入可能な左辺値」という概念もあるが,煩雑なので, 多くのプログラミング言語で使用されている用法を採用した. 入p.194では「被演算数」と呼んでいるが,これは対象を狭く見ている.例えば, 「100 ÷ 2 + 5 × 4 - 25」という式に対して,演算子+のオペランドは, 「100 ÷ 2」と「5 × 4」とするのが自然である. 入p.194 リp.149

2項演算子 加減算演算子: +, - 乗除演算子(1): *, / 乗除演算子(2): % (剰余を求める.オペランドは整数) アスタリスク 加減算演算子: +, - 乗除演算子(1): *, / 乗除演算子(2): % (剰余を求める.オペランドは整数) 関係演算子: <, >, <=, >=, ==, != 暗黙の型変換が起こる場合を除き,2つのオペランドは同一の型でなければならない. ○ if (2 == 3.14) … × if ('a' == "abc") … ○ if (0x61 == 'a') … ○ if ("abc" == "bcd") … スラッシュ 等しいか比較する ときは,= ではなく == if (2 == 3.14)では,暗黙の型変換により2がdouble型になる. if (0x61 == 'a')は,比較の両辺ともint型である. if ("abc" == "bcd")では,"abc"も"bcd"もchar *型(charのポインタ型)になる.ただしこれは常に偽である. 文字列の内容が等しいか判定するには,==ではなく,ライブラリ関数のstrcmpを用いるとよい. 入p.207, p.213 リp.159, p.160

代入演算子 =, +=, -=, *=, /=, %= など 左側のオペランドは左辺値でなければならない. x 記号= y; は,x = x 記号 y; と同じ. 左側のオペランドは左辺値でなければならない. x + 1 = y; はNG. 右から左に結合する.左辺値に格納される値を演算結果とする. x += y = z + 2; ⇒ y = z + 2; x += y; と同じ 入p.211 リp.163

論理演算子 AND: && (2項演算子) OR: || (2項演算子) NOT: ! (単項演算子) 優先順位は ! > && > || 真偽とCでの表現 真: 0以外に評価される値 偽: 0に評価される値 例: 1 && 2は真(具体的には,1)である. && の左を偽と評価すれば,右は評価しない. || の左を真と評価すれば,右は評価しない. int a[10]; … if (x >= 0 && x < 10 && a[x] == y) とすると,x<0 や x≧10のときは a[x] == y を評価しない. 入p.215 リp.158, p.161

論理演算 偽:整数型なら0,浮動小数点型なら0.0,ポインタ型ならNULLと等しくなる値. x y x && y x || y x !x 真 真 1 1 真 偽 真 1 偽 1 真 偽 1 偽 偽 偽:整数型なら0,浮動小数点型なら0.0,ポインタ型ならNULLと等しくなる値. 真:偽でないスカラ型(整数型,浮動小数点型もしくはポインタ型)の値.

演算子:ここまでのまとめ Cでは多彩な演算子が利用できる.いくつかは数学の記号に近く,いくつかはC独特である.