C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名 kadai41 オマジナイ! キーワード using, class, static → 後で学習 Main()のMが大文字 printf()の代わりに Console.WriteLine() ちょっと長い・・・ C言語 using System; class kadai41 { static void Main() Console.WriteLine("Hello World!"); Console.WriteLine("Hello Students!"); } C#言語 #include <stdio.h> void main() { printf(‟Hello World!\n‟); printf(‟Hello Students!\n‟); } Hello World! Hello Students!
C#ソースプログラムの例(2) using System; class kisopro43 // 基礎プロの課題4-3のC#版 { static void Main() int a, b; Console.Write("初期値? "); a = int.Parse(Console.ReadLine()); // 整数値をaに入力 Console.Write("終了値? "); b = int.Parse(Console.ReadLine()); // 整数値をbに入力 Console.WriteLine("2乗値は次のとおり."); int i; for (i = a; i <= b; i=i+2) Console.Write("{0}*{0}={1}, ", i, i*i); } Console.WriteLine(); // コンソール出力を改行する 初期値? 5 終了値? 13 2乗値は次のとおり. 5*5=25, 7*7=49, 9*9=81, 11*11=121, 13*13=169, Press any key to continue
オブジェクトを中心としたプログラムの考え方 オブジェクト指向 オブジェクトを中心としたプログラムの考え方 オブジェクト = モノ,全ての事物・事象 オブジェクトの例(1) 人間 人間を表わす要素 性別,名前,年齢,身長,・・・,etc. 機械 機械を表わす要素 名前,重さ,部品の数,値段 実験データ 実験データを表わす要素 データ値の個数,データの値 オブジェクトの例(2) ウィンドウ ボタン スクロールバー
カプセル化 継承性 多態性 オブジェクト指向を表わす三つの言葉 なぜこれらが必要か? リサイクル 能率 共同作業 一度書いたプログラムをできるだけ再利用 能率 できるだけ短時間に効率よくプログラムを作成 共同作業 みんなで協力してプログラムを作る
構造体 ー オブジェクト指向の第一歩 いくつかの変数をまとめて新しい変数を作る 例えば 複素数型 実部と虚部のfloat型の2変数からできている 日付型 年,月,日を表すint型の3変数からできている 学生身体データ型 学籍番号(int型変数) 名前(文字列変数) 誕生日(日付型構造体) 身長(float型変数) 体重(float型変数)
a b x y z 1234 14 5 構造体変数 普通の変数 x y z 構造体変数 x y z a.x b.x プログラム中では
C#言語ソースプログラムの原型(2) C言語 C#言語 12時30分 Press any key to continue using System; class Time { public int h; // 時 public int m; // 分 } class mihon41 static void Main() Time t = new Time(); t.h = 12; t.m = 30; Console.WriteLine("{0}時{1}分", t.h, t.m); C#言語 キーワード class キーワード public キーワード new 注) クラス名Timeが大文字Tで始まるのは,単なる習慣である (小文字timeでもかまわない) #include <stdio.h> struct time { int h; // 時 int m; // 分 } void main() time t; t.h = 12; t.m = 30; printf("%d時%d分Hello World!",t.h, t.m); 12時30分 Press any key to continue
C#言語ソースプログラムの原型(3) クラス定義中で関数が定義されている! C#言語 クラス中で定義された関数の呼び出し 時? 10 using System; class Time { public int h; public int m; public void Input() Console.Write("時? "); h = int.Parse(Console.ReadLine()); Console.Write("分? "); m = int.Parse(Console.ReadLine()); } public void Write() Console.Write("{0}時{1}分\n", h, m); class mihon41 { static void Main() Time t1 = new Time(); Time t2 = new Time(); t1.Input(); t2.Input(); Console.Write("一つ目は"); t1.Write(); Console.Write("二つ目は"); t2.Write(); Console.Write("{0}時{1}分", t1.h, t1.m); } オブジェクトt1に値を入力する オブジェクトt2に値を入力する オブジェクトt1の値を表示 オブジェクトt2の値を表示 時? 10 分? 15 時? 2 分? 38 一つ目は10時15分 二つ目は2時38分 10時15分 クラス定義中で関数が定義されている!
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり 二つあわせてクラスのメンバと呼ぶ + それを処理する関数の集まり メンバ変数 または フィールド メンバ と呼ぶ メソッド メンバ関数
カプセル化 オブジェクトのデータと その処理方法を 一つのオブジェクトに 閉じ込めること カプセル化とは? オブジェクトのデータ (メンバ変数) オブジェクトの処理方法 (メソッド)
クラスとインスタンス クラス 設計図 (1枚だけ) オブジェクト(大量) クラス変数 = インスタンス インスタンスの利用 = メソッド class Time { public int h; public int m; ・・・ } 設計図 (1枚だけ) オブジェクト(大量) Time t1 = new Time(); Time t2 = new Time(); クラス変数 = インスタンス t1 t1.Input(); t1.hとt1.mに値を入力 t2.Input(); t2.hとt2.mに値を入力 インスタンスの利用 = メソッド オブジェクトの 利用 t2 t1 t2
C#言語ソースプログラムの原型(4) メソッドの呼び出しは クラス変数名.メソッド名() メソッドの定義 メソッド定義以外ではメンバ変数は using System; class Time { public int h; public int m; public void Input() Console.Write("時? "); h = int.Parse(Console.ReadLine()); Console.Write("分? "); m = int.Parse(Console.ReadLine()); } public void Write() Console.Write("{0}時{1}分\n", h, m); class mihon41 { static void Main() Time t1 = new Time(); Time t2 = new Time(); t1.Input(); t2.Input(); Console.Write("一つ目は"); t1.Write(); Console.Write("二つ目は"); t2.Write(); Console.Write("{0}時{1}分", t1.h, t1.m); } クラス 先頭にキーワードpublicをつける これ以外は通常の関数定義と同じ. 引数を取ることもできる. メソッドの定義 t1 t2 メソッド定義以外ではメンバ変数は クラス変数名.メンバ変数名 t1.hとt1.mに入力 t2.hとt2.mに入力 t1 t2 メソッド内ではメンバ変数は単にその変数名を書くだけでよい(t.m等と書く必要はない)
C#言語ソースプログラムの原型(5) publicの代わりに キーワードprivate を指定したら・・・ using System; class Time { private int h; int m; public void Input() Console.Write("時? "); h = int.Parse(Console.ReadLine()); Console.Write("分? "); m = int.Parse(Console.ReadLine()); } public void Write() Console.Write("{0}時{1}分\n", h, m); class mihon41 { static void Main() Time t1 = new Time(); Time t2 = new Time(); t1.Input(); t2.Input(); Console.Write("一つ目は"); t1.Write(); Console.Write("二つ目は"); t2.Write(); Console.Write("{0}時", t1.h); Console.Write("{0}分\n", t1.m); } privateメンバ変数は読み出しも代入もできない 何も指定がない場合もprivateメンバと見なされる publicもprivateも指定しないと・・・ publicメンバ(メンバ変数とメソッド)→外部からアクセス可能 privateメンバ(メンバ変数とメソッド)→外部からアクセス不可
なぜカプセル化が必要か? できれば,オブジェクトの内部構造を利用者に知られたくない プログラマAさん (オブジェクトの設計者) プログラマBさん (オブジェクトの利用者) できれば,オブジェクトの内部構造を利用者に知られたくない オブジェクトの内部構造は別に知りたくない.利用方法さえ分れば良い. デバッグのため,あるいは性能向上のため,時々オブジェクトの内部構造を変更したい オブジェクトの内部構造を変更しても,利用方法は変えて欲しくない.今までのソースのままでオブジェクトを使いたい オブジェクト 設計者しかアクセスできないメンバ → private指定 利用者が利用するメンバ → public指定
publicメンバとprivateメンバ 設計者が書いたソース 利用者が書いたソース using System; class Time { private int h; private int m; private void Adjust() while (m > 60) h = h + 1; m = m - 60; } public void Add(Time t) h = h + t.h; m = m + t.m; Adjust(); public void Input() Console.Write("時? "); h = int.Parse(Console.ReadLine()); Console.Write("分? "); m = int.Parse(Console.ReadLine()); public void Write() Console.Write("{0}時{1}分\n", h, m); class mihon41 { static void Main() Time t1 = new Time(); Time t2 = new Time(); t1.Input(); t2.Input(); Console.Write("一つ目は"); t1.Write(); Console.Write("二つ目は"); t2.Write(); t1.Add(t2); Console.Write("足すと"); t1.Write(); t.Adjust(); } privateメソッドの定義. mが60以上にならないように調整するメソッド publicメソッドの呼び出し 引数(Timeクラス変数)tとこのオブジェクトの和を再びこのオブジェクトに代入するpublicメソッド t1.h = t1.h + t2.h t1.m = t1.m + t2.m 時? 10 分? 113 時? 2 分? 15 一つ目は11時53分 二つ目は2時15分 足すと14時8分 privateメソッドの呼び出し privateメソッドはクラス外部からは呼び出せない privateメソッドの呼び出し