PG0でプログラミング入門

# はじめに
[PG0](https://www.nakka.com/soft/pg0/)は、プログラミング学習を目的としたプログラミング言語です。
PG0の導入は『[初心者用プログラミング言語「PG0」のススメ](https://qiita.com/nakka_/items/adfe04d701640a72015d#%E5%B0%8E%E5%85%A5)』を参照してください。

プログラミングがまったく初めての人向けの入門記事になります。
この記事内のプログラムを実際に動かす環境としてPG0を使っています。

# プログラムの考え方
プログラムとはやりたい事を実現する手段です。（例えばゲームを作りたいとか）
プログラムの考え方は非常に単純で、**順次、分岐、反復(繰り返し)** のたった3つの動きしかありません。
![sbi_2.png](https://qiita-image-store.s3.amazonaws.com/0/199093/7826c7d1-9e98-f7f6-36a6-875cbe206b1a.png)
この順次、分岐、反復をパズルのように組み合わせて答えを導き出すのがプログラミングです。
本記事では順次、分岐、反復の考え方について解説しています。

# 順次の考え方
「3 * 3」を計算するプログラムについて考えてみます。（「*」は掛け算の記号です）

```
3 * 3 → 9
```

例えば掛け算を使わないで「3 * 3」を計算するという制限があれば以下のようになります。

```
3 + 3 + 3 → 9
```

この「3を3回足す」をプログラム的に考えるとしたら以下になります。

```
0 + 3 → 3
(前の計算結果である3) + 3 → 6
(前の計算結果である6) + 3 → 9
```

上記のように計算時に前の計算結果を使うためには「**変数**」という数字の入れ物を使います。変数は数字を入れておく箱のようなイメージです。
![pg_var_image.png](https://qiita-image-store.s3.amazonaws.com/0/199093/7a295f84-6d6d-ddb1-d0e4-5b6358395975.png)
変数を使って計算の流れを説明すると以下になります。

```
変数を用意し、最初は0を入れる
「変数 + 3」の結果を再度変数に入れる → 変数は3になる
「変数 + 3」の結果を再度変数に入れる → 変数は6になる
「変数 + 3」の結果を再度変数に入れる → 変数は9になる
```

上記の説明をプログラムとして書くと以下になります。

```
変数は、0
変数は、変数 + 3 → 変数は3になる
変数は、変数 + 3 → 変数は6になる
変数は、変数 + 3 → 変数は9になる
```

上記の「は、」の部分はプログラムでは「=」で表します。
プログラムでの「=」は算数の意味とは異なり、**右辺の結果を左辺に代入する**という意味になります。

```
変数 = 0
変数 = 変数 + 3 → 変数は3になる
変数 = 変数 + 3 → 変数は6になる
変数 = 変数 + 3 → 変数は9になる
```
上記の結果、変数には「9」が入ります。
このような文(計算)の流れを**順次**といいます。

実行可能なプログラムにするため、変数の名前を結果が入るという意味でresult「リザルト」とします。
（「//」以降はコメントで実行されない文になります）

```php:PG0
result = 0
result = result + 3  // resultは3になる
result = result + 3  // resultは6になる
result = result + 3  // resultは9になる
```
上記でresultには「9」が入ります。
このプログラムをPG0に入力して実行した結果が以下になります。
右側の変数が見られる場所ではresultに「9」が入っているのがわかります。
![pg0_sequence_1.png](https://qiita-image-store.s3.amazonaws.com/0/199093/3f17ab88-2b4c-07f4-6d89-75b57274b66c.png)

もちろんプログラムで以下のように書くことも可能で同じ結果になります。

```php:PG0
result = 3 * 3
```
![pg0_sequence_2.png](https://qiita-image-store.s3.amazonaws.com/0/199093/9e7eea82-88dd-2c3b-faba-449c316389c3.png)

```php:PG0
result = 3 + 3 + 3
```
![pg0_sequence_3.png](https://qiita-image-store.s3.amazonaws.com/0/199093/2541ad7a-9f7d-2524-2eb8-19430e098a08.png)


# 反復の考え方
順次で作ったプログラムは「3 * 3」でしたが、これが「10 * 10」だとしたら以下になります。

```php:PG0
result = 0
result = result + 10  // resultは10になる
result = result + 10  // resultは20になる
result = result + 10  // resultは30になる
result = result + 10  // resultは40になる
result = result + 10  // resultは50になる
result = result + 10  // resultは60になる
result = result + 10  // resultは70になる
result = result + 10  // resultは80になる
result = result + 10  // resultは90になる
result = result + 10  // resultは100になる
```
![pg0_while_0.png](https://qiita-image-store.s3.amazonaws.com/0/199093/b2d66c28-bf4d-fe6d-4310-ae42a8468cfd.png)

同じ文が沢山並んでいるため、これは **反復(繰り返し)** で作った方がスッキリします。
以下のように同じだった文を繰り返すとresultに計算結果として100が入ります。

```
result = 0
繰り返しを10回行うのはここから
	result = result + 10
ここまで
```

プログラムでは繰り返しの文は **while**「ホワイル」になります。
ここからここまでというのは「{～}」で括ります。

```
result = 0
while (10回繰り返す) {
	result = result + 10
}
```

あとは10回繰り返す方法ですが、10回繰り返すには繰り返しを行う専用の変数を用意します。
その変数の中は1から10まで増えていき、変数の中が10を超えたときに繰り返しが終わるようにします。
ただし、whileの式には繰り返しを終わる条件ではなく繰り返しを続ける条件を書きます。

```
result = 0
変数 = 1
while (変数が10より小さいか一致している間繰り返す) {
	result = result + 10
	変数に1を加える
}
```

実行可能なプログラムにするため、変数を i とし、whileの式は「i <= 10」とします。

```php:PG0
result = 0
i = 1
while (i <= 10) {
	result = result + 10
	i = i + 1
}
```

これで数字がどんなに増えても自動で計算してくれるプログラムになります。
このプログラムをPG0に入力して実行した結果が以下になります。
右側の変数が見られる場所ではresultに「100」が入っているのがわかります。
![pg0_while_1.png](https://qiita-image-store.s3.amazonaws.com/0/199093/658675e1-9a32-7e37-454d-42966e1fd38b.png)

数字を変えて「200 * 100」を実行した結果が以下になります。
右側の変数が見られる場所ではresultに「20000」が入っているのがわかります。
![pg0_while_2.png](https://qiita-image-store.s3.amazonaws.com/0/199093/27cba334-9d5d-f2c6-ef4e-53c8d659746d.png)

# 分岐の考え方
分岐は条件に一致する場合に動くようにプログラムを書きます。
以下は、ある数字が5より大きいか小さいかを判定するプログラムです。

```
ある数字が5より大きい場合は1とする。
それ以外（ある数字が5より小さいか等しい場合）は-1とする。
```

上記をプログラム的に書くと以下になります。
ある数字を変数aとし、結果を入れるのは変数bとします。

```
変数aに10を入れておく（この10は変更して動きを確認する）

結果を入れる変数bを用意しておく
もし変数aの中の数字が5より大きい時はここから
	変数bに1を入れる
ここまでを動かす、それ以外はここから
	変数bに-1を入れる
ここまでを動かす
```

プログラムでは分岐の文は **if**「イフ」になります。それ以外は **else**「エルス」になります。
ここからここまでというのは「{～}」で括ります。

```
a = 10  // 10は変更して動きを確認する

b = 0
if (aの中の数字が5より大きい) {
	b = 1
} else {
	b = -1
}
```

実行可能なプログラムにするため、ifの式は「a > 5」とします。

```php:PG0
a = 10  // 10は変更して動きを確認する

b = 0
if (a > 5) {
	b = 1
} else {
	b = -1
}
```

これで変数bにifで分岐して処理した結果が入ります。
このプログラムをPG0に入力して実行した結果が以下になります。
右側の変数が見られる場所では変数aが5より大きいため変数bに「1」が入っているのがわかります。
![pg0_if_1.png](https://qiita-image-store.s3.amazonaws.com/0/199093/068ad763-ec09-c47a-3da5-67998ae623c4.png)

変数aの中の数字を変えて実行した結果は以下になります。
右側の変数が見られる場所では変数aが5より小さいため変数bに「-1」が入っているのがわかります。
![pg0_if_2.png](https://qiita-image-store.s3.amazonaws.com/0/199093/ec2cdd92-b3e9-69ba-8143-16f91365949d.png)

# 組み合わせ(応用)
順次、分岐、反復を組み合わせてプログラムを作る考え方です。

## 配列について
その前に**配列**について解説します。
配列は変数を連続的に並べた入れ物です。
![pg_var_arr_image.png](https://qiita-image-store.s3.amazonaws.com/0/199093/3111cc0c-b0f1-41da-98da-f0c9e71d4650.png)
配列を使うには変数の名前の後に「[～]」を付けて中には数字を入れます。
「[～]」の中の数字は配列のインデックスです。インデックスは0から始まります。

```PHP:PG0
a[0] = 10  // aの0番目に10を入れる
a[1] = 20  // aの1番目に20を入れる
a[2] = 30  // aの2番目に30を入れる
```
![pg0_all_0.png](https://qiita-image-store.s3.amazonaws.com/0/199093/cc5f9e81-2f50-3889-d7c7-89571ec26132.png)

配列に最初からまとめて数字を入れるには「{数字1,数字2,数字3,...}」と書きます。

```PHP:PG0
a[] = {10,20,30} // a[0] = 10;a[1] = 20;a[2] = 30;と同じ意味
```

配列の中の数字を順番に取り出すには**反復**(while)を使います。
以下は配列の中の数を合計するプログラムです。

```PHP:PG0
a[] = {10,20,30}
cnt = 3  // 配列内の数字の個数

result = 0  // 合計を入れる変数
i = 0  // 配列のインデックス
while (i < cnt) { // 配列の個数分繰り返す
	result = result + a[i]  // resultにaのi番目(=a[i])の中の数字を足す
	i = i + 1  // 配列のインデックスを一つずらす
}
```
![pg0_all_1.png](https://qiita-image-store.s3.amazonaws.com/0/199093/6bbffe0b-2610-e8e2-e7de-7827133ffd6a.png)

## 組み合わせの考え方
順次、分岐、反復を組み合わせとして配列の中で一番大きな数字を取り出すプログラムを考えてみます。

```
配列 = {23,57,8}
反復で配列の個数分繰り返す {
	分岐で配列の中から一番大きい数字を探す
}
```

まずは配列の中の数字を順番に取り出すために**反復**(while)を使います。
配列の名前は data とします。

```
data[] = {23,57,8}
cnt = 3  // 配列dataの個数

i = 0
while (i < cnt) { // 配列dataの個数分繰り返す
	分岐で配列dataの中から一番大きい数字を探す
	i = i + 1
}
```

一番大きい数字を見つけたらmaxという変数に入れるようにします。

```
data[] = {23,57,8}
cnt = 3  // 配列dataの個数

max = 0
i = 0
while (i < cnt) {
	分岐でdata[i]が一番大きい数字ならmaxに入れる
	i = i + 1
}
```

data[i]が一番大きいかをチェックするのに**分岐**(if)を使います。
そして、より大きいdata[i]が来たら、その数字をmaxに入れるようにします。

```PHP:PG0
data[] = {23,57,8}
cnt = 3  // 配列dataの個数

max = 0
i = 0
while (i < cnt) {
	if (max < data[i]) {  // maxより大きい数字のdata[i]かチェックする
		max = data[i] // より大きい数字のdata[i]ならmaxに入れる
	}
	i = i + 1
}
```

これでmaxに一番大きい数字「57」が入ります。
このプログラムをPG0に入力して実行した結果が以下になります。
右側の変数が見られる場所ではmaxに「57」が入っているのがわかります。
![pg0_all_2.png](https://qiita-image-store.s3.amazonaws.com/0/199093/cfbb1629-a931-42a8-0712-06b750fd19fb.png)

# 演習問題
PG0用の演習問題です。

- [演習問題](https://nakka.com/soft/pg0/question.html)
- [演習問題(PDF)](https://nakka.com/soft/pg0/PG0_question.pdf)
- [演習問題(解答例あり)](https://nakka.com/soft/pg0/question.html?a=1)

多くの演習問題を解くことで、プログラミングに慣れるのが目的となります。
解答例があるので、実際に作ったプログラムと見比べてることができます。

# リンク
- PG0
  - [https://nakka.com/soft/pg0/](https://nakka.com/soft/pg0/)
- PG0 (Web版)
  - [https://pg0.jp/](https://pg0.jp/)