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