無料の開発環境 Delphi Starter Edition で Object Pascal言語を優しく学ぶ 第3回 「条件とループ」

#Delphi Starter Edition チュートリアルシリーズ シーズン2 第3回 「条件とループ」
![image](https://qiita-image-store.s3.amazonaws.com/0/145847/9a3a70a8-52ee-8295-5959-a680c7ff0b1a.png)

2017年1月23日より [「Delphi / C++Builder Starter チュートリアルシリーズ」 シーズン2、](http://forms.embarcadero.com/starter-tutorial-webinar)全9回、3月27日まで、毎週月曜日、Delphiパートが 17時00分~17時20分、 リアルタイム放送スペシャルコンテンツが5分～10分、C++Builderパートが 17時30分~17時50分の時間割でお送りしています。

無料でダウンロード & 利用できる開発環境の[Delphi / C++Builder Starter エディション](https://community.embarcadero.com/my-blog-posts?view=entry&id=8915)を使用して、プログラミング言語のDelphi (Object Pascal ), C++の基礎を学ぶオンラインセッションです。

##使用したスライドなどの情報を掲載します。
###Webセミナースライド
当セミナーのスライドは下記アドレスよりご参照いただけます。
http://www.slideshare.net/ssuser194f49/delphi-cbuilder-starter-2-delphi-2-71796636

###アジェンダ
* ねらい
  * 条件によって行う処理を変える方法を知る
  * 一定条件のもと繰り返し処理を行う方法を知る
* 実施内容
  * 一般的な文の基本
  * 条件文の使い方を学ぶ
  * ループ文の使い方を学ぶ
  * ループ文の制御を学ぶ

###開発環境インストール
[Delphi / C++Builder Starter チュートリアルシリーズ](https://community.embarcadero.com/manage-blog-posts?view=entry&id=9038) シーズン1 第1回 ‟無料で始めよう アプリ作成„をご参考になり、開発環境をインストールしてください。


##**以下、Delphi Webセミナーの本筋**
###一般的な文 (Statements)
* 左から右に読んで、上から下に進む
* 複数行をまとめる場合、begin で始まり end; で終わる
* 文はセミコロン[  ;  ] により次の文へと分けられる
* 条件文やループ文により、分岐、繰り返し処理を行う

```delphi
// 一般的な object Pascal の文 (Statements)の例
procedure TForm1.Button1Click(Sender: TObject);
var
  iA, iB: Integer;
begin
  iA := 1;
  iB := iA * 2;
end;
```

###if 条件文
* **条件・判定により、実行する/しない処理を変えることができる**
* 値が `True`/真であれば`then`以降を処理 
* 値が `False`/偽であれば`then`以降は処理しない。 `else`があれば`else`以降を処理
* `else` を使う場合には`else`の前にセミコロンは付けない（文の終わりとしない）

```delphi
//if構文
if 条件判定式 then
    値がTrue/真の時に実行される処理
  else
    値がFalse/偽の時に実行される処理;
```
```delphi
//if 文の例
procedure TForm1.CheckBox1Change(Sender: TObject);
begin
  if CheckBox1.isChecked then //チェックボックスの"isChecked"プロパティを判定
    ShowMessage('チェックボックスON') // IsChecked プロパティの値が True. セミコロンなし
  else
    ShowMessage('チェックボックスOFF'); // IsChecked プロパティの値が False
end;
```
###if 条件の比較、複合条件 、複合文
* 条件の判定に比較演算子を使用 : '= , <> , < , <=, > , >= , !'
* 複数の条件を合わせて判定する場合、論理演算子を使用:  `and , or , xor`
* 否定（反転）の場合も論理演算子： `not`     例 :  `if not(CheckBox1.isChecked) then // Trueではなければ`
* 複数の文をまとめて実行するには `begin` と `end` でくくる
* 条件判定後`False`/偽ののち、さらに条件判定を行うときは `else if` がある

|意味|比較演算子|
|---|---|
|等しい|=|
|等しくない|<>|
|左辺が小さい|<|
|以下|<_=|
|左辺がより大きい|>|
|以上|>=|

```delphi
//if 複合文、比較演算子使用の例
begin
  if RadioButton1.isChecked and CheckBox1.isChecked then // and で複数条件確認
  begin // begin - endで複数文をまとめる
    i := i + 1; // begin – end でまとめた文のそれぞれは ; (セミコロン) を付けて一文を区切る
    ShowMessage('チェックボックスON');
  end  //else前に、複数分をまとめるために使ったbegin-endの endの後ろには、セミコロンを付けない
  else if i <= 10 then // else ifでさらに条件判定
    ShowMessage('チェックボックスOFFでiが10以下')
  else
    ShowMessage('チェックボックスOFFでiが10より大きい');
end;
```

###case ~ of …文
* **より多くの選択肢があるような場合、変数の値によって処理内容を選択**
 * 変数のデータ型は順序型であること
* 整数値 `Integer`, 文字 `Char`, 論理型 `Boolean`, 
* 列挙型や部分範囲型 `type typeName=(red, blue,…)`
* 処理条件に当てはまらない場合の処理として `else`を使用可能 (省略も可能）
* `case` 文の終わりは `end;` で閉じる

```delphi
//case文の構文
 case 評価される変数 of
   値1: 評価される変数が値1と等しいときに実行される処理; //セミコロン必要
   値2: 評価される変数が値2と等しいときに実行される処理; //セミコロン必要
   値3: …;
 else //elseとその処理は省略可能
   変数がいずれの値にも合致しないときに実行される処理;
 end;
```

###case ~ of … 列挙型の使用例
評価される変数として列挙型の変数も使用可能

```delphi

//case~of 列挙型変数の使用例
type
  TColor = (Red, Green, Blue); //列挙型の定義
var
  myColor: TColor = Red;  //列挙型の変数宣言
procedure TForm1.Button1Click(Sender: TObject);
var
  strColor: string;
begin
  case myColor of     //列挙型変数の値による case of
    Red: strColor := 'Red'; //変数myColorの値がRedなら実行
    Green: strColor := 'Green'; //変数myColorの値がGreenなら実行
    Blue: strColor := 'Blue'; //変数myColorの値がBlueなら実行
  end;
  if strColor <> '' then
    ShowMessage(strColor);
end;
```

###case ~ of … 値の使用例と複合文
* 値は定数のほか、部分範囲も指定可能
* 複数の文をまとめて実行するには `begin` と `end;` でくくる

```delphi
//値に部分範囲を使用した例、およびbigin end; で複数処理をまとめた例
 case aChar of     //Char型の変数によるCase文
    '+': str := 'プラス記号';   //定数一文字の値
    '-': str := 'マイナス記号'; //定数一文字の値
    '0'..'9': str := '数字'; //値指定として部分範囲。数値の0～9
    'A'..'X': str := '英語大文字'; //値指定として部分範囲。数値の0～9
    'a'..'x':
      begin //複数の処理を行う場合begin endでくくる
        str := '英語小文字';
        i := i+1;
      end; //case内で複数分をまとめる場合にbegin-end;を使用。endの後ろには;(セミコロン)
  else //いずれの値にも当てはまらない場合の処理
    str := 'それ以外の文字';
  end;
```

###for ループ 文
* **カウンタ（変数）の値が任意の初期値から一定の値になるまでループ**
  * カウンタは1づつ増加（もしくは減少）
  * カウンタは整数型`Integer`だけではなく、文字型`Char`や列挙型も使用可能
  * `for ~ to ~ do`  //カウンタを1ずつ増加
  * `for ~ downto ~ do` //downtoの場合、カウンタは1ずつ減少

```delphi
//forの構文
 for カウンタ(変数) := 初期値 to この値に達した後ループ終了 do
  ループで実行される処理;
```

```delphi:
//for文の例
var
  I, iTotal : Integer; 
begin
  iTotal := 0;
  for I := 1 to 10 do
  begin 
     iTotal := iTotal + I;
  end;
```

###for ループ 文 (使用例)
```delphi
//Char型の使用例
var
  aChar : Char; 
begin
  for aChar := 'a' to 'z' do
    ShowMessage(aChar);
```

```delphi
//列挙型の使用例
type
  TColor = (Red, Blue, Green, Yellow, Black);
 
var
  aColor : TColor; 
begin
  for aColor := Low(TColor) to High(TColor) do
    begin 
     //省略
    end;
```
###for ~ in ~ do ループ 文
* **文字列、配列、リスト、レコードなどに代入されている内容分ループ**
    * 順に要素にアクセスしていき、データの最後で終了
        * 配列、リスト、レコードは後日のセミナーで紹介

```delphi
//for in do 構文
 for 現在の要素（変数） in 集合や文字列の変数 do
  ループで実行される処理;
```

```delphi
//for in do 使用例
var
  Str : String;
  Ch : Char; 
begin
  Str := 'Hello Delphi World';
  for Ch in Str do 
    ShowMessage(Ch); 
```
参考DocWiki: [for 文を使用するコンテナの繰り返し](https://goo.gl/bC95M5)

###while と repeat ループ
* **設定した条件によりループを繰り返す**
  * `while ~ do` は ループ冒頭で判定。判定が`True`の間ループ
  * `repeat ~ until` はループ終端で判定。判定が`True`になるまでループ

```delphi
//while構文
 while 条件式 do //条件が満たされている間、ループ（do以下のブロックを実行）
 begin
   I := I + 1;  //ループしたい処理
 end;
```
```delphi
//repeat構文
 repeat
    I := I + 1;  //ループしたい処理
 until 条件式; //条件が満たされるまでの間、ループ（repeatに戻る)
```

###while と repeat ループ 使用例
* 以下の例では、どちらも表示される`ShowMessage`は 101 
* `repeat`文の場合、少なくとも1回は処理が実行される

```delphi
//while使用例
 I := 0;
 while I <= 100 do //条件が満たされている間ループ（do以下のブロックを実行）
 begin
   I := I + 1;
 end;
 ShowMessage(I.ToString);
```

```delphi
//repeat 使用例
 I := 0;
 repeat
    I := I + 1;
 until I > 100; //条件が満たされるまでの間ループ（repeatに戻る)
 ShowMessage(I.ToString);
```

###Break, Continue,によるループ制御
* **Break;** 
  * ループを中断し、ループを抜ける（ループの直後の文に移行）
* **Continue;** 
  * ループの条件判定（forカウンタ, while条件判定, until条件判定）までジャンプ
  * ループを抜けるかどうかは、カウンタ達成か、条件判定に依る

```delphi
//break使用例
  for aChar := Low(Char) to High(Char) do
  begin
    if aChar = 'A' then
    begin
      ShowMessage('見つけた! ');
      Break; //ループから抜ける
    end;
  end;
  ShowMessage(aChar);
```

##おわりに
第3回、2月6日分の Delphiパート 「条件とループ」は以上です。

[＜＜シーズン2 第2回の記事はこちら](http://qiita.com/kazaiso/items/94046c1e780c0a44b9dd)

[シーズン2 第4回の記事はこちら＞＞](http://qiita.com/kazaiso/items/13cad1ccee2f7835252f)