1日目


スタートの位置


class MainClass	{
	public static void Main(string[] args) {
		System.Console.WriteLine("Hello, World!");
	}
}

まず実行される場所はMainです。このMainのような処理に名前を付けたものをメソッドと言う。
とりあえずはこの形を覚えておく。(classのなかにメソッドを入れるということ)
System.Console.WriteLine("Hello, World!");
はコンソール上にHello, World!と表示する命令である。

C#では何らかの命令(1文)が終わったら、区切るために「;(セミコロン)」を入れる必要がある。

変数

class MainClass {
	public static void Main(string[] args) {
		int x;
		x = 200;
		System.Console.WriteLine("x = {0}", x);
	}
} 

プログラム上である値を保存したい。ある値のひとまとまりを保存する領域に名前を付けたものを変数という。

int x;
初めに変数xをメソッド内で使えるように宣言する。メソッドの中で宣言された変数はそのメソッド内でしか使用できない。

x = 200;
変数xの中身に整数200を格納した。(上書きした)この操作を変数xに200を代入するという。

ここで、intというのは4byte整数のことであり、C#でははじめからこのようなデータの種類に応じた型というものを用意している。
詳細は各種サイトを参考されたい。(このメモでは必要に応じて登場する。)

System.Console.WriteLine("x = {0}", x);
この行では前回Hello, Worldを表示したメソッド(WriteLineメソッド)を使って画面上に数字を表示させている。
変数を表示するには、表示したい文字の後に「,(コンマ)」を打ってその後にデータを並べる。(今回はxひとつだけ)
次に"x = {0}"の中の{0}というふうに、コンマの後のデータの何番目を表示するかを「{ }」でくくって文字の中に入れる。
以上で{0}が変数xの「文字表示」となって置換される。

計算

class MainClass {
	public static void Main(string[] args) {
		int x, y, z;
		x = 200;
		y = 300;
		z = x + y;
		System.Console.WriteLine("x = {0}, y = {1}, z = {2}", x, y, z);
	}
}
ここでは足し算を行っている。

int x, y, z;
変数の宣言にはひとつだけでなく、コンマで区切って複数宣言できる。

x = 200;
y = 300;
1.2.と同様に代入している。

z = x + y;
これは直感的に分かるように、xとyを足し合わせたものを変数zに代入している。
ここで数値が変更されるのは変数zだけということに注目されたい。つまり、x + yだけでは意味がなく、その結果を何らかの変数に入れたり(…中略…・)する必要がある。

System.Console.WriteLine("x = {0}, y = {1}, z = {2}", x, y, z);
1.2.と同様に3つの変数を表示している。

なお、-, *, /, %などで引き算かけ算割り算余り算ができる。

文字列

文字がたくさん集まって文字列となる。0文字でも、終端がある場合は文字列である。(一方文字とはひとつのでデータである。)

class MainClass {
	public static void Main(string[] args) {
		string str;

		str = "abcdefg";

		System.Console.WriteLine("str = {0}", str);
	}
}

このようにstringという型で宣言することにより、変数に文字列を格納できる。
今まで触れてこなかったが、「""」でくくられたものは文字列リテラルと呼ばれ、プログラム内部ではそれだけでstring型として扱われる。

文字列に何か文字を加えたり、数字を付け加えたりできる。

class MainClass {
	public static void Main(string[] args) {
		string str1, str2;

		str1 = "abcd";
		str2 = "efg";

		System.Console.WriteLine("str1 + str2 = {0}", str1 + str2);
	}
}

この例では変数str1, str2に文字列を代入し、最後にstr1 + str2によって文字列を連結させている。
ちなみに数値でも可能である。

条件分岐

  • 基本
もし~だったら~するという風に、何らかの計算の結果によって処理を実行したりしなかったりすることはプログラム上で非常に多く存在する。

class MainClass { 
	public static void Main(string[] args) {
		int x;
		x = 200;
		
		if(x > 100) {
			System.Console.WriteLine("100より大きい");
		}
		else {
			System.Console.WriteLine("100より大きくない");
		}
 	}
}

if(x > 100) {
	System.Console.WriteLine("100より大きい");
}
は、100より大きければ{から}の中身が実行される。ちなみに1行だけの時は、
		if(x > 100)
 			System.Console.WriteLine("100より大きい");
と括弧を省略できますが、変更になったときに再び打ち直さないといけないことや、
不注意によるバグの原因などがありますので省略はお勧めしません!

このx > 100というのは、x + 100と同様に、演算子と呼ばれている。
x > 100はxより大きければtrue, そうでなければfalseが返る。(後述)

else {
	System.Console.WriteLine("100より大きくない");
}
は、前のif文が実行されなかったときに実行される。つまり、100より大きくないときに実行される。(即ち100以下)

  • bool型
x > 100以外にも、
x < 100 xは100より小さい
x >= 100 xは100以上
x <= 100 xは100以下
x == 100 xと100は等しい
x != 100 xと100は等しくない
などと比較できる。その結果は全てtrue(真)かfalse(偽)で返る。この2つを真偽値といい、bool型である。

