240 likes | 369 Views
前回のおさらい. copy = original; 「=」の意味は「コピー」か? 数値や真偽値など,「値型」は確かに コピーされる 「参照型」であるオブジェクト( String や StringBuilder )の場合には,「=」と書いても実データは コピーされない 「変数」と「実データ」は独立したものなので, 区別して考える習慣をつけよう 変数の世界と,実データの世界は決して交わらない プログラムの字面だけを考えていては駄目.プログラム動作中の「変数世界」と「実データ世界」を意識しよう 理系でプログラミングを学んできた人の中でも,この点を理解していない人がたまにいる
E N D
前回のおさらい • copy= original; 「=」の意味は「コピー」か? • 数値や真偽値など,「値型」は確かにコピーされる • 「参照型」であるオブジェクト(Stringや StringBuilder)の場合には,「=」と書いても実データはコピーされない • 「変数」と「実データ」は独立したものなので,区別して考える習慣をつけよう • 変数の世界と,実データの世界は決して交わらない • プログラムの字面だけを考えていては駄目.プログラム動作中の「変数世界」と「実データ世界」を意識しよう • 理系でプログラミングを学んできた人の中でも,この点を理解していない人がたまにいる • オブジェクト指向言語(C#,Java etc.)の最初の落とし穴
コピーするには, newで新しい「実データ」を作成する ★Report-B(3)の解答★
originalを保存(メモリ圧迫) kisoPro kisoPro original original • originalを共有(メモリ節約) original kisoPro kisoPro original kisoPro copy copy original kisoPro kisoProgramming original kisoProgramming copy copy 実データの世界 (メモリ) 変数の世界
基礎プログラミング第5回(2007年4月23日) 場合わけの方法(if文) ==による「等しい」「同じ」の概念の違い 条件分岐
条件分岐の例:ユーザの入力した秒数だけ待つ.(ただし10秒未満)条件分岐の例:ユーザの入力した秒数だけ待つ.(ただし10秒未満)
if (条件) { ① } else { ② } • 条件(Condition)が真(true)なら①を実行する • 偽(false)なら②を実行する • else { ② } の部分は,不要なら省略できる • ①や②に書く処理が1行だけなら,{} が省略できる • if (waitsec < 10) Console.WriteLine(”true”); else Console.WriteLine(”false”); • } のあとに; は不要(命令のうしろには必要)
「条件」に書けるもの • true / false(”true” ”false”ではない) • 関係演算子や論理演算子を含む式 • 「関係演算子」 • 数値の大小関係を比較 == < > <= >= != • 文字列(String)の中身で比較== != • 文字列以外のオブジェクト(StringBuilderなど)では,==と !=は,同一のオブジェクト(実データ)かどうかを判断するのみ(中身は考慮しない) • 「論理演算子」 && (AND) || (OR)
条件の例(1) • (0 <= val) • (int型の)変数valの値が非負ならtrue • (copy == ”kisoPro”) • (String型の)変数copy に結びついている文字列データの中身が“kisoPro”ならtrue • ((0 < val) && (val < 10)) • (int型の)変数val の値が0より大きく,かつ10より小さいならtrue (注) (0 < val < 10) とは書けない • (originalText == copyText) • (StringBuilder型の)2つの変数に結びついているデータが同じデータを指しているなら true • (注)たとえoriginalText.ToString()とcopyText.ToString()の2つの文字列が同じであっても,別の実データならfalse
条件の例(2) 「0 < x < 5 ならばチョメチョメせよ」という条件式は, if ( (x > 0) && (x < 5) ) { チョメチョメ } と書ける. ※(x > 0) と (0 < x) は同じ意味 あるいは if (0< x) { if (x < 5) { チョメチョメ } } でも同じ.
bool 型の変数(定義と代入) bool hasCar; //車がある(true) or ない bool hasLicense; //免許がある(true) or ない hasCar = true;//代入 hasLicense = false; if (hasCar && hasLicense){ Console.WriteLine(”You can drive.”); }
文字列の比較例 StringanswerCar, answerLicense; bool hasCar, hasLicense; Console.WriteLine(“Do you have a car? [Y/N]”); answerCar = Console.ReadLine(); if (answerCar == “Y” || answerCar == “y”) { hasCar = true; } else { hasCar = false; } …(次に続く)
文字列の比較例(つづき) (前からの続き) Console.WriteLine(“Do you have a license? [Y/N]”); answerLicense = Console.ReadLine(); hasLicense = (answerLicense == “Y” || answerLicense == “y”); if (hasCar && hasLicense) { Console.WriteLine(”You can drive.”); }
ありがちなミス① ==を=と書く • (intval = 10) エラーになる • (hasCar = false) 警告になる bool a = false; if (a = false) Console.WriteLine("a is false"); エラーにならないので,間違いを見つけにくい • (0 < intval < 10) エラーになる
ありがちなミス② 実データと== StringBuilder sb1 = newStringBuilder(“A”); StringBuilder sb2 = newStringBuilder(“A”); if (sb1 == sb2) Console.WriteLine(“両方A”); • ↑の結果はfalse • 同じAという中身でも,別のデータ なのでfalse • String型以外のオブジェクトの場合,== としても中身では比較しない(比較できない) • ==は同じデータを参照しているか否か,のみ判別 • StringBuilder sb2 = sb1;としていれば true • if (sb1.ToString() == sb2.ToString()) ...としていればtrue
elseのあとで,さらに条件分岐 Console.WriteLine(”じゃんけんの手を入力してください\n (0:グー,2:チョキ,5:パー)”); int hand = int.Parse(Console.ReadLine()); if (hand == 0) { Console.WriteLine(”グーですね”); // ① } else if (hand == 2) { Console.WriteLine(”チョキですね”); // ② } else if (hand == 5) { Console.WriteLine(”パーですね”); // ③ } else { Console.WriteLine(”0,2,5どれかをいれて”); // ④ }
じゃんけんプログラムの構造 { } を全部省略しないで書くと,最後は }}} ① (hand == 0) ② (hand != 0) (hand == 2) ③ (hand != 2) (hand == 5) (hand != 5) ④
(最初のプログラムに戻って,)ところで,{0} は何? • WriteLine()で数値を文字列に埋め込んで表示したいときの方法(C#のみ) • これまでは省略した書き方をしていた • Console.WriteLine(”let’s wait ”+waitsec+” sec”); • 本当は,ちゃんとToString()を使って変換し,”let’s wait ”+waitsec.ToString()+”sec”と書かなければいけない(でも面倒) Console.WriteLine(”百は{0}, 千は{1}, 万は{2}”, 100, 1000, 10000); と書けば,+が少なくて,すっきり書ける
順番は0から数える • {}の中に,引数の順番(0,1,2)を書く • 最初は0 • つまり,{N} は「N番目の引数を埋め込んで表示」の意味 • ただし,最初の引数は0番目とする • 順番は自由 • Console.WriteLine(”千は{1}, 万は{2}, 百は{0}, 再度,千は{1}”, 100, 1000, 10000); 0 1 2
桁数の設定などもできる • Console.WriteLine(“4桁表示 {0,4}”,55); →_ _ 5 5と表示される(スペース2つと55) • {N,M} で「N番目の引数をM桁で表示」の意味 • 詳しくは, • http://www.atmarkit.co.jp/fdotnet/csharptips/010string/010string.html • http://uchukamen.com/Programming/Strings/FormatStrings.htm • を参照
練習問題1 (04oddeven) • ユーザに整数を入力してもらい,その整数が奇数か偶数かを判定して表示するプログラムをつくりなさい • 表示メッセージ例(英語でも日本語でもよい): 3 is odd. / 4 is even.3 は奇数です. /4 は偶数です. • ヒント • 奇数・偶数を判定するには,% (剰余)の演算子を使います • int amari = (val % 2); if (amari == ...
練習問題2 (05waitsec2) • (slide-5) のプログラムを改良し,ユーザが入力した秒数が「0以上10未満」のときだけSleep()するプログラムをつくりなさい • 一旦,コミットしなさい • さらに改良し,秒数が0秒未満のときは「正の数を入れてください」,10秒以上のときは「0~9の整数を入れてください」と,それぞれ異なる案内文(メッセージ)を表示するプログラムをつくりなさい • もう一度,コミットしなさい
練習問題3 (06jyanken) • (slide-15)のじゃんけんプログラムを入力し,動くことを確認しなさい • 一旦,コミットしなさい • int型の変数 hand を使わず,String型の変数 handStr を定義し,グーを“G”または“g”, チョキを“T”または“t”, パーを“P”または“p”の文字入力で受け付けるプログラムに変更しなさい • もう一度,コミットしなさい
提出締切 • 練習問題なので締切なし • 完成したらコミットしてください • コミットメッセージは自由(自分が何を変更したのか,覚えておきやすいようにする) • プログラムに関する質問をメールで送る前には,現状でいいのでコミットすること • ただし,すべての質問にすぐ対応できないかもしれません.次回授業時間でフォローします
次回予告 (場所はK12講義室) • もう1つの条件分岐:switch文 • これまでの復習を兼ねて,問題演習(模擬試験)を実施 • 紙に書いて解いてもらうので筆記用具持参のこと • GW前の提出課題Cを出します