C#プログラミング入門してみる、ただし忍者を実際基軸に、いいね？


【C#】魔理沙が計算機の魔法に挑戦　プログラム編
http://www.nicovideo.jp/watch/sm22247112

を参考に、VSでC＃のプログラミングに入門してみます。
上記動画はとても理解しやすいので、はじめてのプログラミング入門にもオススメです。
本記事では動画内の"バグ編、0.5パート"には触れていませんが、
非常にためになる内容です。


動画作者さんのオススメ書籍は
オライリープログラミングC#、リーダブルコード、数値計算の常識等。

第1回分 コンソール表示、組み込み型、配列、リスト。
第2回分 if,（分岐） for, while（繰返し）
第3回分 関数（メソッド）
第4回分 クラス、コンストラクタ、プロパティ、多重定義、忍者
第5回分 static,フィールド,readonly,
第6回分 ファイルIO StreamWriter,WriteLine,Dispose,StreamReader,EndOfStream,ReadLine
第7回分 2次元配列（ジャグ配列、矩形配列）、メソッドの抽出、型推論var、デリゲート

■個人的にとりあえずのVSの設定をしておきます。
ツール＞オプション
-配色テーマ　＞　濃色

ツール＞設定のインポートで以下のmonokai設定をお借りして適用
http://studiostyl.es/schemes/monokai

-ツール＞オプション＞フォントと色でConsolas　を選択。

コメントには動画で指示されてないものが多く含まれています。

#第1回分
VSをインストールし、
コンソール表示、組み込み型、配列、リスト。

```csharp
 static void Main(string[] args)
        {
        //cw + Tab +Tab で Console.WriteLine(); を呼び出せる。
        
        //組み込み型
            int a = 2;
            Console.WriteLine(2);

            double b = 1.5;
            Console.WriteLine(b);

            double c = a + b;
            Console.WriteLine(c);

            double d = a * b;
            Console.WriteLine(d);

            string hello = "Hello,world.";
            Console.WriteLine(hello);
            
            string bye = hello + "Goodbye";
            Console.WriteLine(bye);

            bool e = true;
            Console.WriteLine(e);

        //配列
        //要素の数は変えられない。
            int[] takusan = new int[10];
            takusan[0] = 1;

            Console.WriteLine(takusan[0]);
            Console.WriteLine(takusan.Length);          

        //リスト
        //Addで要素を増やしたり、Removeで減らしたり出来る。
            List<double> list = new List<double>();
            list.Add(4.5);

            Console.WriteLine(list[0]);
            Console.WriteLine(list.Count);

        //Console.WriteLineでの{}の使い方
            Console.WriteLine("Helloの中身は{0}",hello);
            Console.WriteLine("{0}と{1}と{2}",a,b,3);

        }
```

#第2回分
if, for, while.

```csharp
static void Main(string[] args)
        {

        //if
            int a = 2;
            int b = 2;

            if (a < b)
            {
                Console.WriteLine("aはbより小さい");
            }
            else if (a > b)
            {
                Console.WriteLine("aはb以上");
            }
            else if(a == b)
            {
                Console.WriteLine("aとbは等しい");
            }

        //for
        //整数が増えていく時はfor文を使うと理解しやすい
            double[] hairetu = new double[10];
            hairetu[0] = 1.0;
            Console.WriteLine(hairetu[0]);

            for (int i = 0; i < 10 ; i++)
            {
                hairetu[i] = i + 1.0;
                Console.WriteLine(hairetu[i]);
            }

        //while
            double c = 1.5;
            while (c < 10.0)
            {
                c += 1.0;
                Console.WriteLine(c);
            }

        }
```

#第3回分
関数（メソッド）

```csharp
static void Main(string[] args)
        {
        //メソッドTwice
                       //↓引数
            int a = Twice(5);
            Console.WriteLine(a);

        //メソッドWriteAll
            double[] vals = new double[4];
            vals[0] = 2.0;
            vals[1] = 0.8;
            vals[2] = 100.0;
            vals[3] = -7.0;
            //メソッドWriteAll(引数vals);
            WriteAll(vals);

        }
                   // ↓戻り値の型 ↓引数の型
        public static int Twice　(int a)
        {
            int b = a * 2;
        // return で戻り値を返す。
            return b;
        }

        //メソッド WriteAll 戻り値なし=void 引数の型　double[]
        public static void WriteAll(double[] vals)
        {
            for (int i = 0; i < vals.Length; i++)
            {
                Console.WriteLine(vals[i]);               
            }
        }
    }
```

#第4回分
クラス、コンストラクタ、プロパティ、多重定義、忍者

```csharp
        static void Main(string[] args)
        {
            string ninja1 = "ニンジャスレイヤー";
            string ninja2 = "ビーフイーター";

            Console.WriteLine("ドーモ、{0}=サン。{1}です。", ninja1,ninja2);
            Console.WriteLine("ドーモ、{0}=サン。{1}です。", ninja2, ninja1);
        }
```

上記をオブジェクト指向的に表現する。

