18
Form からの入力と条件分岐 今回は、簡易電卓を作ってみます。 今日の課題は、右のようになります。最初の課 題は、足し算専用の電卓ですが、提出レポート の課題は、四則演算(加算、減算、乗算、除算) や、あるいは mEq 計算の電卓などです。 前置きは別にして、さっそく今日の課題を行いましょう。 プロジェクトの生成と画面の準備 まず「新しいプロジェクト」を開き、次に C#のフォームアプリケーションを選 びます。 ここまでは前回と同じですね。 名称に、今回は day5_input1 と設定してみましょう。(自分で管理できるなら、 何でも構いません。なお、画像は day4 になっています画面上に様々な要素をはめ込んでいきます。

Formからの入力と条件分岐 - signalysis.co.jp · Formからの入力と条件分岐 今回は、簡易電卓を作ってみます。 今日の課題は、右のようになります。最初の課

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Formからの入力と条件分岐  

今回は、簡易電卓を作ってみます。  

 

今日の課題は、右のようになります。 初の課

題は、足し算専用の電卓ですが、提出レポート

の課題は、四則演算(加算、減算、乗算、除算)

や、あるいはmEq計算の電卓などです。  

 

前置きは別にして、さっそく今日の課題を行いましょう。  

 

プロジェクトの生成と画面の準備  

 

 

まず「新しいプロジェクト」を開き、次に C#のフォームアプリケーションを選びます。  

ここまでは前回と同じですね。 名称に、今回は day5_input1 と設定してみましょう。(自分で管理できるなら、何でも構いません。なお、画像は day4になっています…) 画面上に様々な要素をはめ込んでいきます。  

これは「画面デザイン」です。教材としては、比較的単純に作っていますが、

同じことができればよいので、レイアウトは各自の自由に変えて作ってみ

てください。  

作った人によって、画面の見え方が大きく違うのが、Windows(とか、ス

マホ)など、GUI を用いたプログラミングの面白さです。  

 

はめ込む要素は全部で 5 つです。種類は、前回扱った「ボタン」と、「ラベル」

の他に「テキスト BOX」が追加になります。

先週行った手順を思い出してください。

まず、ツールボックスを開きます。  

ここで、Label, TextBox, Button など、追加する種類を選んではめ込みます。

初に、TextBox を入れてみます。(今週新しく使います。)

ツールボックスで、TextBox を選び(一度クリックし、)フォームの上に配置し

ます。今日は電卓を作るので、二つの数値を入力して、計算を行いますが、そ

の二つの数値を入力するための、二つの TextBox を用意します。

この TextBox は、プログラム中で値を読み出すのに使います。ですので、名前

をつけます。プロパティを開いて(Name)の部分を選択してください。

名前は、 valueA_input   と  valueB_input  

としましょう。(他の名前にしても構いませんが、プログラム中でこの名称を使

っていますので、自分の責任で読み替えてください。)

二つ目の数値の入力 Boxも用意します。

引き続き、どの入力 Box が A で、どの入力 Box が B か、わかるようにラベルを用意してみます。それぞれの入力 Boxの左側(か上)に作るのが一般的です。

TextBoxには名前をつけましたが、Labelにはつけていません。Text欄を変えただけです。理由は、今回はこの Labelにはプログラム動作を定義しないから、です。(ボタンばかりではなく、この「文字ラベル」をクリックした時に、こう

する、という処理も、プログラミングできます。そういう時は、名前をつけた

方がよいでしょう。)ラベル二つとも Text欄を変えます。 次に、「閉じる」ボタンを用意します。 右上の×で終了させても構いませんが、やはり「終了」ボタンが画面のにあっ

た方がわかりやすい(というか、勉強になる)と思ったので、そうしました。 ツールボックスで Buttonを選んで、画面の好きな位置に貼付けます。

このボタンは、プログラム中で「ボタンが押されると」というプログラムを書

くので、closeButtonと名前をつけました。 Text は、シンプルに「電卓の終了」としてみましたが、先週の教材を参考にして適当に表示を書いてみて下さい。

今度は、足し算ボタンを追加します。

画面のレイアウトは、好きに工夫しましょう。 このボタンも、「ボタンが押されたら」という処理があるので、名前をつけてお

きます。addButtonとしました。

「足し算ボタン」ですから、電卓のように Textを「+」のマークにしてみましたが、やや小さいです。そこで、フォントの設定を変えて大きくしてみました。