次の例はbool型に比較結果を代入したものである。

class MainClass {
	public static void Main(string[] args) {
		bool f1, f2, f3;
		
		f1 = 100 > 100;
		f2 = 100 >= 100;
		f3 = 100 == 100;
		
		System.Console.WriteLine("f1 = {0}, f2 = {1}, f3 = {2}", f1, f2, f3);
	}
}

  • else if
if文は一般に次のような書式に従って書く。

if(条件1){
	条件1のとき
}
else if(条件2){
	条件1でなく条件2のとき
}
else if(条件3){
	条件1, 2でなく条件3のとき
}
else{
	条件1, 2, 3でないとき
}

else ifは何回でも繰り返せる。
else ifを使わないでifを並べた場合、その条件が該当すればそれぞれ実行される。

  • かつ、または、でない
例えばxが100以上かつyが100未満のとき実行するには、上記の知識を使って次のようにかける。

class MainClass {
	public static void Main(string[] args) {
		int x, y;
		x = 200;
		y = 90;
		
		if(x >= 100) {
			if(y < 100) {
				System.Console.WriteLine("xは100以上で、かつyは100未満");
			}
		}
	}
}

これを次のように書くこともできる。

class MainClass {
	public static void Main(string[] args) {
		int x, y;
		x = 200;
		y = 90;
		
		if(x >= 100 && y < 100) {
			System.Console.WriteLine("xは100以上で、かつyは100未満");
		}
	}
} 

この&&もa + bと同様にa && bと書いて計算結果を返す演算子である。この演算子は真偽値同士で演算する。

System.Console.WriteLine(1 + 1);
は実行できるが、
System.Console.WriteLine(1 && 1);
はエラーとなる。これは1は真偽値ではなく、数値だからである。

&&は左右がtrueだったらtrueを返し、どちらか一方でもfalseがあればfalseを返す。(やってみよう)
また||という演算子もある。こちらはどちらか一方がtrueだったらtrueを返し、両方ともfalseだったらfalseを返す。(やってみよう)

~でないというのは、!で実現できる。例を以下に示す。

class MainClass {
	public static void Main(string[] args) {
		bool f1, f2;
		f1 = true;
		f2 = false;

		System.Console.WriteLine("(f1がtrueかつf2がture)でない : {0}", !(f1 && f2));
	}
} 


これはf1がtrueであり、更にf2もtrue、というわけではないという事だから、Trueが返る。

以上の比較演算子と条件演算子を用いれば数値の比較はなんでもできる。

画面上に入力された数字を2つ足し算してその結果を返す。ただし数字は1から9までしか扱わないようにせよ。

まず、入力について :
System.Console.ReadLine()
というメソッドで入力を受け付け、その結果を返す。
次にその結果は文字列なので、数値に変換するためにint.Parse(~)というメソッドを用いる。
これは、この括弧の中に入れた文字列をint型の値に変換する。(当然変換できるような文字列でなくてはならない。)

x = int.Parse(System.Console.ReadLine());
とすればxに数値が入力されるでしょう。

次にこの数字が1から9であるかを判定します。即ち、1以上かつ9以下でなければ強制終了する。
メソッドの中で強制終了するには、return;と書けばいい。

if(!(x >= 1 && x <= 9)){
	System.Console.WriteLine("1から9の整数を入力して下さい!");
	return;
}

もう一方の数字も同じように処理し、最後に足して結果を表示する。最終的に次のようになる。

class MainClass {
	public static void Main(string[] args) {
		int x, y;

		System.Console.WriteLine("数字1 : ");
		x = int.Parse(System.Console.ReadLine());
		if(!(x >= 1 && x <= 9)) {
			System.Console.WriteLine("1から9の整数を入力して下さい!");
			return;
		}

		System.Console.WriteLine("数字2 : ");
		y = int.Parse(System.Console.ReadLine());
		if(!(y >= 1 && y <= 9)) {
			System.Console.WriteLine("1から9の整数を入力して下さい!");
			return;
		}

		System.Console.WriteLine("結果 : {0}", x + y);
	}
}

  • 問題
3つの整数を入力して、並び替えて表示するプログラムを作成せよ。

繰り返しいろいろ

  • while文
while(条件){
	条件が真の時繰り返す処理
}

これは括弧の中の条件式がtrueのとき{から}を繰り返して実行する構文である。サンプルを次に示す。

class MainClass {
	public static void Main(string[] args) {
		int i;

		i = 0;

		while(i < 5) {
			System.Console.WriteLine("{0}", i);
			i = i + 1;
		}
	}
} 

まず、i = 0;で初期化して、
次にi < 5は0 < 5だからtrueであり、{}のなかが実行される。
中身はiにi+1を代入、即ち0 + 1 = 1を代入する。次に表示する。
次はi < 5が1 < 5だからtrueであり、{}のなかが実行される。
……繰り返して
最後に
5 < 5でfalseとなったらループは終了する。

条件によっては無限にループしてしまうこともある。また、強制的に無限ループを生成することもある。
while(true) {
	...
}
は無限ループする。

