東京工芸大学 工学部 電子機械学科 2年 後期 応用プログラミング 第3回
|
|
今日の授業も、教室で、説明しながら一緒に進めていきます。
今週は、
を中心に勉強します。
新規プロジェクトを次の名前で開いてください。
" Project301 "
として開いてください。
デザインウインドウの名前も
Form1 -> Project301
に変更しておきましょう。(プロパティのなかの、Text を変更)
|
初めに今日の演習で作るプログラムの内容と、完成(間近の)イメージを掲げておきます。
今日は、
2つの入力枠に、数値を入力すると、それを足した値を右に表示する。
|
入力された文字をそのまま、あるいは、少し足したりして表示する方法は、前回までに実習しました。今日は、数値演算です。(コンピュータプログラムでは、計算のことを、演算という。)
例えば、入力枠に、”35” と入力したとします。
これを、そのまま表示するのなら今までの方法でできるのですが、数値として計算するためには、この入力を「数値」として、扱う必要があります。
ここで、「数値」と、「数字」の違いを説明しておきます。
■数字 「ABC」や「あいう」と同じように、単なる文字として扱われる、「123」という字。 「 あ+い 」 の計算ができないように、 文字としての「1」「2」は、 「 1+2 」 としても、「3」 にはならない。
■数値 大きさを持って、計算に使われる記号。 「1+2=3」 のように、計算ができる。
( 一般の数学のように、変数名として、aとか x とかが宣言されていれば、 「x=a+b」のような計算はできます。)
テキストボックスに入力された文字は、1,2,3のようなものも、単なる「文字」として扱われます。そこで、 数字(文字) <−> 数値 の変換が必要となります。
もしこれを行わないと、正しい計算ができません。場合によるとエラーになります。
|
まず、画面をデザインしておきましょう。
Textbox を3つ。(左から順に1,2,3となるように配置してください。普通に左から順番に作っていけば構いません。)
Label を3つ。 これは、順番とかは関係ありませんが、配置してから、文字として、画面にあるように、
「加算する数を2つ入力してください。」
「+」
「=」
と書き換えます。
「計算」 ボタンと、「終了」ボタンも配置しておきましょう。
Button を選んで配置します。
Button1 計算
Button2 終了
となるようにします。
|
とりあえず、配置ができたので、次には、ボタンを押したときの動作を記述します。
真ん中辺が少し間延びしていますが、ここには、あとから追加部分を入れるので、そのままにしておいてください。
動作は、「ボタンを押したら、どうなるかを記述する」のでしたね。
何はともかく、「終了ボタン」だけは、設定しておきましょう。
「終了」ボタンをダブルクリックして、プログラム入力ウインドウに移り、次のように入力します。(前回既にやっているはずです。)
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
次に、「計算」ボタンの動作を指定するために、「デザイン」ウインドウに戻り、「計算」ボタンをダブルクリックします。
まず、不十分な(間違った)プログラムを作ってみます。
これは、数値とするべきところを、文字のまま、計算しようとして、うまくいかない例です。
ここまで入力したら、▼ボタンを押して(右向きの▼ですが、文字の表示ができないので、今後このマークのまま表記します。)ビルド、実行してみます。
(もしかすると、途中で次のようなエラーメッセージが出されるかもしれません。そのときは、「いいえ」を選んで、編集画面に戻り、入力場所、文字などが違っていないか確認してください。大文字小文字の違いに注意。)
実行画面が出てきたら、数を入力してみましょう。
どうも、答えが変ですね。
これは、数値の足し算ではなく、文字を連続して出力することになったからです。
10 20 −> 1020
では、数値の計算にするためにはどうしたらよいでしょうか。
そのためには、入力された文字を、数値に変換する、という作業をします。
int.Parse(文字列) ToString() |
入力された文字を、数値に変換するには、次のようにします。
int num1;
num1 = int.Parse(textBox1.Text);
そのままでは、 "textBox1.Text" というのは、文字列です。これを数字に変換するのが、 int.Parse()
です。この、先頭の、 int の部分を他の型に変えると、他の型への変換になります。
このような変換を行った後の変数 "num1" は、整数型の数値データを持っていますので、普通の数値計算をすることができます。
ところで、そうして、計算された結果は、「数値」ですので、そのままでは出力できません。
再度文字に直さなければならないのです。(面倒ですが)
そのためには、次のようにします。
textBox3.Text = num3.ToString();
これを念頭にして、計算部分のプログラムを書くと次のようになります。
private void button1_Click(object sender, EventArgs e)
{
int num1, num2, sum1;
num1 = int.Parse(textBox1.Text);
num2 = int.Parse(textBox2.Text);
sum1 = num1 + num2;
textBox3.Text = sum1.ToString();
}
この後の実行時にエラーでプログラムがおかしくなる可能性がありますので、ここまで入力したファイルを保存しておきましょう。
「ファイル」 −> 「すべてを保存」 を選びます。
ファイルを保存したら、実行してみましょう。
実行すると、次のようになるはずです。
【演習問題1】 |
授業の説明に従って、"Project301" を一緒に作成します。
途中で一度、「ファイル」メニューから「csファイルに名前を付けて保存」を選び、ファイル名を、 " Project301.cs "
に変更して保存しておきます。
これで、そのほかのファイル名も変わっているはずです。
授業で作成したファイルのうち、 Project301.cs をメールに添付して送ってください。画面を印刷したものも提出してください。
【演習問題2】 |
課題1を参照して、新しい、プログラムを作成します。(一度終了して再度起動したほうがよいでしょう。)
プロジェクト名を " Project302 " とし、csファイルの名前は、"Project302.cs " とします。
入力された2つの数値を、A,B とします。
A+B
A-B
A*B
を出力するプログラムを作成しなさい。( 割り算は、整数値にならないことがあるので、この後解説します。 )
授業で作成した cs ファイル をメールに添付して送ってください。画面を印刷したものも提出してください。
|
ところで、この計算では、入力される値が、整数であると仮定していますが、それ以外の値を入れたらどうなるでしょうか。
計算ボタンをおすと、エラーとなって停止します。
そのとき、次のように、プログラムのどこでエラーが生じたかを(可能な範囲で)示してくれます。
これを見ると、
num1 を代入しようとしているところでエラーになっている、ということがわかります。
入力された値が整数ではないので、変換できないために、エラーメッセージを出して停止します。
この状態は「停止」であって、「終了」ではないので、まだ、プログラムの実行ウインドウは閉じていませんし、プログラムの編集しなおしもできません。
そこで、実行中のプログラムを、完全に停止しなければなりません。
エラーでウインドウがとじない時の対応法 、VC#の編集ウインドウの左上にある、 |
プログラムの実行ウインドウで × 印を押す、などの方法でも停止できるはずですが、下手をすると、ハングアップしてしまうかもしれませんので、その場合は、再度、ファイルを読み直すか、VC# を再起動する必要が生じるかもしれません。
どうしてもおかしくなったら、先生を呼んでください。
|
整数より広い範囲の数値を扱うためには、変数を、実数型にすればよいのですね。
そこで、実数型 float 宣言をして使えばよいのですが、より精度よく、広い範囲の数値を扱うために、「倍精度実数型:double」という型がありますので、それを使いましょう。
前のプログラム部分の、int 部分を全部 double に書き換えます。
int -> double
double num1, num2, sum1;
num1 = double.Parse(textBox1.Text);
num2 = double.Parse(textBox2.Text);
sum1 = num1 + num2;
textBox3.Text = sum1.ToString();
このようにして実行すると、次のように、実数型でも実行できます。
変換できるかどうかを事前チェック double.TryParse( ) double 型に変換できるかどうかを事前にチェックし、変換できれば、変換も同時に行います。変換できなくてもエラーにならずに、空の値と与えます。 double.TryParse(検査されるもの, out 出力変数名) |
上記のようにしても、実は、数値以外の入力があると、エラーになってしまいます。
次のように入力するとエラーになります。数ではないので、足せないのは当然なのですが、このような時は、エラーにならずに、警告メッセージを表示するとかしてほしいですね。
そこで、
「計算をする前に、入力された文字が数値に変換できるかどうか、チェックする。」
という処理を入れましょう。
textBox1.Text の内容が、 double 型の数値として、 num1 に出力できるかどうかを検査し、 可能なら、 true という値を、 ダメなら、 false という値を返す、 という処理は、次のように書きます。 double.TryParse(textBox1.Text, out num1) |
(出力変数前に、出力であることを示す out を付ける約束になっています。
実際に使うときは、
if (double.TryParse(textBox1.Text, out num1)==true) { 変換可能な場合の処理 } else { 変換不可能な場合の処理 } |
のようにします。
private void Calc_button1_Click(object sender, EventArgs e)
{
double num1, num2, sum1;
if (double.TryParse(textBox1.Text, out num1)==true
&& double.TryParse(textBox2.Text, out num2)==true)
{
num1 = double.Parse(textBox1.Text);
num2 = double.Parse(textBox2.Text);
sum1 = num1 + num2;
textBox3.Text = sum1.ToString();
}
else
{
textBox3.Text = "数値を入力してください";
}
}
|
数学関数として、 sin,cos や、sqrt(平方根), exp, pow(累乗)などを使用することができます。
前期にやったC言語のコンパイルのように、特別なコンパイル法の指定は不要です。
次の例を参照してください。
{
num1 = double.Parse(textBox1.Text);
num2 = double.Parse(textBox2.Text);
ans1 = Math.Sqrt(num1);
textBox3.Text = ans1.ToString();
ans2 = Math.Sin(num1);
textBox4.Text = ans2.ToString();
ans3 = Math.Exp(num1);
textBox5.Text = ans3.ToString();
ans4 = Math.Pow(num1, num2);
textBox6.Text = ans4.ToString();
}
代表的な数学関数の書き方。
計算 | 数値計算だけするとき | 計算結果を文字にするとき |
a = √b | a = Math.Sqrt( b) | textBox1.Text = Math.Sqrt( b).Tostring ( ) |
a = sin( t ) | a = Math.Sin( t ) | textBox1.Text = Math.Sin( t).Tostring ( ) |
a = e^x | a = Math.Exp( x ) | textBox1.Text = Math.Exp( x).Tostring ( ) |
a = b^n | a = Math.Pow( b, n ) | textBox1.Text = Math.Pow( b,n ).Tostring ( ) |
なお、表の右欄にあるように、途中で変数を使わずに、直接次のようにも書けます。途中結果をそのあとで使用する必要が無いときには、下記のような使用法のほうが簡単です。
ans2 = Math.Sin(num1);
textBox4.Text = ans2.ToString();
↓
textBox4.Text = Math.Sin(num1).ToString();
|
今のままでは、結果表示部分にも入力できてしまいます。ここは、結果を表示するだけで、入力、修正できないようにしたいので、次のように設定します。
表示部分をクリックし、右の「プロパティ」にある、次の項目を変更します。
ReadOnly False -> True
【演習課題】
以下の各課題を行い、
(1)実行画面をキャプチャー、印刷して提出(1問ごとに)
先頭に学籍番号と氏名を書くこと。
(2)各問題で、 .cs ファイルを保存し、( Project301.cs 〜 Project305.cs”,(できたら ”Project306.cs”)) メールに添付して送りなさい。(1問ごとに)
メールのタイトル(サブジェクト)は ”Project301 " 〜 ”Project306 "
また、メールの1、2行目に、学籍番号と、氏名を書いてください。
【課題3】
課題1を参照して、新しい、プログラムを作成します。(一度終了して再度起動したほうがよいでしょう。)
プロジェクト名を " Project303" とし、csファイルの名前は、"Project303.cs " とします。
入力された2つの数値を、A,B とします。
A+B
A-B
A*B
A/B
を表示するプログラムを作成しなさい。なお、割り算の結果はあまりを表示するのではなく、少数以下の可能な桁まで表示するものとします。
表示例は下を参考にしてください。
【課題4】
プロジェクト名を " Project304 " とし、csファイルの名前は、"Project304.cs " とします。
次のように、各種の数学関数の演算結果を表示するプログラムを作成しなさい。
ヒントを、下記に、プログラムの一部を掲げます。
【課題5】
Project305 とします。
5個の数値を入力し、その 最大値、 最小値を 出力するプログラムを作成しなさい。
【課題6】
Project306 とします。
三角形の面積を求めて表示するプログラムを作成しなさい。
入力として、2辺の長さと、その挟む角度を入力するものとします。
面積は (1/2) ab sinθ
で与えられます。
【課題7】
応用課題です。時間があればやってみてください。
Project307 " とします。
入力された2つの数値を、A,B とします。
A の B 乗を求めて表示するプログラムを作成しなさい。
ただし、Aは実数数値、Bは、正の整数とします。それ以外の入力があった時には、警告を出して、再入力モードになるようにします。
累乗を求める関数もありますが、ここでは、繰り返しの、 for を用いて、B回掛け算を繰り返します。
計算の部分は、おおよそ、次のような形になります。宣言その他細かい部分は、必要に応じて補ってください。
double ans=1;
for( i=1; i<=b; i++)
{
ans *=a;
}