4-1 分岐処理 (1) ―基本的な if 文―

以前、【基礎課題 1-10】で、下のようなフォームのプログラムを作りました。

このプログラムでは、

  1. チェックされた項目の数を数える。
  2. その数に応じて、診断結果を出す。

という2つの部分が必要です。

今回、このプログラムに、2. の機能をつけ加えてみましょう。

1. については、今回は考えません。項目の数は自分で数えることにします。

【基礎課題 4-1】

このプログラムを新しい名前で保存してから、下のようなフォームのプログラムに作り替えて下さい。

新しいストレス度診断テスト

主なコンポーネントの Name プロパティは、次のようにして下さい。

コンポーネント Name
ボタン「診断」 ButtonShindan
スピンエディット「チェック項目数」 SpinEdit
チェックボックス「6-10」 CheckBoxHigh
チェックボックス「0-5」 CheckBoxLow
エディット EditMessage

「チェック項目数」を入力してから「診断」ボタンを押したとき、

ようなプログラムを作りましょう。

ある条件が成り立っているか成り立っていないかによって行う内容が変わる場合には、「if 文」を用いて表します。

「診断」ボタンをクリックしたときのイベントハンドラを、次のように書いて下さい。

注意 面倒でも、半角スペース2字分ずつの「字下げ」を必ず行って下さい。構造が見やすくなります。

この命令は、下のような構造になっています。

「診断」ボタンを押したときの処理

if 条件:「チェック項目数」が6以上
  then
    begin
      条件が成り立っているときの処理1;
      条件が成り立っているときの処理2;
      条件が成り立っているときの処理3;
        ・
        ・
        ・
    end
  else
    begin
      条件が成り立っていないときの処理1;
      条件が成り立っていないときの処理2;
      条件が成り立っていないときの処理3;
        ・
        ・
        ・
    end
; (← if 文の終わりを表す)

if 文は、条件が成り立っているか成り立っていないかによって、プログラムの流れを分岐させます。

条件は、

のどちらかしかありません。したがって、プログラムは、

どちらかひとつを必ず実行し、かつ、いずれかひとつしか実行しません。

※ Delphi での等号・不等号の書き方はこの表の通りです。
数学表記 意味 Delphi での表記
A>B A は B より大きい A > B
A≧B A は B 以上 A >= B
A=B A は B に等しい A = B
A≦B A は B 以下 A <= B
A<B A は B より小さい A < B
A≠B A は B に等しくない A <> B

【基礎課題 4-2】

次のようなフォームを持つプログラムを作って下さい。

主なコンポーネントの Name プロパティは、次のようにして下さい。

コンポーネント名 Name
スピンエディット SpinEditNenrei
ボタン「入力完了」 ButtonKanryo
上のエディット Edit1
下のエディット Edit2
年齢を入力してから「入力完了」ボタンを押すと、 2つのメッセージが表示される。
年齢を入力した画面 選挙権の有無を表示した画面

年齢とメッセージの対応は、次の表にしたがってください。

年齢 メッセージ
20歳以上 あなたは成年ですね。あなたには選挙権があります。
19歳以下 あなたは未成年ですね。あなたには選挙権がありません。

下の下線部を埋めて、プログラムを完成させて下さい。

procedure TForm1.ButtonKanryoClick(Sender: TObject);
begin
  if SpinEditNenrei.Value             
    then
      begin
                                                
                                                
      end
    else
      begin
                                                
                                                
      end
  ;

【練習問題】

新しいコンポーネント「ラジオボタン」の使い方を覚えましょう。

コンポーネントパレットからラジオボタンのアイコンを選んで、フォーム上に3つ貼って下さい。

このままの状態でプログラムを実行して、ラジオボタンをクリックして下さい。

ラジオボタンはどういうはたらきをするコンポーネントか、下に書いて下さい。

【練習問題】

オブジェクトインスペクタから3つあるラジオボタンのうちのいずれかを選んで、その Checked プロパティの値を TrueFalse に変えてみましょう。何が起こりますか?

【基礎課題 4-3】

次のようなフォームを持つプログラムを作って下さい。

コラム

左の「ようこそいらっしゃいました。」と「性別をチェックして下さい。」は、 2つのラベルを用いて表現しています。

実は、一つのラベルに複数行のメッセージを表示させることもできます。それには、ラベルコンポーネントの「WordWrap」プロパティを「True」にすればよいのです。こうすると、指定したラベルコンポーネントの幅にメッセージが収まりきれない場合、自動的に折り返されます。つまり、ラベル幅に収まるように複数行表示してくれます。

しかし、最初から2行に分けてメッセージを表示させたい場合は、2つのラベルを用いた方が便利です。

プログラムの動作内容は以下の通りです。

