第 3 章 公式計算プログラムを作ってみよう
サンプルプログラムのダウンロード (Chap3_CSharp.msi, 356 KB)
※ また、サンプルプログラムは、あらかじめ Visual C# 2005 Express Edition と同じパソコンにインストールしておいてください。
設定方法は こちら
この章でやること
・ 円形、三角形、四角形の公式計算プログラムを完成させます。
・ 変数の作り方と、変数に対する値の代入方法について体験します。
健一さん が加わって、気分も新たに三人でプログラミングの勉強を進めることになった翔太君 と美咲さん ですが、第 3 章のタイトルを見て、翔太君は少し不安な様子です。
| 翔太 | :今度は計算プログラムか。計算って得意じゃないんだよな。 |
| 美咲 | :その計算を代わりにやってくれるプログラムなんだから、翔太君にはありがたい話なんじゃないの? |
| 翔太 | :でも、なんとなく抵抗があるなぁ。 |
| 健一 | :翔太君が抵抗を感じるのも無理はないかもしれないな。プログラミング自体が初めてで難しそうなのに、苦手な計算をやらせるんだからね。でも、プログラムで公式を書いてしまえば、計算自体はコンピュータがやってくれるんだから、とても便利だよ。公式を覚えるのは大変でも、書き写すくらいはできるだろう? 後の難しいことはコンピュータに任せてしまえばいい。 |
| 翔太 | :それくらいなら大丈夫かな。 |
二人は入門マニュアルの第 3 章を開きました。すると、まずサンプルのプロジェクトファイルを開いた画面が紹介されています。

プログラムメニューから Visual C# 2005 Express Edition を立ち上げて、サンプルファイルフォルダの中の Part3_C#\Part3_Base フォルダにある Part3.sln を開きます。[ソリューション エクスプローラ] から、[Form1.cs] を開きます。
このとき、フォームには、いくつかのコントロールが貼り付けられています。上から 4 つのブロックに分けられ、最上段の○、△、□の図形ボタングループ、二段目の計算式グループ、三段目の計算ボタン、そして四段目の計算結果の表示領域、の順番になります。
| 健一 | :まず、デバッグ ボタンをクリックして、動作を確認してみよう。 |
プログラムが立ち上がるので、まず円形の面積を求めるテストをしてみましょう。
| 翔太 | :最初は円形の面積を求める公式が表示されてるんだね。公式のところに数値を入れればいいのか。半径を二箇所に入れて、計算ボタンを押すと・・・ |

| 美咲 | :ちゃんと答えが表示されたわ。数値は直接入力しても、テキスト ボックスの横の上下ボタンを押しても入力できるようね。円周率は変更できないみたい。 |
| 翔太 | :なるほど。次は、三角形をやってみようか。図形のところがボタンになってるからクリックしてみよう。 |
| 美咲 | :三角形の面積の公式が表示されたわ。今度は私が数値を入れてみるわね。 |
| 翔太 | :・・・あれ? 計算ボタンを押しても結果が表示されないぞ。四角形も同じだ。公式は表示されるけど、計算はできないんだね。 |
| 健一 | :これがこの章の課題みたいだね。公式の計算をどうやっているのか、ボタンによって公式をどう切り替えるのか、入門マニュアルを見ながらじっくり勉強していこう。 |
<面積を計算するコードを確認する>
| 健一 | :まず、デバッグ中のプログラムを終了させて、今度は、[Form1.cs] のデザイナ画面で、[計算] ボタンのプロパティを表示させるんだ。どうすればいいか覚えてるかい? |
| 美咲 | :右下のプロパティ ウィンドウが最初から開いていれば、コントロールをクリックするだけでいいけど、開いてなければあらかじめ [表示] メニューの [プロパティ ウィンドウ] を選択して開いておけばいい、だったわよね。 |
| 健一 | :そのとおり。他にも右クリックメニューで [プロパティ] を選ぶ方法もある。プロパティの開き方はもう大丈夫だね。
それじゃ早速プログラムの内容を考えていくことにしよう。[計算] ボタンをクリックしたときに計算が行われるので、クリックしたときの動作を確認する必要がある。今度は、プロパティ ウィンドウの [イベント] アイコンをクリックしてイベントの一覧を表示してみよう。 |
一覧にある [Click] の右にあるコンボ ボックスに「btnEqual_Click」と入力されているので、[Click] をダブルクリックします。

