はじめに
sunabaの導入については「Sunaba講座 #0 導入編」をご覧ください。各講座へのリンクも貼ってあります
課題02 線を描く
画面左上端から右上端に向かう、水平な直線を引くプログラムを作ってください。
(ヒント:線は点の集まり)
はじめは解説を読まずにチャレンジしてください。Sunaba早見.pdfは見ても良いです。
まずは100行プログラムを書いてみましょう。コピペを活用すればそれほど大変じゃありません。
(コピペプログラミングがダメ!というのは、理解できないものを切り貼りして何となく動いて「イェーイ」で終了する人に対するお叱りです。理解できるものをコピペするのは問題ないです)
今後は一つに課題につき複数のプログラムを作る可能性が高いので、ファイル名に追番をつけて kadai02_01.txt としましょう。
課題02の解説
まずは100行プログラム
100行プログラムは書けたでしょうか?課題01でまばらに描いていた点を、横一直線に並べただけですよね。
疑似コード
memory[60000] -> 999999
memory[60001] -> 999999
memory[60002] -> 999999
・・・・・・・・
・・・・・・
・・・・
memory[60099] -> 999999
100行書かずに済ます方法を考える
ここからは100行書かずに済むプログラムを作る方法を、順を追って説明していきます。
-
研修では...
研修では、Sunaba早見.pdf を見て自分なりに考えてやってみたい人は、挑戦してもらって大丈夫です。(見ずにできたとしても完成後に内容確認してください。Sunaba独自の注意点があります。)
100行書かずに済むプログラムは、未経験者にとって初めての要素が多く必要になります。順を追って説明しますのでついてきてください。
- 100行プログラムのメモリ番号の変化を確認し規則性を見出します
- 画面メモリ番号が1つずつ増えてる
- 点を描く回数と長さが一致している (長さの単位はドット)
-
新しい考え方とルールの理解が必要になります
- プログラムを短くするには、一つの式を繰り返し実行する仕組みが必要です。しかし、同じ結果になる式を何回繰り返しても意味がありません。(60000番メモリに100回同じ色を書き込んでも意味がないでしょう?)
- 実行するたびに変化させたい箇所を変化させる仕組みが必要です。今回の課題で変化させたい箇所は、点の位置を表すメモリ番号でしょう。
- まず、点を描く回数を数えるメモリを用意します。これをカウンタと呼びます。何番メモリでも構いませんが、ここでは memory[0] を カウンタとして使うことにします
- 新しいルール
-
memory[....] -> □□□□□□
の右辺□□□□□□は、1つの数値だけでなく、式で表現できます -
memory[....]
のカッコ内. . . .も式で表現できます
-
- 式の数値を変えながら、繰り返し実行できれば、100行書かずに済みそうでしょう?
- 式を繰り返し実行させる仕組みは while(読み方:ワイル) で実現できます
- 以下に、式のルールと、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)**に変換してから次の動きを決めるのです
-
式は数値やメモリを算術演算子や比較演算子でつなげたものです
-
判定式の演算結果について
- 判定式の演算結果が 真 な限り、
while文の中のプログラム
を繰り返し実行します - 判定式の演算結果が 偽 なら、
while文の中のプログラム
を飛ばして、下に続くプログラムに移動します -
真 偽 を端的にいえば
- 真:演算結果が0以外
(比較演算子の式は、式が正しければ1が返ってくる) - 偽:演算結果が0(比較演算子の式は、式が間違っていれば 0 が返ってくる)
- 真:演算結果が0以外
-
while文の中のプログラム
とは?- インデント(TABキー1回 or Spaceキーn回分)によって、whileの下かつ右側に奥まったプログラムが繰り返しの対象となります
- インデントは TAB / Space どちらでもSunabaは解釈してくれますが、読みやすさは意識してほしいです。
- VisualStudioCode でプログラムを書いている場合はTABがいいです。研修はこれで統一します
- テキストエディタによっては、デフォルト設定のTAB幅が大きい場合があります
- 半角Spaceの場合は3つでお願いしたいです。半角Space 1つだと読みにくいです
- 半角Spaceの個数nは統一していないとエラーになります。試してみましょう
- 判定式の演算結果が 真 な限り、
武器を手に入れたので、改めて100行書かずに済む方法に迫る
-
100行プログラムをやめて、whileを使うとどのような形になるでしょうか。自分なりに考えた後に、疑似コードを参照してください。
疑似コード
memory[0] -> 0 # カウンタ while memory[0] < ____ 点描画 カウントアップ
-
詳細解説
- 数字が増えていくカウントアップ式のカウンタの判定式には、
カウンタ < 繰り返したい回数
という形を使います- 利点:右辺に繰り返し回数をそのまま書ける
- 注意点:カウンタがゼロスタート、比較演算子に **<(未満)**を使っている点
- カウンタがゼロスタートの理由は、コンピュータの世界が0から数えることが多いためです。Sunabaで言えばメモリは0番地から始まっています。とはいえ身近にあるExcelは「1行目、1列目」が基点になるシステムだったりしますが。。。柔軟に受け止めてほしいです。
- ループ動作がなかなか理解できない人は、プログラムを紙に書いて動きを追う練習がおすすめです。ループが3~5回程度の小さなプログラムで構いません。Sunaba君になったつもりで、カウンタの変化、画面メモリ操作状況、繰り返し状況を確認しながら読解するのがコツです。
- # 記号より右側はコメントです。Sunaba君はプログラム実行時にコメントを無視します。メモリや式、小さなプログラムの役割を、言葉で明示する時に重宝します
- while (判定式) のように判定式を**カッコ()**で括っても大丈夫です。C言語は()無しだと文法エラーになります。
- 数字が増えていくカウントアップ式のカウンタの判定式には、
-
お手本コードは明示しません。疑似コードの下線部、日本語部分が適切に書けているか不安に思うかもしれませんが、画面左上端から右上端に向かう、水平な直線を引くことができていれば大丈夫です。
次は、Sunaba講座 #4 四角の描画、2重ループの活用 です。