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

前回のおさらい
プログラムが動く順番



Main() { … }の中
上から下
()の中を先に実行
プログラムの一時停止

Thread.Sleep() メソッド
文字列の長さ,文字→数値の変換


文字数を得る: ”hoge”.Length
数値に変換する: int.Parse(”100”)
Console.ReadLine() の部分は,まずユーザの入力
待ちになる.入力が終わったら,入力した文字列
データに置き換わる
1
基礎プログラミング
第4回(2007年4月18日)
演算子,変数,データ型
今日のテーマ:
プログラムにおける
イコール(=)の意味
(とても重要!!)
2
演算子
データの変更・加工


文字列を連結する +
数値の四則演算(+,-,*,/)と剰余(%)
 %は剰余(あまり)
 例:int mod = 8%3;
mod は「8割る3」の余り,2が入る
演算子について詳しくは

http://msdn2.microsoft.com/jajp/library/6a71f45d(VS.80).aspx
3
演算子の計算順位
演算子の強さ(優先順位)



* / % のほうが + - よりも強い
3+2*10 ⇒ 23
(3+2)*10 ⇒ 50 のように,()をつけると
弱い演算でも優先実行できる
[文字列]と[数値]を+でつなぐと,数値を文字
列に変換して連結する
Console.WriteLine(”3+5は”+3+5+”ではない”);
⇒3+5は35ではない
4
なぜ「変数」が必要か?
前回,ユーザの入力文字列を使って,
プログラムを変更せずに,いろんな名前を表
示したり,待つ秒数を変えることができた
しかし,同じ名前を2回も聞くのは不親切

ユーザに入力してもらった文字列を,プログラム
のいろんな所で何回も利用できるようにしたい
ただ黙って待つのではなく「○秒待ちます」
「○秒経過しました」と表示したい
→変数を使う
5
変数を使うとなにができる?
データに名前をつけて保持し・再利用で
きる

(データとは,入力文字列や,それを数値
に変換したもの,など)
保持しておいたデータは,再度画面に表
示したり,計算に使ったりすることができ
る
6
変数の使い方
(1)「変数」を使うことを宣言する(変数宣言)
(2)=を使って,データを変数に結びつける

変数名=実際のデータ
と書く(変数の初期化)
(3)変数を使ってデータを参照・表示・演算
String myname; //文字列用の変数mynameを宣言
// (変数宣言:変数を使用できるようにすること)
myname = ”みうら”; //文字列を変数に○結びつける
// ×入れる,代入する
Console.WriteLine(”私は”+myname+”です”);
// ↑変数名を文字列の代わりに使って表示する
7
入力文字列を結びつける場合
Console.ReadLine() を使う
例:
String myname; //文字列変数mynameを宣言する
myname = Console.ReadLine();
//キーボードからの入力文字列を変数に結びつける
Console.WriteLine(”私は”+myname+”です”);
// ↑変数に結びつけた「名前」を表示
8
数値(整数)を結びつける例
String inputStr; //文字列変数(入力文字列用)宣言
int waitsec; // 整数(秒数)を格納する変数を宣言
Console.WriteLine(”待つ秒数を入力してください”);
inputStr = Console.ReadLine();
waitsec = int.Parse(inputStr); //入力文字列を数値に
System.Threading.Thread.Sleep(waitsec * 1000);
// 待つ
Console.WriteLine(waitsec+” 秒待ちました”);
9
1つの変数に何度もデータを結びつ
ける
String input; //文字列変数inputを宣言する
input = Console.ReadLine(); //1回目
Console.WriteLine(input +”が入力されました”);
input = Console.ReadLine(); //2回目
Console.WriteLine(”今度は”+ input +”が入力されま
した”);
2回目を結びつけると,1回目の入力データは
どこかに漂(ただよ)い,やがて消える

.NET Framework の実行環境が自動で不要なメモリを見
つけ,開放してくれる(ガベージコレクション機能)
10
変数と型
変数を使う前には,かならず「変数宣言」が必要
String myname;
myname = “miura”;

myname を文字列データ(String)を結びつけておくため
の変数として定義する
String myname = “miura”;

変数宣言と,データを結びつける命令を1行で書くことが
できる
“String” のように変数宣言の際,変数名のまえに
つける,データの種類のことを「型(かた/Type)」と
呼ぶ
11
型
C#における型(Type)は3種類

値型 (Value types)
数値
真偽値 (bool) など

参照型 (Reference types)
文字列,オブジェクト

(ポインタ型)
12
値型 (数値)
int 整数値 (=Int32)
 int year = 2007;
float 32ビット浮動小数点数値(=Single)
 float pi = 3.14F;
 float taxrate = 0.05f; (小文字のfでもよい)
double 64ビット浮動小数点数値(=Double)
 double pi = 3.14159265; (何もつけないとdouble)
 double log2 = 0.301029995D; (Dをつけてもよい)
decimal 128ビット数値(=Decimal)
 (高い精度が必要なときに使う)
13
値型 (その他)
bool 真偽値,ブール値 (=Boolean)



true(真) または false(偽)のどちらか1つ
例: bool flag = true;
bool matigai = false;
詳細は「条件分岐」のときに説明する
14
参照型 (文字列,オブジェクト)
String (作成したら変更できない文字列)


