PHP, JavaScriptプログラマのためのC#入門

Preview:

Citation preview

PHP または JavaScript 経験者

のための C# 入門株式会社ジュライ溝江 智徳

About me

•Tomo Mizoe•CEO & Founder of July Inc.•http://www.july.co.jp•Twitter: @tmizoe

•Microsoft Certified Trainer•Microsoft Certified Solution Developer• Windows Store Apps using HTML5 and JavaScript• Web Applications

これは何?

PHP または JavaScript を書いたことがあるプログラマを対象とした C# の入門資料です。 Java とかObjective-C 経験者も歓迎 練習問題がたくさんあります。

対象者

PHP または JavaScript の基本文法を知っている方

•基本文法• 変数• 配列• 連想配列• 制御文: if, for, foreach, while• 関数

用意するもの

•Windows 7 以降の PC または Mac + Boot Camp

•Visual Studio 2015• 無料の Community Edition で OK

•Visual Studio 2013 でも、ここで取り扱う部分の操作は同じ。

なぜ C# ?

•とにかく便利だから使ってみて•コーディングが楽で楽しい•応用範囲が広い• ISO 、 Ecma International 、 JIS などで標準化• Windows アプリ、 Web アプリ、リアルタイム、 Linux 、 Mac 、 Unity3D( ゲーム ) 、 iOS 、 Android など、ありとあらゆるところで動く

•もっと詳しく…「 C# の強み、或いは何故 PHP から乗り換えるのか」http://www.slideshare.net/neuecc/c-22979400Yoshifumi Kawai 様 , CTO at Grani

練習問題について

•練習問題をたくさん用意しました。

•プログラミング習熟者は斜め読みでよいですが、初心者はすべての練習問題をやってみてください。

•解答例は Github に置きました。https://github.com/mizoe/CS_Practice1

基本文法

基本的なコードの書き方

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Hello World!");

}

}

実行結果Hello World!

行番号を表示する設定 (1)

ツール→ オプション

行番号を表示する設定 (2)

テキストエディタ → すべての言語 → 行番号をオン

ついでに、「テキストを折り返す」もオン

Hello World を作成してみよう (1)

•新しいコンソールアプリを作ります• 黒い画面でつまらない、と思うかもしれませんが、 GUI を使うアプリに比べて余計なトラブルに遭遇せずに学習できます

•Visual Studio で• ファイル → 新規作成 → プロジェクト

テンプレート→ Visual C# →Windows → コンソールアプリケーション   (名前とソリューション: HelloWorld )

Hello World を作成してみよう (2)

Hello World を作成してみよう (3)

コード入力

namespace HelloWorld{ class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } }}

追加

Hello World を作成してみよう (4)

実行してみるデバッグ→デバッグの開始 (F5)

一瞬、コマンドプロンプトが立ち上がりますがすぐに閉じます。

ブレークポイントを追加して、一時停止してみよう

Hello World を作成してみよう (5)

追加した部分の次の行のこのへんをクリック

赤丸が点く

ブレークポイント追加

もう一度実行してみよう

Hello World を作成してみよう (6)

ブレークポイントを追加して実行したとき、何がおきているのか?1) コンパイルで exe ファイル作成2) コンソールが開かれ、 exe が実行される3) ブレークポイントで一時停止4) ウィンドウのフォーカスが Visual Studio に戻る

タスクトレイにコンソールがあるはずなので、クリックしてウィンドウのフォーカスを移せば「 Hello World 」と表示されているはず。

Hello World を作成してみよう (7)

終了するときは?• Visual Studio の■ボタン(デバッグの停止 Shift+F5 )• コンソールの × ボタン

どっちでも OK

変数とデータ型

C# は厳密にデータ型を区別します。予約語 別名 意味sbyte System.SByte 符号付き 8 ビット整数byte System.Byte 符号なし 8 ビット整数short System.Int16 符号付き 16 ビット整数ushort System.UInt16 符号なし 16 ビット整数int System.Int32 符号付き 32 ビット整数uint System.UInt32 符号なし 32 ビット整数long System.Int64 符号付き 64 ビット整数ulong System.UInt64 符号なし 64 ビット整数char System.Char 文字型float System.Single 単精度実数double System.Double 倍精度実数bool System.Boolean 論理型( false と true のみ)decimal System.Decimal 10 進型string System.String 文字列型http://www.atmarkit.co.jp/ait/articles/0209/18/news001.htmlから拝借