実行してから性別をチェックしてボタンを押すと、 下のように2つのメッセージが表示される。
「女性」をチェックした画面 「右側」と表示された画面

チェック項目とメッセージの対応は、次の表にしたがって下さい。

チェック項目 メッセージ
女性 あなたは女性ですね。右側の階段をお上り下さい。
男性 あなたは男性ですね。左側の階段をお上り下さい。

【基礎課題 4-4】

次のようなフォームを持つプログラムを作って下さい。

コンポーネント名 Name
ラジオボタン「女性」 RdioButtonf
ラジオボタン「男性」 RdioButtonm
ボタン「OK」 ButtonOK
チェックボックス「20歳以上」 CheckBoxSeinen

主なコンポーネントの Name プロパティは、上のようにして下さい。

注意 「SGUクラブ」は架空の団体ですが、もしかすると実在するかもしれません。

プログラムの動作内容は次の通りです。

性別と年齢をチェックしてから「OK」ボタンを押すと、 2つのメッセージが表示される。

性別・年齢の条件とメッセージの対応は、次の表にしたがってください。

性別・年齢 メッセージ
女性で、かつ、20歳以上 あなたは入会資格があります。どうぞお入り下さい。
それ以外 あなたは入会資格がありません。残念ですがお帰り下さい。

注意 「女性で、かつ、20歳以上」つまり、

RadioButtonf がチェックされていて、かつCheckBoxSeinen がチェックされている」ことを、

(RadioButtonf.Checked = True)
and
(CheckBoxSeinen.Checked = True)

のように and を用いて表します。

ここに、and の前後の条件文には、( )をつけることを忘れないで下さい (これは Delphi が採用している PASCAL 言語の文法規則なのです)。

下の枠内を埋めて、プログラムを完成させて下さい。

procedure TForm1.ButtonOKClick(Sender: TObject);
begin
  if (RadioButtonf.Checked = True)
      and
      (CheckBoxSeinen.Checked = True)
    then
      begin
                                                
                                                
      end
    else
      begin
                                                
                                                
      end
  ;

注意 「かつ」ではなく「または」を表したいときは、or を使います。

「女性、または、20歳以上」のとき

(RadioButtonf.Checked = True)
or
(CheckBoxSeinen.Checked = True)

【基礎課題 4-5】

次のようなフォームを持つプログラムを作って下さい。

配布場所指定プログラムのコンポーネント配置

主なコンポーネントの Name プロパティは、次のようにして下さい。

コンポーネント名 Name
スピンエディット SpinEditNumber

スピンエディットには0〜9までの数しか入りません。それ以外の数を入力できないように、MinValue プロパティと MaxValue プロパティの値を変更しておいて下さい。

ここで、プログラムを実行し、数を入力してから OK ボタンを押したとき、

ようなプログラムを作って下さい。

注意 スピンエディットに入力された値が4以上7以下であることを表すのに、

4 <= SpinEditNumber.Value <= 7

と書きたくなると思います。しかし、Delphi は、2つの不等号が同時に出てくる文を理解することができません。ですから、

(4 <= SpinEditNumber.Value)
and
(SpinEditNumber.Value <= 7)

のように、条件を()でふたつの部分に分けてから and でつなげて書く必要があります。

【練習問題】

次のようなフォームを持つプログラムを作って下さい。

コンポーネントの Name プロパティは、次のようにして下さい。

コンポーネント名 Name
スピンエディット SpinEditNumber
ボタン「判定」 ButtonHantei
エディット EditMessage
0以上の数を入力してボタンを押すと、「入力した数は0以上です。」と表示し、 0未満の数を入力してボタンを押すと、 「入力した数は0未満です。」と表示する。
0 以上の数を入力した画面 0 未満の数を入力した画面

「判定」ボタンを押したときの処理は、以下のように書くことができます。

しかし、thenelse のあとに、それぞれ1つの処理しかしないときは、 beginend を省略して、次のように書くこともできます。

解説

if 文は

ifthen
    処理1
  else
    処理2
;

で一つの文なのです。そこで、例えば処理1の末尾に「」をつけると、「そこで文が終わってしまい、そのあとに「else」から新たに文が始まる」、と認識されてしまいます。そしてそのような文はないのでエラーになってしまいます。

注意 市販のほとんどのテキストでは,処理文が1つの時には beginend のない形を掲載しています。しかし、実際のプログラミングの場面では、最初は実行文が1つでも、後に文を加えて複数の文になることがよくあります。その様な場合には再び beginend をつけ加えなければなりませんが、うっかり忘れてしまいやすいものです。そして、もし忘れるとエラーが発生したり思った通りの処理をしてくれなくなったりします。 そこで、処理する文が1つのときでも (beginend がついていてもエラーになるわけではないので)、beginend を消さずに残しておくようにすることを勧めます。