AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
10:簡単計算ソフトを作ってみよう(2)
 
簡単といっても足し算だけでは「計算ソフト」とは呼べません。せめて四則計算(足し算(加算)、引き算(減算)、掛け算(乗算)、割り算(除算))が出来るようにします。
Delphiでの四則計算は、
整数(integer)の場合
  足し算(加算) : +
  引き算(減算) : -
  掛け算(乗算) : *
  割り算(除算) : div
  余 り(剰余) : mod
実数(single、double)の場合
  足し算(加算) : +
  引き算(減算) : -
  掛け算(乗算) : *
  割り算(除算) : /
文字列(string)の場合
  結 合 : +

となります。div、mod の場合には前後に半角空白文字を入れて下さい。 例:「c := a * b ;」「c := a div b ;」 整数の割り算では商は切り捨てされます。
計算式には数学表現と同じく、括弧 (、) を使う事が出来ます。中括弧 {、} や 大括弧 [、] は使えません。 例:「d := ( a + b ) * c ;」「e := ( ( a + b ) * c + 10 ) * d ;」
計算式には数値そのもの(定数)を使う事が出来ます。
整数の定数  1 100 -50 など
   16進数の場合:  $ff $0099aabb など
実数の定数  12.345 0.0567 -100.001 など
   指数表現の場合: 12e8 0.123E-10 など
   Pi ・・・ 円周率 3.141592…・