いっぱいありますが、当面は int, double, bool, string だけで OK

変数を使ってみよう

•Hello World を書き換える

namespace HelloWorld{ class Program { static void Main(string[] args) { string hw = "Hello World!"; Console.WriteLine(hw); } }}

変数を宣言し、値を代入

ブレークポイントで変数を確認

「自動変数」ウィンドウで変数の状態を確認できる

表示されていなければデバッグ→ ウィンドウ→ 自動変数

練習問題 (1) ~ (2)

(1) 姓と名を格納する変数としてそれぞれmyLastName, myFirstName を定義し、ご自身の姓と名を格納してください。

(2) (1) で定義した姓と名を、コンソールへ次のように表示してください。

姓 : Suzuki名 : Taro

解答例https://github.com/mizoe/CS_Practice1

配列

・宣言:データ型 [] 配列名int[] myArray;

・配列要素の生成配列名 = new データ型 [要素数 ];myArray = new int[4];

・宣言と要素の生成を同時におこない、初期値を代入int[] myArray = new int[4] {0, 1, 2, 3};

・要素を指定してアクセス、代入Console.WriteLine(myArray[1]);

myArray[2] = 99;

注意:配列の要素数はあとから変更できません。要素数を可変にしたい場合は、後述するArrayList か List を使います。

練習問題 (3) ~ (4)  配列

(3) 姓を収納する配列 lastNames を定義し、次のデータを順番通りに収納してください。SuzukiTanakaKimuraShima

(4) 名を収納する配列 firstNames を定義し、次のデータを順番通りに収納してください。TaroHanakoJiroTetsuo

解答例https://github.com/mizoe/CS_Practice1

if

途中まで入力したらタブキーを 2回押すとひな形が展開される( IntelliSense )

   int a = 1; if (a == 1) { Console.WriteLine("a == 1"); } else if (a == 2) { Console.WriteLine("a == 2"); } else { Console.WriteLine("else"); }

for

•PHP と同じですよね…•配列の長さ : 変数名 .Length

int[] myArray = new int[4] { 10, 11, 12, 13 };for (int i = 0; i < myArray.Length; i++){

Console.WriteLine(myArray[i]);}

foreach

•var型推論:状況から型を推察。今の場合は変数item は int 型になる

int[] myArray = new int[4] { 10, 11, 12, 13 };foreach (var item in myArray){ Console.WriteLine(item);}

練習問題 (5)  配列と foreach

(5)(3) と (4) で定義した姓と名を使って、コンソールへ次のように表示してください。ただし、 foreach を使うこと。

Suzuki TaroTanaka HanakoKimura JiroShima Tetsuo

解答例https://github.com/mizoe/CS_Practice1

型変換(キャスト)

•ToString() … あらゆる型から文字列型へ•(123.45678).ToString(“F3”) … 小数点以下 4位を四捨五入して 3位までにした文字列•文字列以外のものを画面に出そうとしたような場合、自動的に ToString() が呼び出される

•明示的なキャストint i = 365;

short j = (short)i;

練習問題 (6) ~ (7)

(6)  次の距離をマイルに換算して表示してください。小数点2位以下は四捨五入して表示すること。なお、 1 マイルは1.609344 km です。

青森→東京 715.0km(444.28 マイル )飯田橋→渋谷 6.9km( 4.29 マイル )飯田橋→横浜 33.8km( 21.00 マイル )

※ 時間があれば、表示桁を小数点で揃えること。  ヒント:「数値書式 C# 」でググろう

(7)  次の部屋の面積を坪単位に換算して、小数第 2位まで画面に表示してください。なお、 1坪は 3.3平方メートルです。

101 号室  100平方メートル (30.30坪 )102 号室  75平方メートル (22.73坪 )103 号室  150平方メートル (45.45坪 )

解答例https://github.com/mizoe/CS_Practice1

練習問題 (8) ~ (9)

(8) 整数の配列 ages を作成し、年齢を表す次のデータを収納してください。

18113015553210

(9) (8) の配列 ages を使って年齢が 20歳以上のとき「成人」と表示してください。

181130 成人1555 成人32 成人10

解答例https://github.com/mizoe/CS_Practice1

練習問題 (10)

(10) (8) の配列 ages を使って次のように表示してください。

7-12歳の場合:小学生13-15歳の場合:中学生

1811小学生3015中学生553210小学生