さて、ループの文では1を足したり引いたりすることが多いため、1を足す、1を引く、という専用の演算子が用意されている。
先ほどの
i = i + 1;
は、
i++;
と書くことが出来る。

同様に、
i = i - 1;
は、
i--;
と書ける。

他にも、
★ = ★ ● ▲;
という形は、
★ ●= ▲;
と書ける。

例えば、
i = i + 10;
は、
i += 10;
と書ける。

直感的にiを操作している、iに対して何かするというのは分かるのでどんどん使っていって欲しい書き方である。

  • for文
if(初期化式; 条件; 末尾処理){
	条件が真の時繰り返す処理
}

while文に加えて、初期化式と末尾処理が加わった書き方である。

どういうことかというと、

i = 0;

while(i < 5) {
	System.Console.WriteLine("{0}", i);
	i = i + 1;
}



for(i = 0; i < 5; i = i + 1){
	System.Console.WriteLine("{0}", i);
}

と書けると言うことである。
どちらも全く同じ挙動をする。一般的に、一つの変数に対して増減をしながら繰り返し処理をするならfor文が適している。
なぜならば行を節約できるからである。

  • 途中で抜ける
ループ中に途中で強制的に抜ける場合は、break;を用いる。

例えば次の例ではiが3になったら強制終了する。
class MainClass {
	public static void Main(string[] args) {
		int i;

		for(i = 0; i < 5; i = i + 1) {
			if(i == 3) {
				break;
			}

			System.Console.WriteLine("{0}", i);
		}
	}
} 

  • スキップする
class MainClass {
	public static void Main(string[] args) {
		int i;

 		for(i = 0; i < 5; i = i + 1) {
			if(i == 3) {
				continue;
			}

			System.Console.WriteLine("{0}", i);
		}
	}
}

これはループ中で、末尾処理までジャンプする。
上の例ではiが3になったらスキップする。

  • 問題
1から入力された数まで足し、表示せよ。

  • 問題
1×1から(入力された数)×(入力された数)までのかけ算九九表を作れ。

  • 問題
入力された数が素数かどうか判定せよ。

配列

データを順番に格納するために配列というものがある。

int[] ary;
とすれば、int型の配列aryを宣言できる。ここでaryという名前がこの後に使えるようになっただけという点に注意されたい。
新しく配列を使えるようにするためには、
ary = new int[5];
などとしなければならない。つまり、変数に配列を作って代入する

aryはこのとき0番目から4番目までの5個のデータを格納できる配列であり、データを入れるには次のようにする。
ary[0] = 100;
これで0番目に100が入る。
1番目に入れるには、
ary[1] = 200;
などとする。

class MainClass {
	public static void Main(string[] args) {
		int[] ary;

		ary = new int[5];

		ary[0] = 100;
		ary[1] = 200;

		System.Console.WriteLine("{0}, {1}", ary[0], ary[1]);
	}
}

配列のうまみは、次の例のようにループを使ってまとめて処理できる点にある。これは配列が連続するデータとなっているからである。

class MainClass {
	public static void Main(string[] args) {
		int[] ary;
		int i;

		ary = new int[5];

		ary[0] = 100;
		ary[1] = 200;
		ary[2] = 300;
		ary[3] = 400;
		ary[4] = 500;

		for(i = 0; i < 5; i++) {
			System.Console.WriteLine("{0}", ary[i]);
		}
	}
}

もちろん、入力を5回受け付けて、それを配列に格納し、表示することも可能である。

class MainClass {
	public static void Main(string[] args) {
		int[] ary;
		int i;

		ary = new int[5];

		for(i = 0; i < 5; i++) {
			ary[i] = int.Parse(System.Console.ReadLine());
		}

		for(i = 0; i < 5; i++) {
			System.Console.WriteLine("{0}", ary[i]);
		}
	}
}

  • foreach
foreach構文を使用することで、配列の要素だけ欲しい場合(配列の中身を変えたり、追加・削除したりしない場合)にはforeachが便利である。

例えば
for(i = 0; i < 5; i++) {
	System.Console.WriteLine("{0}", ary[i]);
}
は、
foreach(int value in ary) {
	System.Console.WriteLine("{0}", value);
}
と書ける。

このように、
for(● in ▲){
	
}
とかくと、変数●に配列▲の各要素を入れながら全ての要素に渡って繰り返される。


  • 問題
5つの入力された整数を全て足して表示するプログラムを作成せよ。

  • 問題
5つの入力された整数を並び替えて表示するプログラムを作成せよ。
(ヒント : ソートでぐぐてね)

  • 問題
5つの入力された整数を次のようにグラフにして表示せよ。ただし、*の高さは最大値が10となるようにせよ。
(最大値が0の場合は何も表示しなくて良い。)

         *
         *
         *
         *
   *     *
 * *     *
 * *     *
 * * *   *
 * * * * *
 * * * * *

なお、改行を入れない場合は
System.Console.WriteLine();
でなく
System.Console.Write();
を用いればいい。
最終更新:2013年11月21日 17:36