基礎プログラミング - Motoki Miura

前回のおさらい
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