解答例https://github.com/mizoe/CS_Practice1

練習問題 (11)

(11) (10) の表示機能をテストするため、 0~ 19 までの整数を収納する配列 testAges を新たに作成し、 foreach で次のように表示させてください。

0(中略 )67 小学生(中略 )12小学生13中学生14中学生15中学生16(後略 )

解答例https://github.com/mizoe/CS_Practice1

ユーザーの入力した文字列を読み込む

コンソールに入力された値を読み取り、変数 input に格納var input = Console.ReadLine();

文字列 input を int に型変換int inputInt = int.Parse(input);

文字列 input を double に型変換double inputDouble = double.Parse(input);

入力された値を読み取ると同時に int に型変換int inputInt = int.Parse(Console.ReadLine());

練習問題 (12)

(12) 入力された数値を読み取り、それを年齢と解釈して献血が可能な年齢か判別するプログラムを作成してください。※献血が可能な年齢→ 16歳~ 69歳•献血が可能な年齢の場合→「献血できます」と表示•献血が不可能な年齢の場合→「献血できません」と表示

解答例https://github.com/mizoe/CS_Practice1

練習問題 (13)

(13) 入力された数値を読み取り、それを年齢および身長として解釈しジェットコースターに乗れるか判別するプログラムを作成してください。

条件…6歳以上でかつ身長120 cm 以上であること•条件を満たした場合→「乗れます」と表示•満たしていない場合→「乗れません」と表示

※ 提示されていない仕様があったとしても、それなりに解釈して作ること。

解答例https://github.com/mizoe/CS_Practice1

練習問題 (14)

(14) 2 つの値 A と B をコンソール入力から読み取り、これらを比較して次のように表示するプログラムを作成してください。•A と B が等しい時 →「 (A の値を出力 ) と (B の値を出力 ) は等しい」•A が B より大きい時 →「 (A の値を出力 ) は (B の値を出力 ) より大きい」•A が B より小さい時 →「 (A の値を出力 ) は (B の値を出力 ) より小さい」

例) 6 は 10 より小さい解答例https://github.com/mizoe/CS_Practice1

練習問題 (15) ~ (16)

(15) 在庫の値をコンソール入力から読み取り、在庫数に応じて次のように表示させるプログラムを作成してください。在庫は整数値とします。

•在庫が0の時→「在庫がありません」•在庫が3個以下の時→「在庫がわずかです」•それ以外の時→「在庫があります」

(16) (15) のプログラムを、正の整数以外の数値や文字が入力された場合は再度の入力を促すように変更してください。Hint: try~catch 解答例

https://github.com/mizoe/CS_Practice1

練習問題 (17)

(17) テストの成績をコンソール入力から読み取り、点数に応じて次のように表示させるプログラムを作成してください。なお、正の整数以外の数値や文字が入力された場合は再度の入力を促すようにしてください。•80点以上→「 A判定」•70点~ 79点→「 B判定」•60点~ 69点→「 C判定」•60点未満→「 D判定」

解答例https://github.com/mizoe/CS_Practice1

while

•書き方は PHP と同じ

•break, continue も同じ

int i = 0;while (i < 10){

Console.WriteLine(i);i++;

}int j = 0;while (true){ Console.WriteLine(j); j++; if(j < 10) { break; }}

練習問題 (18)~(20)

(18) while 文を使って、「こんにちは」という文字列を5回表示するプログラムを作成してください。

(19) for 文を使って、「おはよう」という文字列を100回表示するプログラムを作成してください。

(20)次のように表示するプログラムを作成してください。

0 : かねだ1 : かねだあ2 : かねだああ3 : かねだあああ(中略 )10 : かねだああああああああああ

解答例https://github.com/mizoe/CS_Practice1

•配列とループの練習問題はほかにも多数ありますhttps://github.com/mizoe/CS_Practice1

可変長の配列、連想配列、ジャグ配列

可変長の配列 List<T>

var foods = new List<string>();foods.Add("ねぎま ");foods.Add(" かわ ");foods.Add(" つくね ");

for (int i=0; i < foods.Count; i++) {

Console.WriteLine(foods[i]);}

※   <T> は Type の略で、型を指定します。 <int> とか <double> とか。

連想配列(ハッシュテーブル)

Hashtable ht = new Hashtable();ht["Apple"] = " りんご ";ht["Orange"] = " オレンジ ";ht["Strawberry"] = 15;ht[0] = " くだもの ";