| 翔太 | :Form1.cs のコード エディタが開いたよ。なんだかずいぶんたくさんあるなぁ。 |
| 健一 | :図形ボタンのコードも入ってるからね。でもカーソルが表示されてるのは、今回開いた「btnEqual_Click」イベントに関する部分のはずだから、まずはそこを見てほしい。 |
コード エディタの「btnEqual_Click」イベントに関する部分には、リスト 3-1-1 に紹介するようなコードが表示されます。
リスト 3-1-1
private void btnEqual_Click(object sender, EventArgs e)
{
// 面積の変数を用意
double Menseki = 0;
switch(intMode)
{
case 0: // 円形
// 半径1と半径2の変数を用意
double Hankei1;
double Hankei2;
// 指定した値を変数に代入
Hankei1 = Convert.ToDouble(nudValue1.Value);
Hankei2 = Convert.ToDouble(nudValue2.Value);
// 円形の面積を求める
Menseki = (Hankei1 * Hankei2) * 3.14;
break;
case 1: // 三角形
break;
case 2: // 四角形
break;
}
// 求めた面積を表示するテキスト ボックス(txtAnswer) の Text プロパティに
// 求めた面積の値 (double) を文字列型 (string) に変換して代入する
txtAnswer.Text = Convert.ToString(Menseki);
}
|
| 翔太 | :switch とか break とか新しい単語がいくつか出てきてるね。 |
| 美咲 | :でも、Menseki とか、Hankei などはそれぞれ面積や半径のことじゃない? この辺りはわかりやすいみたいだけど。 |
| 健一 | :いいところに気が付いたね。Menseki や Hankei とあるのは、確かにそれぞれ面積や半径のことなんだ。今回のプログラムでは、面積は毎回計算する内容によって変わるし、半径はどういう値を入れるかで変わってくる。プログラミングの世界では、このように中身が変わる可能性があるものを入れておく入れ物を作っておくんだ。この入れ物のことを変数と呼ぶんだよ。 |
| 翔太 | :変数か・・・ “数” って言うくらいだから数字が入るの? |
| 健一 | :なかなか鋭いね。変数には数字(この場合は数値というんだ)だけじゃなくて、文字も入れることができるんだ。変数の種類の話はここまでにして、とりあえず、ここで出てくる変数を上げてみてごらん。 |
| 美咲 | :えーっと・・・、次の 3 つかしら。 |
| 翔太 | :Hankei1 と Hankei2 は別のものなの? |
| 美咲 | :1 と 2 でそれぞれ記述があるから・・・、健一さん、違った? |
| 健一 | :美咲ちゃんの答えで正解だよ。変数の名前は自由につけられるんだけど、プログラムを書いた本人以外が見てもわかりやすい名前をつけるのが一般的なんだ。でも、それだと同じ名前を使いたい場合がどうしても出てくる。そこで、同じ名前の変数を使いたいときに、番号をつけて違いを表すようにしてるんだよ。 |
| 翔太 | :そうなんだ。そういえば、円の面積の公式には半径が二つ出てくるから、それで Hankei という変数が 2 つ必要なんだね。それでこの 3 つの変数を使って、このコードではなにがおこなわれているの? |
| 健一 | :順を追って簡単に説明していこう。まず 1 行目はこのコードがどこで使われるかを説明しているところなので、特に気にする必要はない。2 行目は「{」だからこれもいいとして、問題は 3 行目からだ。ここで最初の変数が出てくる。 |
リスト 3-1-2
// 面積の変数を用意
double Menseki = 0;
|
| 美咲 | :Menseki という変数は分かるけど、double と 0・・・? |
| 健一 | :これは変数を作るための命令で、double というのは変数の種類を表す単語。さっき話した数字(数値)を入れることができる種類の名前のことなんだ。だから、ここでは double 型という種類として変数 Menseki を作成している、ということになる。 |
| 翔太 | :その後の 0 は? |
| 健一 | :これは変数 Menseki の最初の値(初期値)を 0 に設定しているんだよ。Menseki はその名の通り、計算結果の面積の値を入れておくところだけど、最初は計算する前だから、とりあえず 0 を入れてある。
ちなみに、これまでにもこうした「=」を使う文が出てきたけど、プログラムの世界では、「=」を使うと右側の値が左側の変数などに設定されるという決まりになっているんだ。これを代入という。これも、この機会に覚えておくといいよ。 |
| 翔太 | :変数を設定するのも手間がかかるんだね。 |
| 健一 | :でも文にすると一行しかないだろう? 慣れてしまえばたいした手間じゃなくなるさ。 |
| 翔太 | :ふーん。そういうものなんだ。 |
| 健一 | :さあ、次の行に行こう。switch から始まる部分というのは、実は図形ボタンをクリックしたときの動作を表している。switch という命令の役割などはここでは気にしなくていい。それよりも、その下の「case 0: // 円形」から始まる行を見てごらん。 |
リスト 3-1-3
// 半径1と半径2の変数を用意
double Hankei1;
double Hankei2;
// 指定した値を変数に代入
Hankei1 = Convert.ToDouble(nudValue1.Value);
Hankei2 = Convert.ToDouble(nudValue2.Value);
// 円形の面積を求める
Menseki = (Hankei1 * Hankei2) * 3.14;
break;
|
| 美咲 | :最初に、円形と書いてあるってことは、ここでは円形の面積を求めようとしてるの? |
| 健一 | :そのとおり。ちなみに、この円形と書いてあるところは 2 章で紹介したコメント文だよ。このように、命令文と同じ行にコメントを入れることもできるんだ。 |
| 翔太 | :「//」から後ろがコメントってことだね。 |
| 健一 | :そういうこと。さて、リスト 3-1-3 を見てほしい。まず Hankei1 と Hankei2 という変数を Menskei とおなじ double 型で作成しているのがわかるかな? |
| 翔太 | :うん。でも、ここでは 0 は入れてないんだね。 |
| 健一 | :そう、この二つの変数には、ユーザーが指定した数値を入れることになるから、ここでは入れてない。その代わり、すぐ次の行で、それぞれの変数に代入が行われているだろう? |
| 美咲 | :Convert.ToDouble? それに nudValue1.Value って・・・? |
| 健一 | :さっきの [Form1.cs] のデザイナ画面で、テキスト ボックスの横に上下ボタンが付いていたのを覚えてる? |

| 健一 | :この上下ボタン付きのテキスト ボックスを数値アップダウン コントロールというんだ。ツール ボックスでは「NumericUpDown」と表記されている。nudValue1.Value というのは、nudValue1 が数値アップダウン コントロールの名前で、Value というのはコントロールで指定された値のことだよ。 |
| 翔太 | :これも 1 と 2 があるのは、画面に半径を入力するところが 2 つあったからだね。 |
| 健一 | :そうだよ。それぞれの半径の変数(Hankei1 と Hankei2)に、コントロールからの値を代入してるんだ。ただ、実はプロパティにも扱える内容の種類が決まっていて。この nudValue1.Value の値は、実は decimal 型という種類の値になっている。この型はそのままでは double 型の変数である Hankei1 や Hankei2 に使うことができないので、Convert.ToDouble という命令によって decimal 型から double 型に変換しているんだよ。だから、Hankei1 や Hankei2 には、変換後の double 型の値が代入されていることになる。 |
| 美咲 | :へぇー。型の変換もできるんだ。 |
| 翔太 | :それも代入するときに変換なんてすごいね。でも、また新しい型が出てきちゃったから、だんだんややこしくなるなぁ。 |
| 健一 | :本格的にプログラミングをやろうと思うと、こうした型の違いもちゃんと覚えておいた方がいいんだけど、今はまだその必要はない。それに、結局 double 型に変換して使ってるんだしね。そしてこの後・・・ |
リスト 3-1-4
// 円形の面積を求める
Menseki = (Hankei1 * Hankei2) * 3.14;
|
| 美咲 | :半径と半径と 3.14 ということは、* は掛け算の × という意味? じゃ、変数を使って計算してるんだ。 |
| 健一 | :そう、それがここで最も重要なことなんだ。変数はただの入れ物じゃなくて、いろんな使い方ができるんだよ。 |
| 翔太 | :計算をしてその結果を代入できるんだね。普通の計算だと、左側の計算式の結果が右側に出てくるものだけど、プログラムの世界は逆なんだ。 |

| 健一 | :それが代入の特徴でもある。かならず右側の値が左側に代入されるということを覚えておこう。
それでは、少し飛ばして終わりの方の次の 3 行を見てごらん。 |
リスト 3-1-5
// 求めた面積を表示するテキスト ボックス(txtAnswer) の Text プロパティに
// 求めた面積の値 (double) を文字列型 (string) に変換して代入する
txtAnswer.Text = Convert.ToString(Menseki);
|
| 翔太 | :Menseki が使われてるね。 |
| 健一 | :実はここでは、Menseki の内容を表示させるための処理を行っているんだ。txtAnswer というのは、フォームの面積と書かれたところにあるテキスト ボックスの名前で、ここでは Text プロパティに Menseki の値を代入している。 |

| 美咲 | :その横の Convert.ToString はさっきの Convert.ToDouble と似てるけど? |
| 健一 | :そう、Text プロパティで扱える型として、string 型という文字を表示させるための型が設定されているんだ。Menseki は何型だった? |
| 翔太 | :数値を扱う double 型、だったよね。 |
| 健一 | :だからそのままだとやっぱり型が違うから使えないんだ。そこで、Convert.ToString によって、変数の中身を string 型に変換してから代入してるんだよ。 |
| 美咲 | :へぇー。今度は、string 型に変換、か。そういえば、この Convert っていうのは何なの? |
| 健一 | :これは値の変換を行うための機能をまとめた集まり、とでも考えればいいかな。クラスとも呼ばれるけど、ここではあまり深く考える必要はない。ただ、値の変換の時には Convert を使う、と覚えてくといい。そうそう、変換する型に応じて、ToString や ToDouble などをおまけでつけることも忘れずに。ちなみに、これは、具体的に何をやるかという命令のオプションで、メソッドと呼ばれている。このあたりのことは、この先の章でまた出てきたらもう少し説明することにしよう。 |
| 翔太 | :それじゃ、次の break は? |
| 健一 | :これは、この場合、「case 0: // 円形」から始まる処理はここまでで終わりですよ。という意味を表わしているんだよ。さて、ここまでが一応円形の面積を求めるためのコードになるんだけど、大体、何をやってるか理解できたかな? |
| 美咲 | :はい。まず変数を作って、そこにユーザーに指定してもらった数値を入れて、計算するのよね。 |
| 翔太 | :そしてそれをテキスト ボックスのプロパティに入れて表示させるんだ。 |
| 健一 | :そのとおり。ちなみに、最後のテキスト ボックスのプロパティに値を入れるところは、円形だけじゃなくてほかの図形でも共通して使うことになるので、ここで設定してあれば、あとは変更する必要はないんだよ。 |
| 翔太 | :だから他の命令よりも下に書いてあるんだね。 |
| 健一 | :よし、それでは残りの三角形と四角形のコードを実際に書いてみよう。 |
<三角形用のコードを書いてみよう>
| 健一 | :まず、ここで使う変数を決めよう。 |
| 翔太 | :三角形の面積を求める公式は、「底辺」掛ける「高さ」割る 2。最後の 2 は円周率と同じでそのまま使うとして、Teihen と Takasa の 2 つの変数があれば間に合いそうだな。 |
| 美咲 | :それぞれ、double 型で最初に作っておくのよね。こんな書き方でいいのかしら。 |
リスト 3-2-1
// 底辺と高さの変数を用意
double Teihen;
double Takasa;
|
| 健一 | :よく出来ました。でも、これをどこに入れればいいと思う? |
| 翔太 | :さっきの円形のときに、「case 0: // 円形」の下だったから、今度は・・・「case 1: // 三角形」の次の行? |
| 健一 | :正解! 続けて、残りの行も考えてみよう。 |
| 美咲 | :Teihen と Takasa にそれぞれ数値を代入しないといけないんだから、さっきと同じように・・・ |
リスト 3-2-2
// 指定した値を変数に代入
Teihen = Convert.ToDouble(nudValue1.Value);
Takasa = Convert.ToDouble(nudValue2.Value);
|
| 美咲 | :これを続けて書けばいいんじゃない? |
| 健一 | :そう。そして、最後に公式に当てはめていけばいい。掛け算は * を使うけど、割り算は / を使うんだよ。 |
| 翔太 | :それじゃ、これでいいのかな。 |
リスト 3-2-3
// 三角形の面積を求める
Menseki = Teihen * Takasa / 2;
|
| 健一 | :いいぞ。だんだんわかってきたみたいだね。それじゃ、デバッグ ボタンをクリックして、三角形の計算を試してみよう。 |
デバッグ ボタンをクリックし、プログラムを実行します。そして、三角形ボタンをクリックして、公式を三角形の面積を求める公式に切り替えてください。数値を入力後、[計算] ボタンをクリックして計算結果が表示されれば成功です。

| 健一 | :それでは、ここまで書いたコードをもう一度確認しておこう。コード エディタを見てほしい。次のリスト 3-2-4 のようなコードが表示されていれば正解だ。もしデバッグ ボタンを押したときに動作がおかしければ、どこかで書き間違いがないか確認してみよう。 |
リスト 3-2-4
private void btnEqual_Click(object sender, EventArgs e)
{
// 面積の変数を用意
double Menseki = 0;
switch(intMode)
{
case 0: // 円形
// 半径1と半径2の変数を用意
double Hankei1;
double Hankei2;
// 指定した値を変数に代入
Hankei1 = Convert.ToDouble(nudValue1.Value);
Hankei2 = Convert.ToDouble(nudValue2.Value);
// 円形の面積を求める
Menseki = (Hankei1 * Hankei2) * 3.14;
break;
case 1: // 三角形
// 底辺と高さの変数を用意
double Teihen;
double Takasa;
// 指定した値を変数に代入
Teihen = Convert.ToDouble(nudValue1.Value);
Takasa = Convert.ToDouble(nudValue2.Value);
// 三角形の面積を求める
Menseki = Teihen * Takasa / 2;
break;
case 2: // 四角形
break;
}
// 求めた面積を表示するテキスト ボックス(txtAnswer) の Text プロパティに
// 求めた面積の値 (double) を文字列型 (string) に変換して代入する
txtAnswer.Text = Convert.ToString(Menseki);
}
|
<四角形用のコードを書いてみよう>
| 健一 | :今度は四角形だ。三角形のときと同じように、最初に変数を決めておこう。 |
| 美咲 | :四角形の面積を求める公式は、「縦」掛ける「横」だから、Tate と Yoko の2 つの変数にしましょうか。 |
| 翔太 | :それを、double 型で最初に作るんだよね。「case 2: // 四角形」の次の行に、追加して・・・ |
リスト 3-3-1
// 縦と横の変数を用意
double Tate;
double Yoko;
|
| 美咲 | :さらに数値アップダウン コントロールの値を代入する、と。 |
リスト 3-3-2
// 指定した値を変数に代入
Tate = Convert.ToDouble(nudValue1.Value);
Yoko = Convert.ToDouble(nudValue2.Value);
|
リスト 3-3-3
// 四角形の面積を求める
Menseki = Tate * Yoko;
|
| 健一 | :手慣れたものだね。 |
| 翔太 | :だって、基本的には同じことの繰り返しじゃない。 |
| 健一 | :でも、変数の名前を書くときには要注意だよ。名前を一文字違っただけで、プログラムは違う変数だと勘違いしてしまうんだ。途中で間違えるだけじゃなく、一番最初に変数を作るときに間違えてしまうことだってある。たとえば Tate という変数名をタイプミスして Tare という名前で作ってしまったら、後で Tate と正しいつもりの名前で値を代入してもエラーになってしまうんだ。 |
| 翔太 | :名前の一致、というのはとても重要なんだね。 |
| 健一 | :そうなんだ。
それじゃ、内容があってるかどうか、デバッグ ボタンをクリックして、試してみよう。 |
デバッグ ボタンをクリックし、プログラムを実行します。今度は、四角形ボタンをクリックして、公式を四角形の面積を求める公式に切り替えてください。数値を入力後、計算ボタンをクリックして計算結果が表示されれば成功です。

| 健一 | :それでは、ここまで書いたコードをもう一度確認しておこう。コード エディタを見て、次のリスト 3-3-4 のようなコードが表示されていれば正解だ。もしデバッグ ボタンを押したときに動作がおかしければ、どこかで書き間違いがないか確認してみよう。 |
リスト 3-3-4
private void btnEqual_Click(object sender, EventArgs e)
{
// 面積の変数を用意
double Menseki = 0;
switch(intMode)
{
case 0: // 円形
// 半径1と半径2の変数を用意
double Hankei1;
double Hankei2;
// 指定した値を変数に代入
Hankei1 = Convert.ToDouble(nudValue1.Value);
Hankei2 = Convert.ToDouble(nudValue2.Value);
// 円形の面積を求める
Menseki = (Hankei1 * Hankei2) * 3.14;
break;
case 1: // 三角形
// 底辺と高さの変数を用意
double Teihen;
double Takasa;
// 指定した値を変数に代入
Teihen = Convert.ToDouble(nudValue1.Value);
Takasa = Convert.ToDouble(nudValue2.Value);
// 三角形の面積を求める
Menseki = Teihen * Takasa / 2;
break;
case 2: // 四角形
// 縦と横の変数を用意
double Tate;
double Yoko;
// 指定した値を変数に代入
Tate = Convert.ToDouble(nudValue1.Value);
Yoko = Convert.ToDouble(nudValue2.Value);
// 四角形の面積を求める
Menseki = Tate * Yoko;
break;
}
// 求めた面積を表示するテキスト ボックス(txtAnswer) の Text プロパティに
// 求めた面積の値 (double) を文字列型 (string) に変換して代入する
txtAnswer.Text = Convert.ToString(Menseki);
}
|
| 健一 | :今回は、ちょっと難しかったかな? |
| 翔太 | :変数の種類はまだよく分からないけど、値を代入するといろいろ便利な使い方ができそうだ、というのはなんとなくわかった気がするよ。 |
| 美咲 | :そうね、変数がないと、その都度計算結果を具体的な値にして指定しないといけないし、変数どうしで計算できたりするのもいろいろ使い道がありそうだわ。 |
| 健一 | :変数というのは、プログラミングの世界ではとてもよく使われていて、この後の章でもでてくるはずだから、この機会に、どういうものかというイメージだけでもつかんでおこう。 |
さて、3 章はいかがだったでしょうか。実際のサンプルプログラムには、紹介していない部分で、いろいろなことを行っていますが、ここでは変数に焦点を絞るために省略しています。なので、ほかのことは気にせず、変数とはなにか、代入によって何が行われているのか、ということについて体験したことを覚えておいてください。
そして、次の章では時間の話が出てきます。プログラムが時間によって動きを変えるにはどうすればいいのか、翔太君たちと一緒に体験してみてください。
|