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