Edited at

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

More than 3 years have passed since last update.

【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をインストールし、

コンソール表示、組み込み型、配列、リスト。

 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.

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回分

関数(メソッド)

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回分

クラス、コンストラクタ、プロパティ、多重定義、忍者

        static void Main(string[] args)

{
string ninja1 = "ニンジャスレイヤー";
string ninja2 = "ビーフイーター";

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

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

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,

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

        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回分

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]);
}
}
}
}
}

  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回待ち