```csharp
class Program
    {
        static void Main(string[] args)
        {
        //コンストラクタはnewで新しく作られた時に実行される。
        //名前のついてないニンジャなんて変だと思いませんか？あなた。

        //コンストラクタにニンジャスレイヤーが与えられているのでNameはニンジャスレイヤー。
            Ninja ninjaSlayer = new Ninja("ニンジャスレイヤー");
            Ninja beefEater   = new Ninja("ビーフイーター");

         //.Aisatsu();にNinja型でbeefEaterを引数に与えているので、
         //Ninja型 beefEaterのNameであるbeefEaterがninja.Nameに与えられる。
         //よって{0}= beefEater　{1} = 自分の名前　の順で再生される。
            ninjaSlayer.Aisatsu(beefEater);
            beefEater.Aisatsu(ninjaSlayer);
        }
    }

    class Ninja
    {
    //これはコンストラクタなので、新しく作られた時Nameに引数が渡される。
        public Ninja(string name)
        {
            Name = name;
        }
        //プロパティ　{ get; 値を見てもOK set; 値を書き換えてもOK}
        //{private set; で書き込みが不可能になる。}
        public string Name { get; private set;}

        public void Aisatsu()
        {
            Console.WriteLine("ドーモ、{0}です。",Name);
        }

        //同じ名前の関数で引数の定義が違うものを多重定義（あるいはオーバーロード）と呼ぶ。
        public void Aisatsu(Ninja ninja)
        {
            Console.WriteLine("ドーモ、{0}＝サン。{1}です。",ninja.Name,Name);
        }
    }

```

#第5回分
static,フィールド,readonly,

```csharp
class Program
    {
        static void Main(string[] args)
        {
            Ninja.Prologue();
        }
    }

    class Ninja
    {
        //readonlyで読み込み専用(final)を表す。
        //ニンジャの名前はころころ変わるものではない。
        public readonly string Name;
        
        //フィールド
        double speed;
        // これは以下と同義
        // private double speed{ get; set; }

        public static void Prologue()
        {
            Console.WriteLine("ニンジャとは平安時代、カラテにより日本を支配した半神的存在である");
        }
    }
```

#第6回分
StreamWriter,WriteLine,Dispose,StreamReader,EndOfStream,ReadLine

```csharp
        static void Main(string[] args)
        {
        //文章を作成して保存する。
        //Documents > VisualStudio2013 > Projects
        //> "ProjectName" > "ProjectName" > bin > Debug　以下に保存される。
        
            //false部分は同じ名前があった時の処理。falseで上書きを行う。
            StreamWriter writter = new StreamWriter(
                "test.txt", false);

            for (int i = 0; i < 100 ; i++)
            {
                //StreamWriterが継承したTextWriterクラスのWriteLineメソッドを用いて書き込みを行う。
                writter.WriteLine("{0} {1}", i, i*i);
            }
            
            //Dispose();で書き込みを終了する。
            writter.Dispose();

            //読み込みするファイルの名前を指定する。
            StreamReader reader = new StreamReader("Test.txt");

            //readerが .EndOfStream(終わってない)限り繰り返す。
            while (!reader.EndOfStream)
            {
                //string line を生成し、readerからReadLineで一行ずつ読み込む。
                string line = reader.ReadLine();
                //コンソールにlineを書き出す。
                Console.WriteLine(line);
            }
        }
```

第7回分


```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//IO
using System.IO;

namespace Array2D
{
    class Program
    {
        static void Main(string[] args)
        {
　　　　//型推論
            //varを用いることで型推論を行う。
            //以下の場合はStreamWriterが入る。
            var writer = new StreamWriter("aaa.txt", false);
            writer.Dispose();

        //メソッド抽出結果
            //arrayTest();
        
　　　　//2次元配列
            //[4, 3]で4行3列の矩形配列を生成出来る。
            //違いは[x][y] と　[x , y]
            double[,] array = new double[4, 3];
            array[0, 0] = 5.0;
            array[1, 2] = 1.0;

            for (int i = 0; i < 4 ; i++)
            {
                for (int j = 0; j < 3 ; j++)
                {
                    Console.WriteLine("{0}行{1}列:{2}", i, j, array[i ,j]);                  
                }
            }
        }

        private static void arrayTest()
        {
            //範囲を選択、右クリック＞リファクタ－＞メソッドの抽出、名前をつけるとメソッドを抽出できる。

            //[][]で二次元配列　配列の中に配列が入る　ジャグ配列と呼ぶ。デコボコの配列を作成出来る。

            double[][] array = new double[4][];
            //以下で4行3列を表す
            array[0] = new double[3];　//1行目に3列追加
            array[1] = new double[3];　//2行目に3列追加
            array[2] = new double[3];
            array[3] = new double[3];

            //ジャグ配列に変数を代入。
            array[0][0] = 5.0;
            array[1][2] = 1.0;

            //double a に配列arrayの[1][2]を代入
            double a = array[1][2];
            Console.WriteLine(a);

            for (int i = 0; i < array.Length; i++)
            {
                for (int j = 0; j < array[i].Length; j++)
                {
                    Console.WriteLine("{0}行{1}列:{2}", i, j, array[i][j]);
                }
            }
        }
    }
}
```

```csharp
  static void Main(string[] args)
        {
         //デリゲートを用いることでメソッドや関数をモノ扱い出来る。
                //↓引数　↓戻り値　↓デリゲートを作成
            Func<double, double> f;
            
            //Sqrtは平方根を求める
            f = Math.Sqrt;
            Input1(f);
            
            f = Math.Sin;
            Input1(f);
            
            f = Math.Exp;
            Input1(f);
        }

        public static void Input1(Func<double, double> func)
        {
            Console.WriteLine("f(1) = {0}", func(1.0));
        }
```

第8回待ち