GO BACK
C# (with C#Builder) 教室 その3
「値と制御構文について」
■変数と値
プログラムを作成するには、プログラミング言語の基本的な文法を理解しておかないといけません。とりあえず、プログラムというのは「値を計算する」「必要に応じて処理の流れを制御する」という2つのことがしっかりできれば作れるようになります。これらについて、ここでまとめておきましょう。
まずは「値」についてです。プログラミング言語では、値は「変数」におさめて操作します。変数とはつまり、「値の一時的な入れ物」ですね。この変数を利用するには、まず「こういう変数を使いますよ」ということを宣言しないといけません。そして実際の利用には、イコール記号を使って値を代入します。こんな具合です。
int X;
X = 100;ここでは、まずXという変数を宣言し、これに100という値を代入しています。1行目の「int」というのは「変数のタイプ」を示すものです。タイプというのは、要するにその変数で利用できる値の種類のことです。プログラミング言語で使われる値というのは、いくつかの種類があります。整数の値、実数の値、テキストの値、などといった具合ですね。変数を使う場合は、最初に「どういう種類の値をおさめる変数か」を指定して宣言しないといけません。
タイプについては後で触れるとして、変数はこのように「タイプを指定して宣言する」「値をイコールで代入する」という形で使います。これは、実は1行にまとめて書くこともできます。また複数の変数を使う時には、カンマで区切って書いていくこともできます。こういう具合です。
int X = 100;
int X,Y,Z;
X = 100;
Y = 200;
Z = 300;
int X = 100,Y = 200,Z = 300;まぁ、一度に全部の書き方を覚える必要はないです。まずは「宣言をする」「代入する」という基本中の基本だけ使えるようになればいいでしょう。
問題は、「変数のタイプ」というやつです。一体、どういうタイプが用意されているのか、それがわからないと変数は使えませんね。C#にはけっこうたくさんのタイプがあるんですが、とりあえず以下のものだけ覚えておけば十分でしょう。
- 「int」——整数のタイプ。整数タイプは他にもあるが、とりあえず整数なら全部これを使えばいい
- 「double」——実数のタイプ。実数も他にあるが、全部これでOK
- 「string」——テキストのタイプ。値は "ABC" というように前後に " をつけて書く
- 「char」——文字(1文字だけ)のタイプ。値は 'A' というように前後に ' をつけて書く。とりあえず必要が生ずるまで覚えなくていい
- 「bool」——真偽値といって、「正しいか否か」といった二者択一の値のためのもの。trueかfalseという予約語のいずれかしか値に設定できない。実際に使うようになったら改めて覚えればいい
一番重要なのは「int」と「string」でしょう。まずはこの2つだけ覚えて、他は忘れても大丈夫です。後のものは、必要になったら改めてここを見て思い出して下さい。
■演算について
変数と値というのは、単に「変数に値をおさめておしまい」ということはありません。これを元に、計算をしないといけないわけです。そのためには、計算のための記号類(演算子)を知らなくてはいけません。
通常、数値の計算に用いられる演算子には、以下のようなものがあります。まぁ、四則演算ですからだいたいわかりますね。(すべて、変数Aと変数Bを計算する形で書いてあります)
- A + B : AとBを加算する
- A - B : AからBを減算する
- A * B : AとBを乗算する
- A / B : AをBで除算する
- A % B : AをBで除算した剰余を得る
一つ注意したいのは、「わり算には2種類がある」ということです。普通に割算した値を得るものと、割った余りを得るものです。ここで「割算した整数部分の答えと、小数点以下までの答えはどうなってるんだ?」と思った人もいるかも知れません。例えば「10÷4」の場合、「2あまり2」とするか「2.5」とするか、ですね。あまりは「10 % 4」で得られますが、「10 / 4」の答えは「2」でしょうか「2.5」でしょうか。
正解は、「どちらもあり」です。——よく思い出して下さい、変数にはすべて「タイプ」がありましたね。計算結果をおさめる変数にだってタイプはあります。ということは、そのタイプがintならばおさめられる値は「2」になりますし、doubleならば値は「2.5」になるわけです。プログラミング言語では、この点をよく理解しておかないといけません。おさめる変数のタイプによって値は変わる、ということを。
■条件分岐について
プログラミングでは、実行する処理を制御するための文法が用意されています。いわゆる「制御構文」というものです。これは多数のものが用意されていますが、もっとも重要ナノは「条件分岐」と「繰り返し」の2つでしょう。
まず条件分岐からです。これは文字通り「条件によって処理を分岐させる」というものです。ある条件を満たしていたらAを実行し、そうでなかったらBを実行する、というようなものですね。この条件分岐の基本中の基本ともいえるのが「if文」というものです。これは、以下のような形をしています。
if ( 条件式 )
条件が成立する時の処理
if ( 条件式 )
条件が成立する時の処理
else
不成立の時の処理
elseの部分がついているかいないかだけで、要するに「if (○○)」という後に実行する処理を書く、という基本は同じですね。この実行する処理ですが、基本的には「1つの文だけ」です。が、もちろん実際問題として複数の文を実行したいことはありますね。そういう場合には{}の中に複数の文を書けばいいようになっています。つまり、こういうことです。
if ( 条件式 )
{
条件が成立する時の処理
・・・処理が続く・・・
}
else
{
不成立の時の処理
・・・処理が続く・・・
}
この「複数の文を実行したい時は{}の中に書く」というのは、C#の基本的な考え方の一つです。これ以降の構文でもよく登場しますから覚えておきましょう。もし、「なんだかよくわからない」という人は、この{}をつけて書いた形だけをしっかり覚えておき、すべてこのスタイルで書くようにすればよいでしょう。
問題は、「条件式」の部分でしょう。これが一体、どういうものを設定すればいいか。この条件式として設定できるものを簡単にまとめるなら、以下の2つになるでしょう。
- 「A > B」のように2つの値を比較する式。
- boolタイプの値となる変数やプロパティなど。
正確には、「A > B」なども内部的にはboolの値として判断されるので「boolの値」といってしまっていいんですが、とりあえず「こういうものが指定できる」ということだけ頭に入れておけばよいでしょう。また、2つの値を比較する式ですが、これは以下のようなものが用意されています。(これも変数AとBを比較する形で記述)
- A == B : AとBは等しい
- A != B : AとBは等しくない
- A < B : AはBより小さい
- A <= B : AはBと等しいか小さい
- A > B : AはBより大きい
- A >= B : AはBと等しいか大きい
一つ注意しておきたいのは、等式と不等式。よく「A = B」とか「A <> B」とか間違えることが多いので注意しましょう。では、簡単な例文をあげておきます。
int n = 123; // 適当に数字を書き換える
string x;
if (n % 2 == 0)
{
x = "偶数";
}
else
{
x = "奇数";
}
これは変数nの値をチェックし、それによって変数xに「偶数」か「奇数」かどちらかのテキストを設定するというものです。わかりやすいように{}を使った形で書いてみました。こんな具合に、条件によって変数に異なる値を代入したりするのにifは活躍します。
■switchによる分岐について
さて、if文と別に、もう1つ条件による分岐を行う構文があります。それは「switch文」というものです。これは、ある値を元にしてジャンプする仕組みの構文です。
switch ( 条件となるもの )
{
case 値1 :
実行する処理
break;
case 値2 :
実行する処理
break;
・・必要なだけcaseが続く・・
default:
実行する処理
break;
}
ちょっと、わかりにくいかも知れませんね。これは、()部分に指定した変数やプロパティをチェックし、その値のcaseにジャンプする働きをします。一番最後の「default:」というのは、どのcaseの値にもあてはまらなかった場合にジャンプするところです。これは、省略することも可能です。
各case部分は、「case ○○:」といった表示の後に実行する処理が続き、最後に必ず「break;」という文をつけます。このbreakは「実行を中断し、その構文から抜け出る」という働きをします。このswitch文は、変数などをチェックし、単純にcaseのところにジャンプする働きしかありません。つまり、breakがなかったら、そのまま次のcaseの命令も実行してしまうのです(実際は文法エラーになるのでそういうことは起こりませんが)。従って、「ジャンプ先は、caseで始まりbreakで終わる」という形式をしっかり理解しておくようにして下さい。
また、条件となる変数などですが、これは値のタイプが「数値関係」「テキスト」「真偽値」のものに限られます。部品などのオブジェクトは使えません。——では、これも簡単な例を挙げておきます。
int n = 1; // 適当に数字を書き換える
string x;
switch (n)
{
case 0:
x = "ゼロ";
break;
case 1:
x = "正の数";
break;
case -1:
x = "負の数";
break;
default:
x = "不明";
break;
}
これは変数nをチェックし、-1か0か1かで異なるテキストをxに代入するものです。こんな感じで、switchはたくさんの分岐を一つの構文で行うことができます。条件となるものに制約があるのが欠点ですが、使い方次第ではifよりはるかに効率的に多くの分岐を処理できるでしょう。
■while/doの繰り返しについて
さて、次はもう1つの重要な構文である「繰り返し」についてです。これもいくつか構文がありますが、もっとも単純なのは「while」「do」というのを使った構文です。whileのほうは、{}をつけた形で記述してありますが、実行するのが1文だけなら{}はなくともかまいません。
while ( 条件となるもの )
{
・・・繰り返し実行する処理・・・
}
do
・・・繰り返し実行する処理・・・
while ( 条件となるもの );
どちらも基本的な仕組みは同じです。()で指定した条件をチェックし、それが成立する間、指定の部分を実行するわけです。違いは「いつ条件をチェックするか」だけです。whileは構文の一番最初にチェックしますが、doは最後にチェックをします。通常は、どちらでも同じですが、「最初から条件が成立しない時」には違いが生じます。この場合、whileは{}内を実行せず次へ進みますが、doの場合は(条件が成立しなくとも)必ず1度は処理を実行してしまいます。
また、こらは条件が不成立になるまで何度でも繰り返しを実行しますから、場合によっては「永遠に繰り返しから抜けられない状態」が生ずることもあります。こういうのを「無限ループ」と呼ぶのですが、こうした無限ループを作ってしまわないよう、利用には注意が必要です。——では、これも例を。
int n = 1000; // 適当に数字を書き換える
int m = 1;
while (n - m > 0)
{
n = n - m;
m = m + 1;
}
これは、1000から、1000 - 1 - 2 - 3 - 4・・・というように1から順番に数字を引いていって、いくつまで引けるか調べるものです。while部分で、n - ,mの値が0より大きい間は繰り返すようにしておき、{}内でnからmを引き、mを1増やします。
■forの繰り返しについて
さて、もう1つの繰り返しは、ちょっと複雑な形をしています。()の中に、3つの要素がつまっているのです。が、慣れればもっとも多用される繰り返し文となるので、よく覚えておきましょう。
for ( 初期化処理 ; 繰り返し条件 ; 更新処理 )
{
・・・繰り返し実行する処理・・・
}
これは構文に入る時、初期化処理の部分を実行します。そして繰り返す毎に更新処理を実行し、繰り返し条件をチェックして繰り返しを続けるか判断します。——っていっても、これだけじゃよくわかりませんね。これは具体例を見れば一発でわかるので、それを見て理解しましょう。
int n = 0;
for (int i = 1; i <= 12345; i = i + 1)
{
n = n + i;
}
これは、1から12345までの整数の合計を計算するものです。for部分を見ると、まず最初に「int i = 1」が実行されていますね。そして繰り返す毎に「i = i + 1」が実行され、もし「i <= 12345」が成立しなければ繰り返しを抜けます。ということは、繰り返す毎に変数iの値は1、2、3・・・と増えていきますから、変数nの値は、n = 1 + 2 + 3 + ・・・ + 12345 となるわけです。
ところで、この例のように「変数の値を1ずつ増やして繰り返す」というようなことはプログラミングでは多用されます。また「n = n + i」のように、ある変数に値を加算したりすることもよくあります。そこでC#には、こうした計算を簡単に行う演算子が用意されています。こういうものです。
- A += B : AにBを加算する(A = A + B に同じ)
- A -= B : AからBを減算する(A = A - B に同じ)
- A *= B : AにBを乗算する(A = A * B に同じ)
- A /= B : AをBで除算する(A = A / B に同じ)
- A %= B : AをBで剰余計算する(A = A % B に同じ)
- A++ : Aを1増やす(A = A + 1 に同じ)
- A-- : Aを1減らす(A = A - 1 に同じ)
特に「++」は、for構文でよく使われます。例えば、先の例ならば、こんな形で書くわけです。
for (int i = 1; i <= 12345; i++)
この方が、だいぶスマートな感じでまとまるでしょう? fotではこういう「1ずつ増減する」ということを多用するので、forとセットで覚えておくとよいでしょう。
というわけで、基本となる制御構文についてまとめました。まだ他にいろいろ構文はありますが、これらだけ覚えれば、とりあえずちょっとしたプログラムの作成はできるようになるでしょう。
GO HOME