前回のおさらい copy = original; 「=」の意味は「コピー」か? 数値や真偽値など,「値型」は確かにコピーされる 「参照型」であるオブジェクト(Stringや StringBuilder)の場合には,「=」と書いても実データはコピーされない 「変数」と「実データ」は独立したものなので, 区別して考える習慣をつけよう 変数の世界と,実データの世界は決して交わらない プログラムの字面だけを考えていては駄目.プログラム動作中の「変数世界」と「実データ世界」を意識しよう 理系でプログラミングを学んできた人の中でも,この点を理解していない人がたまにいる オブジェクト指向言語(C#,Java etc.)の最初の落とし穴
コピーするには, newで新しい「実データ」を作成する ★Report-B(3)の解答★
originalを共有(メモリ節約) originalを保存(メモリ圧迫) kisoPro kisoPro kisoPro kisoPro copy copy original kisoPro gramming kisoPro original kisoPro gramming copy copy 実データの世界 (メモリ) 変数の世界
==による「等しい」「同じ」の概念の違い 基礎プログラミング 第5回(2007年4月23日) 条件分岐 場合わけの方法(if文) ==による「等しい」「同じ」の概念の違い
条件分岐の例:ユーザの入力した秒数だけ待つ.(ただし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) (copy == ”kisoPro”) (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.”); }
文字列の比較例 String answerCar, 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) 警告になる ありがちなミス① ==を=と書く (intval = 10) エラーになる (hasCar = false) 警告になる bool a = false; if (a = false) Console.WriteLine("a is false"); エラーにならないので,間違いを見つけにくい (0 < intval < 10) エラーになる
ありがちなミス② 実データと== StringBuilder sb1 = new StringBuilder(“A”); ありがちなミス② 実データと== StringBuilder sb1 = new StringBuilder(“A”); StringBuilder sb2 = new StringBuilder(“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)を書く つまり,{N} は「N番目の引数を埋め込んで表示」の意味 順番は自由 最初は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を出します