後に、「答え」を表示させるためのラベルも加えました。

これで画面の準備はできましたが、整理しておきます。

種類 Name 表示 動作など

TextBox valueA_input ユーザ入力 ユーザの入力領域 TextBox valueB_input ユーザ入力 ユーザの入力領域 Label label1 「数値 A」 Label label2 「数値 B」 Button closeButton 「閉じる」 押されたらプログラム終了 Button addButton 「+」 押されたら計算結果を表示 Label answerLabel 「答え」 結果を表示する領域

画面用の要素につけた名前で、プログラムを書いていきますので、整理してお

く必要があります。 ここで、プロパティの入力欄について説明します。  

上に表示されている(ここでは label3)は、どの項目のプロパティかを表示しています。設定する項目を間違えないようにまず確認して下さい。 なかなか、設定したい項目がみつからない場合、項目順の表示から「アル

ファベット順」に切り替えてみると良いかも知れません。 初は項目順

になっています。

   

プログラミング  

「閉じる」ボタン  

これは前回も扱いました。 画面上で、closeButtonをダブルクリックしてください。 { と } で囲まれた領域に、 Close();  

と書き込みます。

これで、「閉じる」ボタンのプログラムは完了です。 なお、Visual Studio 2010を使っている人、画面の見え方がかなり異なります。 また、Form1 に自動生成されているソースがかなり多いため、難しい画面になっています。昨年度の資料を参考にして、よくみて下さい。    

さて、本日のメインイベント、「足し算」ボタンのプログラムです。  

 

「足し算」ボタン  

足し算ボタンをダブルクリックしてください。 足し算ボタンが押された時に呼び出される処理の、「入れ物」が表示されます。 ここで、用意された関数の { と } の間に、以下のプログラムを書きます。

今日は、この図の 27行目から 46行目が正しく入力できれば、まずは「課題」の第一歩は OKです。ここまで動作させたレポートで、「C」評価はクリアです。 さて、個別に見ていきましょう。 先頭の Int32   a,  b,  c;  bool   result;  計算に使う、aと bと cを用意します。今回はWindowsのプログラムですので、Int32というちょっと特殊な integer型を指定します。

厳密に言うと、これは、オブジェクト指向の Classで、a, b, cは それぞれインスタンスと呼ばれますが、「ちょっと違う書き方」という 程度の理解で問題ありません。

a, b, cのどれも、32ビットの整数です。

bool   result;  

は、boolean(論理代数)の変数で、true(真)か、false(偽)か、どちらかし

か扱えません。ここでは「成功」か、「失敗」か、という処理の結果(result)を保存するために、この変数を用意しました。 なお、trueは(中川翔子風に)トゥルーと読みますが、falseはフォ—―ルス

と読みます。ファルスではありません! 英単語の Allはオールですね?この単語をアルと読む人はいませんね?サッカーの All Japan はオール・ジャパンであって、アル・ジャパンではありません。読み方に気をつけましょう。  

次の result  =  Int32.TryParse(  valueA_input.Text,  out  a  );  これは、Int32型の整数に用意された「TryParse」(文字列を整数型に変換して

みる; Try だから試す)という関数を呼び出しますが、そこに、valueA_inputの Textという入力 Boxにユーザが入力したテキストを手渡しています。 結果は、成功したら a という入れ物に渡されますが、失敗した場合には、結果は aには入っていません。resultが falseになります。 コンソール型のプログラムで扱う場合には、scanfを使いますが、今はほとんどの人がWindowsのプログラムになれてしまっていて、コンソール型のプログラムを書いて使う人はあまりいなくなりました。 だから、より実用的なWindowsのプログラムで学習することにしました。 数値 Bの入力の処理 result  =  Int32.TryParse(  valueB_input.Text,  out  b  );  も、やっていることは同じです。 テストランをすると、整数の足し算が成功するはずです。ですが、実数を指定

するとメッセージを出して計算してくれません。実数が計算出来ない電卓なん

て、使い物になる気がしません。これは、あとから見て行きましょう。

条件分岐  

今回は、if文という文を用いて新しい文法表現が出て来ています。 If文は、以下のように何通りかの書き方があります。

ですが、文がたくさんある場合にはどうしたら良いでしょうか? { }で囲まれたブロックを使います。