String name = ”名前”; // 下↓の省略表記
String name = new String(”名前”);
StringBuilder (追加・変更できる文字列)
StringBuilder buffer = new StringBuilder(”kisoPro”);
buffer.Append(”gramming”); //append:うしろに追記
Console.WriteLine(buffer.ToString()); //文字列に変換
Random (乱数を生成するオブジェクト)
Random rand = new Random();
int value = rand.Next(1,7); // サイコロ(1~6)
15
数値の演算例
(左辺:変数名)で示した変数に,(右辺:デー
タ,式)の計算結果を代入する,という意味

プログラミングにおけるイコール(=)は,「左辺と
右辺が同じ数値」という意味ではない
(変数名)=(データ,式)
int price = 1000; //ある商品の値段
float tax = 0.05f; // 消費税率
int total;
// 税込金額
total = price + (price * tax);
16
文字列の演算例
(左辺:変数名)で示した変数に,(右辺:デー
タ,式)の計算結果を結びつける,という意味

プログラミングにおけるイコール(=)は,「左辺と
右辺が同じ文字列」という意味ではない
(変数名)=(データ,式)
String lastName = ”miura”;
String firstName = ”motoki”;
String name;
name = lastName + ”_” + firstName;
17
値型は変数に「代入する」
参照型は変数に「結びつける」
代入(格納) 犬小屋メタファ (値型)
値型の変数
実データ
変数にデータを「代入」
結びつける 杭&リーシュメタファ (参照型)
参照型の変数
実データ
変数に実データを「結びつける」
18
変数に実データへの参照を格納
値型と参照型
値型の変数はデータを格納し、参照型の変
数は実データへの参照を格納します。参照型
は、オブジェクトとも呼ばれます。

マイクロソフトMSDNライブラリ
http://msdn2.microsoft.com/jajp/library/3ewxz6et(VS.80).aspx より抜粋
19
値型と参照型の違いを理解
値型の場合
20
値型と参照型の違いを理解
参照型の場合
21
値型と参照型の違いを理解
参照型
値型
original
original
kisoPro
19800
original
copy
19800
19800
original
copy
19800
20000
copy
original
kisoPro
copy
original
kisoPro
gramming
22
プログラム実行ルール
プログラムが動く順番
Main(){ …} の中
 上から下,1行ずつ
 ()の中を先に計算
 [△△型] [変数名]; と書かれていた場合,
[変数名]を△△型の変数として使えるよう
にする(変数宣言)
 [変数名]=○○○; と書かれていた場合,
=の右側を先に計算する.そして,左側の
変数に代入または結びつける

23
今日の重要なポイント
値型と参照型で,「(保持すべき)データ」を割り当てる
ための=(イコール記号)の意味と振る舞いが大きく
異なる


値型のときは,データがコピーされる
参照型のときは,左辺の変数には,右辺が示す実データへ
の参照(リンク)を格納するのみ
 (参照型のときは,「変数=実データ」 という記法で
実データを変数に結びつけている)
1つの変数が保持できる(または参照でたどっていけ
る)データは1つのみ

再割り当てすると,前のデータはどこかへ行ってしまう
なぜわざわざ2種類の概念(値型,参照型)を混在さ
せているのか,考えてみよう!
24
提出課題 Report-B(1)
前回の提出課題Report-A(2)のプログラムを
修正し,
(1)ユーザに入力してもらった秒数を使って
「これから○秒待ちます」
と表示してから
(2)Sleep()で実際に○秒待ったあと,
(3)最後に「○秒待ちました」
と表示するようにする
注意:ユーザに秒数を入力してもらうのは1回
だけにする
25
提出課題 Report-B(2)
フォルダ「03Val_or_Ref」 を配布します.

ソリューションファイルは「Val_or_Ref.sln」
(#4-slide20) のプログラムを
「Val_Program.cs」に, (#4-slide21) のプロ
グラムを「Ref_Program.cs」に入力・実行し,
両方正しく動くことを確認してください


余裕がある人は,(#4-slide24)の最後の質問に
対する答えを[コメント]に記入
(注意) [F5]のときに起動するプログラムは
スタートアッププロジェクトを切り替えて
選択してください
26
スタートアッププロジェクトの切替え方法
[デバッグ実行]を
押したときに起動
するプロジェクト
を切り替える
1. Reference
(またはValue)の
文字上で
右クリック
2. 「スタートアップ
プロジェクトに
設定(A)」
27
提出課題 Report-B(3)
Report-B(2)で作った「Ref_Program.cs」で,
copyText.Append(”gramming”); を実行したら,copyTextの
データだけ変化するようにしたい.

つまり,下のような画面表示にしたい
original kisoPro
copy kisoProgramming
緑色[の部分(copyText = originalText;)の行だけを書き換
えて,元データをコピーするようにしてください

ただし, originalTextを使ってください.”kisoPro”という文字列を2つ
以上プログラム内に書かないこと.
ヒント:文字列から新しいStringBuilderデータを作るには
new StringBuilder([String]); を使います

StringBuilderをStringに変換するには,[StringBuilder].ToString()を
使います.
28
提出締切
4月21日(土) 23:59
までにコミットして提出
点数:
Report-B(1) 2点
 Report-B(2) 1点
 Report-B(3) 2点

29