東京工芸大学 工学部  電子機械学科 2年 後期 

応用プログラミング 第3回
 2016.10.4
藤木 文彦

http://ffujiki.web.fc2.com/t-kougei/
http://fujiki.tv/t-kougei/ouyouprog/

fujiki.kougei@gmail.com

 
 ■ 1   ■ 2   ■ 3   ■ 4   ■5 5   ■ 6   ■ 7   ■ 8   ■ 9   ■ 10   ■ 11  ■ 12    ■ 13   ■ 14   ■ 15   ■ 00   ■ 00   ■ 00

インデックスに戻る



  1.今日の内容概要


 
今日の授業も、教室で、説明しながら一緒に進めていきます。

 今週は、


を中心に勉強します。

 新規プロジェクトを次の名前で開いてください。

" Project301 "

として開いてください。

 デザインウインドウの名前も

Form1 -> Project301

に変更しておきましょう。(プロパティのなかの、Text を変更)


  2.出来上がりイメージ


 初めに今日の演習で作るプログラムの内容と、完成(間近の)イメージを掲げておきます。

 今日は、
 2つの入力枠に、数値を入力すると、それを足した値を右に表示する。



  3.文字と、数値の違い。

 入力された文字をそのまま、あるいは、少し足したりして表示する方法は、前回までに実習しました。今日は、数値演算です。(コンピュータプログラムでは、計算のことを、演算という。)
 例えば、入力枠に、”35” と入力したとします。
 これを、そのまま表示するのなら今までの方法でできるのですが、数値として計算するためには、この入力を「数値」として、扱う必要があります。
 ここで、「数値」と、「数字」の違いを説明しておきます。

 
■数字  「ABC」や「あいう」と同じように、単なる文字として扱われる、「123」という字。 「 あ+い 」 の計算ができないように、 文字としての「1」「2」は、 「 1+2 」 としても、「3」 にはならない。

 
■数値 大きさを持って、計算に使われる記号。 「1+2=3」 のように、計算ができる。
  ( 一般の数学のように、変数名として、aとか x とかが宣言されていれば、 「x=a+b」のような計算はできます。)

 テキストボックスに入力された文字は、1,2,3のようなものも、単なる「文字」として扱われます。そこで、 
数字(文字) <−> 数値 の変換が必要となります。

 もしこれを行わないと、正しい計算ができません。場合によるとエラーになります。

  4.画面の作成


 まず、画面をデザインしておきましょう。

 Textbox  を3つ。(左から順に1,2,3となるように配置してください。普通に左から順番に作っていけば構いません。)
 Label を3つ。 これは、順番とかは関係ありませんが、配置してから、文字として、画面にあるように、

「加算する数を2つ入力してください。」
「+」
「=」

と書き換えます。



「計算」 ボタンと、「終了」ボタンも配置しておきましょう。

 Button を選んで配置します。

 Button1  計算
 Button2 終了

となるようにします。


  5.動作の記述


 とりあえず、配置ができたので、次には、ボタンを押したときの動作を記述します。
 真ん中辺が少し間延びしていますが、ここには、あとから追加部分を入れるので、そのままにしておいてください。

 動作は、
「ボタンを押したら、どうなるかを記述する」のでしたね。

 何はともかく、
「終了ボタン」だけは、設定しておきましょう。

「終了」ボタンをダブルクリックして、プログラム入力ウインドウに移り、次のように入力します。(前回既にやっているはずです。)



private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}




 次に、
「計算」ボタンの動作を指定するために、「デザイン」ウインドウに戻り、「計算」ボタンをダブルクリックします。

 
まず、不十分な(間違った)プログラムを作ってみます。
 これは、数値とするべきところを、文字のまま、計算しようとして、うまくいかない例です。





ここまで入力したら、
ボタンを押して(右向きのですが、文字の表示ができないので、今後このマークのまま表記します。)ビルド、実行してみます。

(もしかすると、途中で次のようなエラーメッセージが出されるかもしれません。そのときは、「いいえ」を選んで、編集画面に戻り、入力場所、文字などが違っていないか確認してください。大文字小文字の違いに注意。)



 実行画面が出てきたら、数を入力してみましょう。
 どうも、答えが変ですね。



これは、数値の足し算ではなく、文字を連続して出力することになったからです。

  10 20  −> 1020

では、数値の計算にするためにはどうしたらよいでしょうか。

 そのためには、入力された文字を、数値に変換する、という作業をします。

  6. 文字を数値(整数)に変換する。数値を文字列に戻す。
  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 ファイル をメールに添付して送ってください。画面を印刷したものも提出してください。


 7.整数以外を入力した場合


 ところで、この計算では、入力される値が、整数であると仮定していますが、それ以外の値を入れたらどうなるでしょうか。



 計算ボタンをおすと、エラーとなって停止します。
 そのとき、次のように、プログラムのどこでエラーが生じたかを(可能な範囲で)示してくれます。



 これを見ると、
 num1 を代入しようとしているところでエラーになっている、ということがわかります。

 入力された値が整数ではないので、変換できないために、エラーメッセージを出して停止します。
 この状態は「停止」であって、「終了」ではないので、まだ、プログラムの実行ウインドウは閉じていませんし、プログラムの編集しなおしもできません。

 そこで、実行中のプログラムを、完全に停止しなければなりません。






エラーでウインドウがとじない時の対応法

、VC#の編集ウインドウの左上にある、

 「■」 マークを押して、実行を中断します。




上のボタンが無いときは、

「デバッグ」 −> 「デバッグの停止」 または 「すべて中断」 を選びます。






 プログラムの実行ウインドウで × 印を押す、などの方法でも停止できるはずですが、下手をすると、ハングアップしてしまうかもしれませんので、その場合は、再度、ファイルを読み直すか、VC# を再起動する必要が生じるかもしれません。
 どうしてもおかしくなったら、先生を呼んでください。

 8.倍精度実数型 double


 整数より広い範囲の数値を扱うためには、変数を、実数型にすればよいのですね。
 そこで、実数型 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 = "数値を入力してください";
}
}

  9.数学関数の使用法 sin,cos,exp,sqrt

 数学関数として、 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();

  10.入力できない枠を設定する



 今のままでは、結果表示部分にも入力できてしまいます。ここは、結果を表示するだけで、入力、修正できないようにしたいので、次のように設定します。

表示部分をクリックし、右の「プロパティ」にある、次の項目を変更します。

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;
}



inserted by FC2 system