Console.WriteLine(ht["Apple"]);Console.WriteLine(ht["Orange"]);Console.WriteLine(ht["Strawberry"]);Console.WriteLine(ht[0]);

foreach (var key in ht.Keys){ Console.WriteLine("{0} : {1}", key, ht[key]);}

練習問題 30

•商品の在庫をあらわす連想配列を定義し、次のように画面に表示してください。やくそう 50個どくけしそう 20個せかいじゅのは 1個せいすい 3個

解答例https://github.com/mizoe/CS_Practice1

多次元配列

string[,] foods = new string[3,2];foods[0, 0] = " りんご ";foods[0, 1] = " みかん ";foods[1, 0] = " コーヒー ";foods[1, 1] = "紅茶 ";foods[2, 0] = "ビール ";foods[2, 1] = "日本酒 ";

int i = 0;foreach (var item in foods){ Console.WriteLine("{0} : {1}", i, item); i++;}

配列の配列

string[][] foods = new string[3][];foods[0] = new string[] { " りんご ", " みかん " };foods[1] = new string[] { " コーヒー ", "紅茶 ", "緑茶 " };foods[2] = new string[] { "ビール "};

int i = 0;foreach (var arr in foods){ int j = 0; foreach (var item in arr) { Console.WriteLine("{0}-{1} : {2}", i, j, item); j++; } i++;}

練習問題 31

商品番号・在庫・販売価格・仕入価格を整数で表す多次元配列を定義し、次のように画面に表示してください。

商品番号 在庫 販売価格 仕入価格---------------------------------- 1 99 100 50 2 200 5000 3000 3 50 90 33

解答例https://github.com/mizoe/CS_Practice1

練習問題 32

以下のデータを格納する連想配列を作成し、同様に画面表示してください。

氏名:矢吹 点数: 2氏名:丹下 点数: 74氏名:力石 点数: 80氏名:白木 点数: 100氏名:西  点数: 10

解答例https://github.com/mizoe/CS_Practice1

練習問題 33

(32) で作成した配列を利用して、それぞれの点数と合計点、平均点(小数以下は切り捨て)を出力してください。

氏名:矢吹 点数: 2氏名:丹下 点数: 74氏名:力石 点数: 80氏名:白木 点数: 100氏名:西  点数: 10受験者  5 名合計点  266点平均点  53点

解答例https://github.com/mizoe/CS_Practice1

switch ~ case

•PHP と同じ

int i = 0;switch (i){ case 0: Console.WriteLine("case 0"); break; case 1: Console.WriteLine("case 1"); break; default: Console.WriteLine("default"); break;}

練習問題 34

• (32) の配列を利用して、次の基準で判定し、判定結果を出力してください。ただし、 switch 文を使うこと。80点以上  →優70点~79点→良60点~69点→可60点未満  →不可

氏名:矢吹 点数: 2  評価:不可氏名:丹下 点数: 74  評価:良氏名:力石 点数: 80  評価:優氏名:白木 点数: 100  評価:優氏名:西  点数: 10  評価:不可

解答例https://github.com/mizoe/CS_Practice1

練習問題 35

最初に、  0~ 6 の数字を入力してください。対応した曜日を表示します。

と画面に表示し、キーボードから 0~ 6 の数字を入力すると、その数字に応じて次のように対応する曜日を表示するプログラムを作ってください。対応する曜日を求める際は switch 文を使うこと。      0 日曜日、 1 月曜日、…、 6 土曜日なお、 0~ 6 以外の数字の入力があった場合には  0~ 6 の範囲で入力してくださいと表示して最初に戻り、数字以外の入力があった場合には 数字を入力してくださいと表示して最初に戻るようにして下さい。解答例

https://github.com/mizoe/CS_Practice1

オブジェクト指向

オブジェクト指向の基本

•構造化プログラミングの関数 = 処理•オブジェクト指向のクラス   = データ + 処理

•オブジェクト指向ではデータ … フィールドと呼ぶ処理 … メソッドと呼ぶ

クラスとは?

•クラス = 設計図

BookBook

title

price

author

isbn

getTaxIncludedPrice()

getTax()

publishedDate

publisher

フィールド(メンバ変数)

メソッド

クラスを定義してみよう

フィールド

メソッド

class Book{ public string title; public string author; public DateTime publishedDate; public int price;

public const double taxRatio = 0.08; // 定数

public int getTax() { return (int)(price * taxRatio); }

public int getTaxIncludedPrice() { return price + getTax(); }

}