文字列の定数 ''(中身は空) 'abc' 'DEF'
   文字「'」は「''」と記述する。
   「ABC'DEF」と書く場合は 'ABC''DEF'
   「'」と1文字だけの場合は ''''
   #文字の後に0〜255の数を書くとASCII文字
     TABコード値の場合は #9
     改行文字は #13 + #10

よく利用する定数の場合には、定数宣言(const)を行う事も出来ます。変数宣言(var 〜)の前に行います。定数として宣言した識別子は値を変える事の出来ない変数のような扱いをする事が出来ます。大文字・小文字は区別されませんが、変数は小文字で、定数は大文字で記述するようにプログラミングする場合が多いようです。が、あくまでも自由です。先頭は大文字にしたり、下線を付けたり、先頭に意味のある文字を付ける等があります。
procedure TForm1.Button1Click(Sender: TObject);
const
 ALPHA = 100 ;
var
 a , b , c : integer ;
begin
 a := StrToInt(Edit1.Text) ; // a ← Edit1
 b := StrToInt(Edit2.Text) ; // b ← Edit2
 
 c := a + b + ALPHA ; // 計算 結果はcに入れる
 
 Edit3.Text := IntToStr(c) ; // Edit3 ← c
end;
定数 ALPHA の値は 100 固定で、
プログラム内での変更は出来ません。
 
 
計算方法の切り替えは、ラジオボタンコンポーネントを利用する事にします。
コンポーネントパレット[Standard]の中にある「RadioButton」コンポーネントをクリックして選択します。

フォーム Form1 画面上でクリックして RadioButton1 オブジェクトを配置します。

オブジェクトインスペクタ画面でRadioButton1 オブジェクトの Captionプロパティを「足し算」と入力変更します。

フォーム Form1 画面上の「RadioButton1」という文字が「足し算」という文字に変わります。
文字「足し算」の右横へマウスを移動するとその境界線上でマウスカーソルが変わります。

マウスドラッグをして文字が切れない程度までに境界線を狭くします。

同様に、コンポーネントパレット[Standard]の中の「RadioButton」コンポーネントをあと3つ追加し、各オブジェクトの Caption プロパティをそれぞれ、「引き算」「掛け算」「割り算」と入力変更し、文字が切れない程度までに境界線を狭くします。

ラジオボタンを押したとき、フォーム Form1画面上の「+」をそれぞれ表示変更させたいので、RadioButton1 〜 RadioButton4 各オブジェクトの OnClickイベント内で表示変更を行うプログラミングを施します。
 
オブジェクトインスペクタ画面でRadioButton1 オブジェクトの OnClickイベント欄でダブルクリックすると「RadioButton1Click」という文字が入ります。

コードエディタ画面に
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
 
end;
というプログラムコードが追加されます。

コードエディタ画面で、下記のように記述します。
// 「足し算」にチェック
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
 Label1.Caption := '+' ;
end;
 

同様にして、オブジェクトインスペクタ画面で RadioButton2 〜 RadioButton4 各オブジェクトの OnClickイベント欄でダブルクリックして「RadioButton2Click」〜「RadioButton4Click」を作成し、コードエディタ画面で、下記のように記述します。
// 「引き算」にチェック
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
 Label1.Caption := '−' ;
end;
 
// 「掛け算」にチェック
procedure TForm1.RadioButton3Click(Sender: TObject);
begin
 Label1.Caption := '×' ;
end;
 
// 「割り算」にチェック
procedure TForm1.RadioButton4Click(Sender: TObject);
begin
 Label1.Caption := '÷' ;
end;

作成したプログラムを保存します。メニュー「ファイル」→「すべて保存」をクリックして下さい。
 
プログラムのコンパイルを行います。メニュー「プロジェクト」→「SimpleCalc を再構築」をクリックして下さい。
 
コンパイル(再構築)が正常終了したら、出来上がったアプリケーション・プログラムを実行します。メニュー「実行」→「実行」をクリックして下さい。

各ラジオボタンのチェックを行ってみて下さい。そのチェックにより Label1オブジェクトの内容が、「+」「−」「×」「÷」と変化するのを確認して下さい。
 
ラジオボタン RadioButton オブジェクトにチェックを入れると、Checked プロパティが「True」になります。チェックが外れると「False」になります。
逆に言えば、Checked プロパティに「True」を入れるとチェックが付き、「False」を入れるとチェックが外れます。
 
ラジオボタン RadioButtonコンポーネントは、その画面の中のうちの1つだけにチェックを入れる事が出来ます。1つにチェックを入れると他のラジオボタンのチェックは外れます。
 

 

実行して最初の状態は足し算状態ですが、フォーム Form1画面上の RadioButton1 オブジェクトにチェックが入っていませんので、プログラムの起動時の初期化処理として、チェックを入れるようにします。
コードエディタ画面で
// 起動時
procedure TForm1.FormShow(Sender: TObject);
begin
 // 初期化
 Edit1.Text := '0' ;
 Edit2.Text := '0' ;
 Edit3.Text := '' ;
 RadioButton1.Checked := True ; // 最初は+
end;
と記述します。
 
※画面デザイン時にオブジェクトインスペクタ画面で RadioButton1オブジェクトの Checked プロパティを「True」に指定しておく事も出来ます。

メニュー「ファイル」→「すべて保存」をクリックして下さい。
 
メニュー「プロジェクト」→「SimpleCalc を再構築」をクリックして下さい。
 
コンパイル(再構築)が正常終了したら、メニュー「実行」→「実行」をクリックして下さい。
 
どんな計算を行うのかを選択出来るようにして演算子を切替表示出来るようにしましたので次は、実際の計算を出来るようにします。
コードエディタ画面で、Button1Click の記述箇所を見ます。画面をスクロール表示させて探すのも良いですが、プログラムが大きくなると探すのも大変ですので、オブジェクトインスペクタ画面で Button1オブジェクトの「イベント」ページの OnClick 欄(既に「Button1Click」が記述されています)でダブルクリックする事によって、コードエディタ画面を「Button1Click」の記述箇所に移動表示する事が出来ます。
 
プログラムを以下のように書き換えてみます。
// 計算
procedure TForm1.Button1Click(Sender: TObject);
var
 a , b , c : integer ;
begin
 a := StrToInt(Edit1.Text) ; // a ← Edit1
 b := StrToInt(Edit2.Text) ; // b ← Edit2
 
 // 計算
 if (RadioButton1.Checked = True) then
  c := a + b ;
 if (RadioButton2.Checked = True) then
  c := a - b ;
 if (RadioButton3.Checked = True) then
  c := a * b ;
 if (RadioButton4.Checked = True) then
  c := a div b ;
 
 Edit3.Text := IntToStr(c) ; // Edit3 ← c
end;
 
 if (RadioButton1.Checked = True) then
  c := a + b ;

 if (RadioButton1.Checked = True) then c := a + b ;
のように記述しても構いません。
 
この部分は、「もし(if)」RadioButton1 の Checked プロパティの値が True「のとき(then)」は、c := a + b の計算を行う、という意味になります。状態がどのようになっているかを判断するのに、if 文が利用されます。
判断・選択 if 文 
書式: if 条件式 then 文
 
説明:もしも条件式が真ならば、文を実行する。
   文は1文だけなので、2文以上にする時には、
   begin〜end で複合文にする。その場合は
     if 条件式 then begin
       文 ;
       文 ;
       ・・・
     end
   のようになる。
 
 if (RadioButton1.Checked = True) then c := a + b ;
の場合、条件式は「(RadioButton1.Checked = True)」、文は「c := a + b」です。この条件式が真、つまり、条件式が正しい場合、文が実行されます。この場合、RadioButton1.Checked 自体が真(True)又は偽(False)の値を持つので、
 if (RadioButton1.Checked) then c := a + b ;
と省略する事が出来ます。括弧は、見易くするために付けているだけで別に無くても構いません。但し、if、then の文字をくっつけないように半角空白で区切って下さい。全角空白は駄目です。
 
条件式では、変数の値を見て比較させる事も出来ます。例えば、変数 a の値が 1 の場合(変数 a の値が 1 に等しい場合)という条件式は「a = 1」と書きます。また、変数 b の値が 100よりも大きい場合は「b > 100」となります。
関係演算子
=
<>
<
>
<=
>=
等しい
等しくない
より小さい
より大きい
以下
以上
a = 10
a <> 10
a < 20
a > 100
a <= -5
a >= 30

条件式で、変数 a の値が10に等しく、変数 b の値が20よりも小さい場合、のような記述をしたい場合には、論理演算子を使って「(a = 10)and(b < 20)」のように記述する事が出来ます。
論理演算子
not
and
or
xor
論理否定 〜でない
論理積  かつ
論理和  または
排他的論理和
not(a = 10)
(a = 10)and(b < 20)
(a > 10)or(b >= 20)
(a > 10)xor(b > 20)

notは、上記の場合は a = 10 ではない場合、という意味になります。xorは、双方とも真の場合は偽、どちらか一方が真の場合に真、となります。
 
メニュー「ファイル」→「すべて保存」をクリックして下さい。
 
メニュー「プロジェクト」→「SimpleCalc を再構築」をクリックして下さい。
 
すると、コンパイル(再構築)の結果、警告があります、と注意されます。

取りあえずそのまま実行します。メニュー「実行」→「実行」をクリックして下さい。
 
値を入れて、足し算、引き算、掛け算、割り算、の選択を行って、[=]ボタンをクリックして結果の値を確認します。
 
整数値での計算となりますので、小数点以下は扱えません。割り算の結果も整数値に切り捨てられます。
 
確認をしたら右上の[×]ボタンをクリックして終了します。

 

 
 

コードエディタ画面の下の方を見ると、コンパイル時の警告の内容が表示されます。
「Unit1.pas」(このプログラムファイル)の 57行目、変数 'c'は初期化されない場合があります、と表示されています。この文をダブルクリックすると、その箇所にジャンプされます。
 
プログラムを見て下さい。変数 c の値は、4つの if 文の中で指定されるようになっていますが、もしこのうちのどれにも該当しない場合には、変数 c の値が指定されない事になってしまいます。プログラマ本人は、絶対にこのうちのどれかに該当する、と思っていても、Delphiは分かってくれません。Delphi の場合、変数に値を入れていない場合は、不定な値として扱われトラブルの元になります。自動的に「0」が入る、という事はありません。初期値は自分で明示的にプログラミングせねばなりません。場合によっては不定値が表示させられてしまう、という事で、警告が出ています。
 
プログラムを以下のように書き換えてみます。
// 計算
procedure TForm1.Button1Click(Sender: TObject);
var
 a , b , c : integer ;
begin
 a := StrToInt(Edit1.Text) ; // a ← Edit1
 b := StrToInt(Edit2.Text) ; // b ← Edit2
 
 // 計算
 c := 0 ; // 初期値
 if (RadioButton1.Checked) then
  c := a + b ;
 if (RadioButton2.Checked) then
  c := a - b ;
 if (RadioButton3.Checked) then
  c := a * b ;
 if (RadioButton4.Checked) then
  c := a div b ;
 
 Edit3.Text := IntToStr(c) ; // Edit3 ← c
end;

メニュー「ファイル」→「すべて保存」をクリックし、メニュー「プロジェクト」→「SimpleCalc を再構築」をクリックして下さい。コンパイル(再構築)が正常終了したら、メニュー「実行」→「実行」をクリックして下さい。
 
コンパイルを正常終了させるために初期値を指定するようにしましたが、それをしたくない場合には、if 文で条件式が真にならなかった場合(条件式に該当しなかった場合、その他の場合)という処理をすることで警告を出さないようにする事が出来ます。
判断・選択 if 文 
書式: if 条件式 then
     文1
    else
     文2
 
説明:もしも条件式が真ならば、文1を実行し、
   もしも条件式が偽ならば、文2を実行する。
   文は1文だけなので、2文以上にする時には
   begin〜end で複合文にする。その場合は
     if 条件式 then begin
       文 ;
       文 ;
       ・・・
     end
     else begin
       文 ;
       文 ;
       ・・・
     end
   のようになる。

プログラムを以下のように書き換えてみます。文は1文ずつですが少しややこしいので begin〜endで複合文にしています。
// 計算
procedure TForm1.Button1Click(Sender: TObject);
var
 a , b , c : integer ;
begin
 a := StrToInt(Edit1.Text) ; // a ← Edit1
 b := StrToInt(Edit2.Text) ; // b ← Edit2
 
 // 計算
 if (RadioButton1.Checked) then begin
  c := a + b ;
 end
 else begin
  if (RadioButton2.Checked) then begin
   c := a - b ;
  end
  else begin
   if (RadioButton3.Checked) then begin
    c := a * b ;
   end
   else begin
    c := a div b ;
   end ;
  end ;
 end ;
 
 Edit3.Text := IntToStr(c) ; // Edit3 ← c
end;
RadioButton1か?
→Yes→「c := a + b」
→No → RadioButton2か?
    →Yes→「c := a - b」
    →No → RadioButton3か?
        →Yes→「c := a * b」
        →No →「c := a div b」
という風になります。
RadioButton1でもなく RadioButton2でもなく RadioButton3でもない場合は、RadioButton4になると分かっていますので、RadioButton4のチェックは省略出来ます。
 
 
整数の割り算 div では、商が得られますが、割り切れなかった分、つまり「余り(剰余)」も表示させたくなります。余りの計算は、演算子 mod で得られます。割り算の場合のみ、2つの計算「c := a div b;」「d := a mod b;」を行います。しかし最後の Edit3.Text には 変数 c の値しか入れていませんので、これに 変数 d の値も加えたい。つまり
「Edit3.Text := IntToStr(c) + ' ... ' + IntToStr(d);」
のようにしたいのですが、他の計算の場合には逆に余計となります。各if文内に「Edit3.Text := IntToStr(c);」を追加することも可能ですが、同じような文が4つもあると美しくないかもしれません。
「IntToStr(c)」の結果は文字列です。
ですので文字列変数を使うようにしてみましょう。
 
// 計算
procedure TForm1.Button1Click(Sender: TObject);
var
 a , b , c , d : integer ;
 s : string ;
begin
 a := StrToInt(Edit1.Text) ; // a ← Edit1
 b := StrToInt(Edit2.Text) ; // b ← Edit2
 
 // 計算
 if (RadioButton1.Checked) then begin
  c := a + b ;
  s := IntToStr(c) ;
 end
 else begin
  if (RadioButton2.Checked) then begin
   c := a - b ;
   s := IntToStr(c) ;
  end
  else begin
   if (RadioButton3.Checked) then begin
    c := a * b ;
    s := IntToStr(c) ;
   end
   else begin
    c := a div b ;
    d := a mod b ;
    s := IntToStr(c) + ' ... ' + IntToStr(d) ;
   end ;
  end ;
 end ;
 
 Edit3.Text := s ; // Edit3 ← c
end;
余り(剰余)の計算結果を入れるための変数 d を追加し、結果表示内容を入れるための文字列変数 s の宣言を追加しています。文字列変数の宣言では「string」を使います。
 
メニュー「ファイル」→「すべて保存」をクリックして下さい。
メニュー「プロジェクト」→「SimpleCalc を再構築」をクリックして下さい。
メニュー「実行」→「実行」をクリックして下さい。
「10」÷「3」で[=]ボタンをクリックすると、「3 ... 1」と表示されます。

しかし、「10」÷「0」で[=]ボタンをクリックすると・・・

プログラム開発環境での例外(エラー)発生画面が表示されます。「EDivByZero」「ゼロによる除算」と表示されています。
0(ゼロ)による割り算は出来ないので例外が発生してしまう訳です。
[OK]をクリックして下さい。

例外(エラー)が出るとそこでプログラムは一時停止しますので、続行させるためメニュー「実行」→「実行」をクリックして下さい。
プログラム実行が続行され、今度は、作成中のプログラム自身の例外(エラー)発生画面が表示されます。
 
計算式では、0による割り算を行うと例外が発生してしまいます。演算子 div、mod、/ を使う場合、2つ目の値がもしゼロの場合には演算させないようにして下さい。「もし〜ならば」という事をしたい場合は、既に説明しました if 文を使います。
if (b = 0) then
 エラー処理文
else
 計算式
しかしプログラムスタイルとして、
if 〜 then
 正しい時の処理
else
 正しくない時の処理
という書き方をするほうがより好まれているようです。この場合には
if (b <> 0) then
 計算式
else
 エラー処理文
又は
if not(b = 0) then
 計算式
else
 エラー処理文
のようになります。プログラムを以下のように書き換えてみます。
// 計算
procedure TForm1.Button1Click(Sender: TObject);
var
 a , b , c , d : integer ;
 s : string ;
begin
 a := StrToInt(Edit1.Text) ; // a ← Edit1
 b := StrToInt(Edit2.Text) ; // b ← Edit2
 
 // 計算
 if (RadioButton1.Checked) then begin
  c := a + b ;
  s := IntToStr(c) ;
 end
 else begin
  if (RadioButton2.Checked) then begin
   c := a - b ;
   s := IntToStr(c) ;
  end
  else begin
   if (RadioButton3.Checked) then begin
    c := a * b ;
    s := IntToStr(c) ;
   end
   else begin
    if not(b = 0) then begin
     c := a div b ;
     d := a mod b ;
     s := IntToStr(c) + ' ... ' + IntToStr(d) ;
    end
    else begin
     s := 'ERROR!' ;
    end;
   end ;
  end ;
 end ;
 
 Edit3.Text := s ; // Edit3 ← c
end;
メニュー「ファイル」→「すべて保存」をクリックしてプログラムの保存を行い、メニュー「プロジェクト」→「SimpleCalc を再構築」をクリックしてプログラムのコンパイル(再構築)を行い、正常終了したら、メニュー「実行」→「実行」をクリックして下さい。
 
「10」÷「0」で[=]ボタンをクリックすると、先ほどのような例外(エラー)は発生せず、画面も表示されず、プログラムも途中で止まること無く、思惑通り結果表示欄に「ERROR!」と表示されるだけとなります。
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
 01 02 03 04
 05 06 07 08
 09 10 11 12
 13 14 15 16
 17 18 19 20
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.