{ }中括弧で囲まれている部分は、一塊で if の時に実行される部分だと読みます。 文が 2行以上ある場合には、ブロックを使わないと書ききれません。

if  (  条件式   )  文;  

読み方は、「条件式が true(0 以外)だったら、文を実行する。」です。

if  (  条件式   )  ブロック  

「条件式が true(0 以外)だったら、ブロックを実行する。」 例 if  (  a==b  ){  

  printf(  “aと bは等しい。¥n”);  

}  

条件が成り立たなかった場合の記述をしているケースもあります。

この例の文1、文2の部分には、ブロックを書くことも出来ます。 今日の課題の例では、全部をブロックで書いています。 プログラムの流れを日本語に置き換えて読んでいきます。

1. まず、数値 Aの入力 Boxに入力されている文字を、数値に変えてみる。 result = Int32.TryParse( valueA_input.Text, out a );

成功したら resultは trueで、失敗したら resultは falseになる。 2. これが成功したなら、{ } で囲まれている部分の処理を行う。(2-x) if( result )

{ // 入力Boxの入力成功

2-1. 数値 Bの入力 Boxに入力されている文字を、数値に変えてみる。 result = Int32.TryParse( valueB_input.Text, out b );

2-2. これが成功したなら、{ } で囲まれている部分の処理を行う。(2-2-x) if( result )

{ //入力Boxの入力成功

2-2-1. c = a + b を計算する。 c = a + b;

2-2-2. answerLabelに、結果を表示する。 answerLabel.Text = string.Format( "{0} + {1} = {2}", a, b, c );

2-3. [失敗した場合]は、{ }で囲まれている部分の処理を行う。(2-3-x) }

else

if  (  条件式   )  文 1;  

else     文 2;  

「条件式が true(0 以外)だったら、文 1 を実行し、そうでない場合

には文2を実行する。」と読みます。

{

2-3-1. answerLabelに、「Bが整数ではありません。」と表示する。 answerLabel.Text = "Bが整数ではありません。";

3. [失敗した場合]は、{ }に囲まれている部分の処理を行う。(3-x) 3-1. answerLabelに、「Aが整数ではありません。」と表示する。 answerLabel.Text = "Aがが整数ではありません。";

この例では、条件を細かく、深く、分類しながら処理を分けていきます。 Ifは、深さが何重にもなることがありますが、ifと elseでは「同じ深さ」のif と else が対応します。  

また、{   }は必ず対応する相

手がいて、ここで囲まれた

部分は「一塊」(ひとかたま

り)になりますので、その

「一塊」の中に別の if があ

って、別の else と対応して

いても、{  }の外の else とは

無関係なのです。  

マトリョーシカは、みんな同じ顔かたちをしていますが、if ブロックの中の別の

if ブロックは、違う顔かたちをしていても構いませんし、外から見ただけでは、

中に何が入っているか、気にせず、同じ深さの   {  }  を対応づけていきます。  

さっきから「同じ深さ」と何度も書いていますが、開発ツールなどの環境では、

論理が明快になるように、{ }の位置を自動的に調整してくれています。 この「深さ調節」をインデントと言いますが、インデントをきちんとしていな

いプログラムは、とにかく読みにくい。インデントがきちんと書けないプログ

ラマは、嫌われます。私も、インデントが書けないプログラマとは、絶対に一

緒に仕事したくない。 初の3回程度までは「警告」してレポート返却しますが、警告されてもイン

デントがきちんとできないレポートは、黙って1ランク(Aなら B、Bなら C、Cなら Dに)下げて成績をつけますので、覚悟しておいてください。

表示文字列の編集  

answerLabel.Text  =  string.Format(  "{0}  +  {1}  =  {2}",  a,  b,  c  );   さて、結果の表示です。answerLabelの Textは、表示する文字列を設定する部分ですが、そこに string.Format(  “{0}  +  {1}  =  {2}”,  a,  b,  c  );  

の結果を代入しています。Format とは、「書式」のことを言います。どんな形

に整形して、内部の数値を出力するか、ということです。 この {0} などは、約束事で、printf の書式指定の%d に対応しますが、ここではあまり「型」にこだわる必要がありません。{0}, {1}, {2}は、それぞれ、1番目、2番目、3番目に書かれているインスタンス(変数)の値が代入される領域で

す。 ここで、A + B = Cのように、一つの「文字列」にまとめられて、一つにまとめてから answerLabelに代入する、ということを行っています。

C言語とC#を用いたWindows プログラムの違い  

一番大きく異なる点は、C++やC#が主にはWindows環境などで使われているため、TextBoxなど画面に表示される「クラス」と呼ばれる大量の「道具」が使えるようになっていることです。 入門編では、必要 小限の道具だけ扱うつもりですが、checkBoxだとか、直感的に使える(皆さんが見たことがある)道具が少なくないので、使える人は、

どんどん使っていってもいいでしょう。 入門レベルで一番大きく異なるのは、「画面への出力」方法と、「入力方法」で

す。ですがその入出力部分と、全体の枠組み(呪文のような、外の世界の環境)

を除外すると、今回の   if  のように、「制御構造」の文法がC言語と全く同じです。  

それどころか、制御構造だけなら、java言語もC言語と同じように読めます。  

 

一度覚えてしまえば、入出力はWindowsプログラムの方が楽なので、実用的な

プログラムもどんどん書けます。  

 

ある程度「論理構築」になれた段階で、今度は、C言語のコンソールだけの入出力を学習し、C言語のすべてを(Windows環境を使わずに)学習した人との差が出ないようにしていく予定です。 CheckBoxや、DropDownListなどを使いたいと思った人は、 GoogleやYahooなどで検索してみて下さい。たくさんサンプルが出てきます。 授業でも、少しずつ扱いたいと思っています。

本日のレポート課題  

課題(1)  

整数専用、足し算専用の電卓を作って下さい。(C評価課題)  

実行画面(壁紙を一部含める)と、ソースコードを報告して下さい。  

(但し課題(2)を提出する人は、この課題は途中なので報告しなくて構いません。)  

課題(2)  

「整数」以外、実数でも計算ができるように、型を直して下さい。(B評価課題)  

(但し課題(3)を提出する人は、この課題も途中なので報告しなくて構いません。)  

修正方法は、Int32をDoubleに書き換えるというやり方です。サンプルプログ

ラムを3カ所修正すれば動作するようになるはずです。Dは大文字です。 また、「Aが整数ではありません。」というエラーメッセージも、「Aが数値で

はありません。」というメッセージに書き換えて下さい。

課題(3)  

四則演算ができるように、他に、[  -  ]マイナスボタンや、[  X  ]掛けるボタン、[÷]

ボタンなども作ってください。(A評価課題)  

四則演算を実行した画面と、プログラムのコード(テキスト)をレポートに貼

付けて下さい。

なお、割り算の場合「割る数」がゼロの場合にはエラーを起こします。

割る数がゼロでないように警告を出すには、どのようにプログラム

したら良いか、考えてプログラムして下さい。(1ランク引き上げます。)

課題(4)  

以下のいずれかの専用電卓を作ってみて下さい。(S評価課題9.5点)  

(1) 身長と体重を入力すると、BMIを数値表示する。  

(2) NaClのmEq/L濃度と、蒸留水の量を入力すると、何gの食塩を投入

したら良いか表示される専用電卓  

(3) 為替レートを予め設定しておいて、「円」を入力すると「ドル」や「元」

などが表示されるプログラム  

全部作ったら、1項目あたり1点ずつ引き上げます。動作画面とソースコード

をつけて下さい。

おまけ

ツールボックスから、Formの背景を変えたり、部品の色を変えたりできます。 デザインを好きに変えてみてください。そちらの修正でも 1 点分の評価upは行います。但し、「この項目を編集しました」と、自己申告して下さい。(色指定、フォント変更など 1項目 0.2点程度で、加点の上限は1点です。)

もう一つのおまけ  

 

こんな感じの電卓ソフトを作ってみて下さい。  

RadioButton(ラジオボタン)を使います。自動的にどれか一つだけが選択されるボタンです。それぞれに、naclButton,  kclButton,  nahco3Buttonという

名前をつけます。 濃度計算をする際に、 if (naclButton.Checked)

{

}

else if (kclButton.Checked)

{

}

else if (nahco3Button.Checked)

{

}

という分岐処理を行うと、NaCl か、KCl か、NaHCO3か、処理を分けて、ど

の濃度計算を行うか決めることができます。 これも発展課題です。(この課題単独で、2点分の上乗せをします。)  

全部消化すると、10点満点で 14.5点になります。でも、あまり欲張らずに時間内にできる範囲でやりましょう。(採点も面倒なので・・・)