インスタンス

•クラスを実体化したもの•クラスの定義だけでは値を収納できない•実体化して、はじめて値を収納できる(=利用できる)

例)•クラス:たい焼き器、インスタンス:たい焼き•クラス:車の設計図、インスタンス:車•クラス:家の設計図、インスタンス:家•クラス:本の仕様、 インスタンス:個別の本のデータ

クラスを作ると、それを基にいくつでもインスタンスを作成できる

インスタンスを作ってみる

static void Main(string[] args){ // Book クラスのインスタンス book1 を作成 Book book1 = new Book();

// フィールドに値を代入 book1.title = "C# 入門 "; book1.publishedDate = new DateTime(2000, 12, 31); book1.author = "七月太郎 "; book1.price = 1000000;

// メソッド実行 int taxIncludedPrice = book1.getTaxIncludedPrice(); int tax = book1.getTax();}

練習問題 42

•名簿を作ります。•Person クラスを作ってください。• フィールド

• 姓• 名• ふりがな(姓)• ふりがな(名)• 誕生日

•メソッド• 現在の年齢を返す getAge()

解答例https://github.com/mizoe/CS_Practice1

練習問題 43

•問題 42 の Person クラスのインスタンスを作成してください。•田中太郎(たなか たろう)、 2009/1/1生•鈴木花子(すずき はなこ)、 2008/12/31生

•getAge() の動作を確認してください。

解答例https://github.com/mizoe/CS_Practice1

継承

•既存のクラスを拡張する// 月刊誌クラスclass Magazine : Book{ public int month; // x月号 public string getMonth() { return month + "月号 "; }}

// 文庫クラスclass Novel : Book{ public string series; // x 文庫}

継承したクラスのインスタンスをつくってみる

// Magazine クラスのインスタンス mag1 を作成Magazine mag1 = new Magazine();

// フィールドに値を代入mag1.title = "ベーシックマガジン "; //親クラスのフィールドmag1.price = 1000;mag1.month = 1; //子クラスのフィールド

// メソッド実行int taxIncludedPrice = mag1.getTaxIncludedPrice(); //親クラスstring monthStr = mag1.getMonth(); //子クラス

// Novel クラスのインスタンス nov1 を作成Novel nov1 = new Novel();nov1.title = "ノーシーシャープ・ノーライフ ";nov1.series = "赤シャツ文庫 ";

練習問題 44

問題 42 の Person クラスを継承した Student クラスを作成し、その動作を確認してください。

追加フィールド学籍番号 (string)学年 (int)成績 (Dictionary<科目名 , 点数 >)

追加メソッド総合点を獲得する

解答例https://github.com/mizoe/CS_Practice1

プロパティ

•フィールドに制限をかけたいときなど•クラス外部から見るとフィールドのように振る舞い、 クラス内部から見るとメソッドのように振舞う

データ型 プロパティ名 {get{

return フィールド名 ;}set{

フィールド名 = value;}

}

プロパティの例

•Book クラスの price フィールドは負にしない

private int price; //外部から隠ぺい

public int Price{ get { return price; } set { if (value >= 0) { price = value; } }}

簡素化( C# 3.0 から)

こう書くと

public string Name { get; set; }

このコードと同じ private string __name;public string Name {

get { return this.__name; }set { this.__name = value; }

}

練習問題 45

問題 42 の Person クラスに•身長プロパティ•体重プロパティを追加し、動作を確認してください。

解答例https://github.com/mizoe/CS_Practice1

コンストラクタclass Book{ public string title; public string author; public DateTime publishedDate; public int price; public const double taxRatio = 0.08;

//引数なしでインスタンス化した場合に実行される public Book() { }

//引数ありでインスタンス化した場合に実行される public Book(string title, string author, DateTime publishedDate, int price) { this.title = title; this.author = author; this.publishedDate = publishedDate; this.price = price; }

コンストラクタ: new のときに自動実行されるメソッド

練習問題 46

問題 45 の Person クラスにおけるすべてのフィールドについて、インスタンス化のときに値を定義することもできるように変更してください。

(値を定義しないこともできるように)

解答例https://github.com/mizoe/CS_Practice1

•練習問題はもう少しあります。•準備ができ次第、このファイルを更新していきます。お楽しみに!

•フィードバックいただけると嬉しいです。Twitter: @tmizoe

Recommended