Sunaba講座 #3　線の描画、while、式の種類 について

## はじめに
sunabaの導入については「[Sunaba講座 #0 導入編](https://qiita.com/gmasa/items/62ae871d1f017d4cc682)」をご覧ください。各講座へのリンクも貼ってあります

## **課題02** 線を描く
**画面左上端から右上端に向かう、水平な直線を引く**プログラムを作ってください。
（ヒント：線は点の集まり）
はじめは解説を読まずにチャレンジしてください。Sunaba早見.pdfは見ても良いです。
まずは**100行プログラム**を書いてみましょう。コピペを活用すればそれほど大変じゃありません。
（**コピペプログラミングがダメ！**というのは、理解できないものを切り貼りして**何となく動いて「イェーイ」で終了する人**に対するお叱りです。理解できるものをコピペするのは問題ないです）

今後は一つに課題につき複数のプログラムを作る可能性が高いので、ファイル名に追番をつけて **kadai02_01.txt** としましょう。

---

### 課題02の解説
#### まずは100行プログラム
100行プログラムは書けたでしょうか？課題01でまばらに描いていた点を、横一直線に並べただけですよね。

<details><summary>疑似コード</summary>
<pre><code>
memory[60000] -> 999999
memory[60001] -> 999999
memory[60002] -> 999999
・・・・・・・・
・・・・・・
・・・・
memory[60099] -> 999999
</code></pre>
</details>

#### 100行書かずに済ます方法を考える
ここからは**100行書かずに済むプログラム**を作る方法を、順を追って説明していきます。

- <details><summary>研修では．．．</summary>
   研修では、Sunaba早見.pdf を見て自分なりに考えてやってみたい人は、挑戦してもらって大丈夫です。（見ずにできたとしても完成後に内容確認してください。Sunaba独自の注意点があります。）
  </details>

100行書かずに済むプログラムは、**未経験者にとって初めての要素が多く必要**になります。順を追って説明しますのでついてきてください。

1. 100行プログラムのメモリ番号の変化を確認し**規則性**を見出します
    - 画面メモリ番号が1つずつ増えてる
    - 点を描く回数と長さが一致している （長さの単位はドット）
1. **新しい考え方とルール**の理解が必要になります
    - プログラムを短くするには、**一つの式を繰り返し実行する仕組み**が必要です。しかし、同じ結果になる式を何回繰り返しても意味がありません。（60000番メモリに100回同じ色を書き込んでも意味がないでしょう？）
    - 実行するたびに**変化させたい箇所**を変化させる仕組みが必要です。今回の課題で変化させたい箇所は、**点の位置を表すメモリ番号**でしょう。
    - まず、**点を描く回数を数えるメモリ**を用意します。これを**カウンタ**と呼びます。何番メモリでも構いませんが、ここでは **memory[0]** を カウンタとして使うことにします
    - 新しいルール
        - `memory[....] -> □□□□□□` の右辺□□□□□□は、１つの数値だけでなく、式で表現できます
        - `memory[....]` のカッコ内. . . .も式で表現できます
    - 式の数値を変えながら、繰り返し実行できれば、100行書かずに済みそうでしょう？
        - 式を繰り返し実行させる仕組みは **while（読み方：ワイル）** で実現できます
1. 以下に、式のルールと、whileのルールを順番に解説します。ともにボリューム多めなのは、ここに情報を集約しているためであって、一読ですべて理解できなくても大丈夫です。必要な時にその都度確認する感じでお願いします。

---
### 式のルール
- 式の種類：代入式、式、判定式
    - 代入式：`memory[....] -> □□□□□□`です。左側で指示したメモリを、右側の値に設定する形を**代入式**と呼びます
    - 式：計算結果が式の場所に返ってくる形を、単に**式**と呼ぶことにします
    - 判定式：式の呼び名を変えたものです。制御構文（while, if）の動作を決める式を**判定式**と呼びます（後述します）
- 式の構成要素
    - 数値：整数のみ。小数は不可です。使用可能範囲はおよそ －20億 から ＋20億 です。（使用場面により範囲は変動する）
    - メモリ：メモリ0番～30000番台に格納できる数値も －20億 から ＋20億です。他のメモリ番地は役割毎に扱う数の範囲が異なります（早見表.pdf 参照）
        - 【注意：30000番台について】39999番から遡るようにプログラム自体が格納されるため、30000番台は読み書き不可としましょう（少なくとも今は）
    - メモリの使い方には禁止事項があります
        - 書き込み不可メモリは、代入式の左辺に置けない
        - 読み出し不可メモリは、代入式の右辺に置けないし、判定式にも使えない
- 演算子の種類（構成要素をつなげるもの）
    - 代入演算子：->
    - 算術演算子：+, -, *, /
    - 比較演算子：=, >, <, !=, >= ,<=
- **Sunabaの演算子には優先順位がありません！**
    - 算数では当たり前の、加減算よりも乗除算を先に行うルール、それがないということです
    - 複数の構成要素からなる式は**カッコ（  ）**で計算順を明示してください
    - C言語には優先順位があります。SunabaはSunaba、C言語はC言語ということで順応してください
 
---
### whileのルール
- 繰り返しは **while  判定式** を使います
- **判定式**には**代入記号である-> がありません**。単なる **式** になります。
    - **式**は数値やメモリを算術演算子や比較演算子でつなげたものです
        - 数値やメモリが単体で存在するだけでも可です。
        - 比較演算子は、関係演算子と呼ばれることもあります
        - 式の形の例：　5,　-8,　memory[100],　1+1,　memory[0]-1,　1<3,　3<2,　memory[4]>=10,　d=12,　等々
    - 式の計算結果はその場所に返ってきます（分かりにくい！）。これを理解するには、あなたがプログラムを読解し実行する『Sunaba君』になりきる必要があります
    - Sunaba君はプログラムを上から一行ずつ読解＆計算します。例えば、**while (1+1)**と書かれた所に差し掛かったとします。そうしたら **while (2)**に変換してから次の動きを決めるのです

- 判定式の演算結果について
    - 判定式の演算結果が **<font color = 'orange'>真</font>** な限り、`while文の中のプログラム`を繰り返し実行します
    - 判定式の演算結果が **<font color = 'skyblue'>偽</font>** なら、`while文の中のプログラム`を飛ばして、下に続くプログラムに移動します
    - **<font color = 'orange'>真</font>** **<font color = 'skyblue'>偽</font>** を端的にいえば
        - 真：演算結果が０以外
            （比較演算子の式は、式が正しければ1が返ってくる）
        - 偽：演算結果が０（比較演算子の式は、式が間違っていれば 0 が返ってくる）
    - `while文の中のプログラム`とは？
        - インデント（TABキー1回 or Spaceキーn回分）によって、**while**の下かつ右側に奥まったプログラムが繰り返しの対象となります
        - インデントは TAB / Space どちらでもSunabaは解釈してくれますが、読みやすさは意識してほしいです。
            - VisualStudioCode でプログラムを書いている場合はTABがいいです。**研修はこれで統一します**
            - テキストエディタによっては、デフォルト設定のTAB幅が大きい場合があります
            - 半角Spaceの場合は3つでお願いしたいです。半角Space 1つだと読みにくいです
            - 半角Spaceの個数nは統一していないとエラーになります。試してみましょう

---
### 武器を手に入れたので、改めて100行書かずに済む方法に迫る

1. 100行プログラムをやめて、**while**を使うとどのような形になるでしょうか。自分なりに考えた後に、疑似コードを参照してください。

    <details><summary>疑似コード</summary>
    <pre><code>
    memory[0] -> 0   # カウンタ
    while memory[0] < ＿＿＿＿
        点描画
        カウントアップ
    </code></pre>
    </details>

1. 詳細解説
    - 数字が増えていくカウントアップ式のカウンタの判定式には、`カウンタ　＜　繰り返したい回数`という形を使います
        - 利点：右辺に繰り返し回数をそのまま書ける
        - 注意点：カウンタがゼロスタート、比較演算子に **<（未満）**を使っている点
            - カウンタがゼロスタートの理由は、コンピュータの世界が０から数えることが多いためです。Sunabaで言えばメモリは０番地から始まっています。とはいえ身近にあるExcelは「1行目、1列目」が基点になるシステムだったりしますが。。。柔軟に受け止めてほしいです。
        - ループ動作がなかなか理解できない人は、プログラムを紙に書いて動きを追う練習がおすすめです。ループが3～5回程度の小さなプログラムで構いません。**Sunaba君になったつもりで**、カウンタの変化、画面メモリ操作状況、繰り返し状況を確認しながら読解するのがコツです。
    - **#** 記号より右側はコメントです。Sunaba君はプログラム実行時にコメントを無視します。メモリや式、小さなプログラムの役割を、言葉で明示する時に重宝します
    - **while (判定式)** のように判定式を**カッコ（）**で括っても大丈夫です。C言語は（）無しだと文法エラーになります。

1. お手本コードは明示しません。疑似コードの下線部、日本語部分が適切に書けているか不安に思うかもしれませんが、**画面左上端から右上端に向かう、水平な直線を引く**ことができていれば大丈夫です。

---
次は、[Sunaba講座 #4　四角の描画、２重ループの活用](https://qiita.com/gmasa/items/122ef3636ed7cf326a53) です。