プログラミング課題の提出方法と全般的な注意

★★「簡単なルールに基づいて,合理的 かつ わかりやすい プログラムを作る」★★
という意識をしっかり持ってください!

★最後までよく読むこと(よくある質問,よく見られる間違いについては,テキストに説明が書いてあります).

特に,再提出に関する注意保存ファイルの実行・確認・再編集に関する注意 も事前に確認しておくこと.

★★★★★★★★★★【警告】★★★★★★★★★★
授業中に,すでに完成したプログラム(テキストに掲載されたものや過去に自身が提出した課題プログラムを除く)を参照する行為は,試験における不正行為(いわゆるカンニング)に準ずるものとして禁止 します.
スマートフォンの画面を覗き込む等の行為も,紛らわしいのでやめてください.
(同じクラスの学生同士で作成途中の画面を相互参照するのは禁止しませんが,先に終わった学生の解答を丸写しする行為は上記禁止行為に該当します)

[提出締切]:原則として,各課題の説明を行った授業の授業時間内 (別途指示した場合を除く). 時間内に終わらなかった場合も, 授業時間後(月曜・水曜クラス16時20分〜,木曜クラス14時40分〜)に計算機実習室で作業して終わらせてください.

  • ★時間内に確実に終わらせたければ積極的に質問すること!
  • 質問には授業時間外にも対応しますので,疑問点があればEメールにて連絡し,未解決のまま放置しないこと.
  • 時間が余った場合は(あれば)発展課題に取り組むこと.発展課題の提出締切は特に設けませんが,翌週の授業で解説するので,必ず考えておくこと.

提出方法および提出時の注意:

  • Webメール を使用し,プログラムの内容をEメール本文中にコピー&ペーストで貼り付け,さらにプログラムのファイルも添付して徳永宛(tokunaga.las@tmd.ac.jp)に送信.
    • 十進BASICからWebメールにプログラムを貼り付ける際にも ショートカットキー を活用し,
      [Ctrl+A](全選択) → [Ctrl+C](コピー) → [Alt+Tab](ウィンドウ切替) → [Ctrl+V](ペースト)
      という手順で!
    • Subject(件名)はすべて半角文字で「(学籍番号)(拡張子を省略したファイル名)」(「2115**** kadai***」の形)とします.
      • 複数のプログラムを同時に提出する際は,「kadai***」の「***」の部分をカンマで区切って並べてください.
      • Subject(件名)が指定通りでない場合は内容が正しくても再提出
        注:件名の先頭に学籍番号を入れてもらうのは,大量に(毎週約200通!)届く課題のEメールを件名でソート(並べ替え)して管理するためです.★再提出も含め,件名の先頭が学籍番号になっていないものはソートした際に確認できないので,受理されないと考えてください.
    • 一般的なマナー の問題として,署名も必須なのは当然です([学籍番号+フルネーム]が基本).
  • 各課題のプログラムは提出前にUSBメモリに保存しておくこと.
    • 「保存する場所」をUSBメモリの中の適切なフォルダに変更するのを忘れないように!
      • ★混乱を防ぐため,課題のプログラムは必ず毎回同じ場所(専用フォルダ)に保存すること!
    • ファイル名はすべて半角文字で「kadai**.BAS」の形とします. (拡張子「.BAS」は保存時に自動付加されるので,「ファイル名」の欄には拡張子を省略したファイル名を入力).
    • Webメールにプログラムを貼り付ける直前に実行結果の最終確認(計算値等が正しいことの確認も含む)を行い,その後(ファイル添付の前に!)上書き保存を忘れずに行うこと (残念ながら十進BASICでは Ctrl+S は使えないのでマウス操作で).
  • 行番号は必須!(添削時や修正箇所の説明のために必要)
    • 保存・提出前に「編集」→「行番号付加」で付加すること(最初から入れるのは労力の無駄!).修正して行番号を付け直す際も,いったん「行番号削除」で削除してから再度付加すれば良い.
    • 行番号は10の倍数とします.また桁数を揃えて見やすくするために,プログラム全体が10行を超える場合は 100, 110, 120, … と 3桁 で統一(「行番号付加」では自動的に調節してくれます).

    • ★行番号の桁数が途中で変わると,プログラム本文の左端がズレてしまうため,プログラムの構造を表すインデント(字下げ)がわかりづらくなってしまいます.単なる見映えの問題ではありません!

【重要】プログラムのデバッグ(修正)について

「プログラム(program)」には名詞と動詞(「プログラムを作る」)があります.「プログラム課題」ではなく「プログラミング課題」としているのは,プログラムそのものだけでなく,プログラム作成の過程(デバッグを含む)を含めたprogramming(=動詞「program」による動名詞)の課題であるということを示しています!

プログラム上の間違いをバグ(bug)といい、これを探して修正する作業をデバッグ(debug)といいます.プログラムは正しく作動することを確かめた時点で初めて完成するので,実行結果をよく吟味し,正しい処理が行われることを確かめる作業がとても重要. また十進BASICでは「ステップ実行」の機能があるので,これを利用して変数の変化を逐一観察し,デバッグに役立てることができます.
  • ★よくわからない場合,最初はヤマカンの部分があっても良い.とりあえず実行 → 結果を見て再検討 → 修正(デバッグ)というプロセスこそ重要
  • 特にINPUT文を用いるプログラムでは,いろいろな値(結果を容易に検証できるような小さな値)を入力してチェックすること.
  • 多くのミスは実行結果の確認(エラーの有無だけではなく,値や図形の確認)により容易にチェックできます.実行結果の確認が不十分なまま提出しないように!

★再提出について★:

  • 再提出の際は,「返信」により元メール全文を引用した上で,Subject先頭の「Re:」を削除し,末尾に「再」を付加せよ.
  • 本文の冒頭で,添削コメントや質問事項を踏まえ,「 どこが間違っていて, それを どう修正したのか 」 を具体的にわかりやすく記述し,その下に修正したプログラムを貼り付けること.さらに修正したプログラムのファイルを添付(件名のみの修正でも再添付すること).
    • 修正箇所を示す際には行番号を用いること(間違いを指摘する際は,敢えて行番号を用いないことも多いですが,それは「間違っている箇所を自分で探すこと」が重要な学習の一部だからです!誤解のないように).
    • ★問題点を正しく認識し,修正するプロセスが非常に重要なので,説明の記述も重視します. 「他の学生の解答をよく考えずに写したのではないか」と疑われないように,丁寧な説明を心がけてください!
    • 特に、質問事項への回答が曖昧にならないようにすること.また,問題点をすべて具体的に指摘するとは限らないので,必ず全体をよく見直すこと.
    • 間違いを正確に認識することが重要なので,修正は原則として必要最小限にとどめること(「間違いの修正」とは言えない変更を加える場合は,その意図をきちんと説明するように).また,すべての修正・変更点について,漏らさず説明すること
  • 再提出は‘対話’です.あなたのコミュニケーション能力が問われています. 患者さんとの対話による1対1のコミュニケーションは,すべての医療の基本ではないでしょうか.
  • ★その他,署名適切な改行等,Eメールに関する一般的なマナー(参照)を守ってください. 過度に丁寧になる必要はありませんが,Eメールによる意思疎通(内容のわかりやすさも含む)をきちんと行うことも,情報リテラシー学習の一環として重要です

保存したプログラムの実行・確認・再編集について:

  • 予備知識として,ファイルの拡張子とアプリケーションソフトの関連付けの概念を再確認してください.
    【復習】拡張子「.htm」「.html」のファイルをダブルクリックすると InternetExplorer (Windows10の初期設定ではEdge)で表示されるのは,それらの拡張子がIEに関連付けられているため.また拡張子「.txt」のファイルはWindowsの初期設定でメモ帳に関連付けられているので,これをダブルクリックするとメモ帳に読みこまれた形で表示されます(TeraPadで編集したかどうかは無関係!).
  • アーカイヴ版の十進BASICをUSBメモリ内から起動する場合(授業の時はこちら),拡張子「.BAS」に関連付けされているソフトは存在しないので,BASICのプログラムをファイルから直接開くことはできません.いったん保存したファイルの実行や編集を行う際は,十進BASICを起動してからファイルの「読み込み」(=「開く」)を行う必要があります.
  • 自宅のパソコン等にインストーラ版の十進BASICをインストールした場合,インストール時に拡張子「.BAS」が十進BASICに関連付けられるので,そのパソコンではプログラムのファイルをダブルクリックすると十進BASICに読みこまれた形で開きます.

JUMP → TOP   (再)                     10



プログラミング課題1(テーマ:演算子の使い方)
まず以下のプログラムにおいて,第30行の[A]を削除して入力し,表示される4桁の数字を確認せよ(第10-20行において 1 から始まる4桁の整数をランダムに生成して表示させているが,なぜそうなるかはまだ理解しなくてよい).
10 RANDOMIZE [各自の学籍番号(半角数字)]
20 PRINT 1 ; INT(10*RND) ; INT(10*RND) ; INT(10*RND)
30 PRINT [A]
40 END
このプログラムの第30行の[A]に適切な数式を入れて,4桁の同じ値がもう1つ(計2つ)表示されるようにしたい. ただし,[A]に入れる数式は,以下の条件をすべて満たすようにすること.
  • 用いる値は 0 を除く1桁の整数1 〜 9 )のみ.
  • 「+」または「−」のいずれかを計1回または2回使用(3回以上使うのは禁止).
  • 「*」または「/」を1回以上使用(どちらを何回使ってもよい).
  • 「^」を1回以上使用(何回使ってもよい).
  • カッコは使用禁止.
  • 「/1」「^1」「+3-3」「*2/2」など,値が変化しない無意味な演算は使用禁止
[A]を埋めて完成したプログラムを提出せよ.ファイル名は「kadai01.BAS」.

注意とHINT
  • いきなりピッタリの値を作ろうとせず,さまざまな計算を試行錯誤して近い値,使えそうな値が出る式を探ること.
  • 「十進BASICにおける数式・計算」に慣れるための演習なので,試行錯誤も含め,(暗算以外の)すべての計算を十進BASICによって行い,紙や電卓は一切使わないこと.
  • 1桁の整数しか使えないので,ベキ乗を使わないと大きな値は作りにくいことに注意.「 ^ 」を上手く使うのがポイント.


JUMP → TOP   (再)                     10



プログラミング課題2
(テーマ: LET文, INPUT文 と変数の使い方,PRINT文における改行の制御)
INPUT文により入力された3数 a, b, c に対し,それらの 平均m,分散S2,標準偏差S,不偏分散U2 およびその正の平方根 U を順に計算し表示するプログラムを作成せよ.ただし実行した際、PRINT文によって出力画面上で以下のように表示されるようにようにすること.
  • 1行目(INPUT文により表示される行の次)に 「平均 =(mの値)」 と表示.
    (括弧内が計算値.文字列 "平均 =" と計算値を続けて表示させる.括弧およびカギ括弧は表示させない.以下同様)
  • 2行目は空白(改行のみ).
  • 3行目に「分散 = (S2の値) 」と「標準偏差 = (S の値)」を(改行せずに)続けて表示.
  • 4行目は空白(改行のみ).
  • 5行目に「不偏分散 = (U2 の値)」と「不偏分散の平方根= (U の値)」を(改行せずに)続けて表示.
保存時のファイル名は「kadai02.BAS」.

注意とHINT
  • 平均分散不偏分散標準偏差 の定義:  n 個の値 { a1 , a2 , … , an } からなるデータに対し,

    • [平均] = (1/n) Σ1≦i≦n  ai


    • SUM = Σ1≦i≦n ( ai - [平均] )2   とおくと, [分散] = SUM/n [不偏分散] = SUM/(n-1)

      • すなわち 不偏分散 は 分散 の (n/(n-1)) 倍.分散 よりやや大きくなることに注意.
      • 分散 および 不偏分散 は、いずれも「データの散らばり具合」を示す尺度ですが,母分散を推定するための値(推定量)としては「不偏分散」の方を用います.

    • [標準偏差] = [分散]
      • [標準偏差] = [不偏分散] と定義することもありますが,ここでは上の定義(後期の統計学で用いる教科書と同じ定義)を採用します.また [不偏分散] は,「標本標準偏差」と呼ばれることもあります.

    ★以上の定義に基づいて,まず a, b, c の平均,分散,標準偏差,不偏分散(とその平方根)を表す式を, a, b, c (だけ)を用いて書いてみましょう.


  • プログラムは段階的に作成すること!
    1. まず a, b, c の平均を計算して表示させるプログラムを作成し,実行結果を確認.
    2. 次に1.のプログラムに追加(必要に応じて一部改変)する形で a, b, c の平均と分散を計算して表示させるプログラムを作成し,実行結果を確認.
    3. 最後に2.のプログラムに追加(必要に応じて一部改変)する形で課題のプログラムを完成させ,実行結果を確認.PRINT文の使用法も再確認し,指示通りに表示されるようにすること.

  • 計算式について:
    • 演算の優先順位を再確認し,★必要に応じてカッコを用いること.
    • 平方根の計算は,組込み関数 SQR を使う方法もあるが(2.5参照),ここでは (1/2)乗 として計算せよ.

  • 変数の使い方について:
    • あとで他の計算に用いる値については,まずLET文を用いて適当な変数に代入せよ. ただし S や U は表示させるだけなので,PRINT文に計算式を直接記述すればよい.むやみに変数を増やしても混乱の元になるだけ.
      ★後述の「悪い例」「良い例」にも注意!
    • 十進BASICでは全角文字の変数も使えるが,ここでは半角文字を使うこと
    • 変数は半角アルファベットを用いた文字列なら何でも良い(たとえば「hensuu」という文字列を変数として使うこともできる!)のですが,迷う人もいるようなので例を挙げておきます.簡潔でわかりやすくなるように,英単語の頭文字等をうまく利用しましょう.
      平均(mean):m ,分散(variance):v ,不偏分散(unbiased variance):uv,標準偏差(standard deviation):sd
      (標準偏差は表示させるだけなので,ここでは変数に代入する必要はありませんが,参考例として挙げました)

  • 計算・表示の手順について:
    • ★効率の良いプログラムを作ることも重要.変数およびLET文をうまく利用し,同じ計算を無駄に繰り返さないようにすることこと.
    • 下記の「悪い例」のように,明らかに無駄な(不必要な)繰り返しが見られる場合は不合格とします.
      • ×悪い例 ( 「(a+b+c)/3」を20行・30行の両方で計算している):
         20 PRINT "平均=" ; (a+b+c)/3
         30 LET m=(a+b+c)/3
      • ○良い例 ( 30行は m の値を表示するだけなので,「(a+b+c)/3」の計算は1回だけ):
         20 LET m=(a+b+c)/3
         30 PRINT "平均=" ; m

  • 【重要】実行結果の確認について:
    • [あらためて強調]実行結果を確認し,正しく作動することを確認した後に初めて「プログラムが完成した」と言うことができます.
    • 繰り返し実行していろいろな値をINPUTし,すべて正しく計算・表示されることを確認すること.
      ★最低限行うべきチェック:
      • a=b=c となる値を入れて実行(分散=不偏分散=標準偏差=U=0 となるはず).
      • (a,b,c) = (2,8,14), (30,60,90) など,a, b, c が等差数列となる値を入力して実行(平均値=b となり、分散・不偏分散等の値も暗算でチェックできる).
      あくまで「最低限」であって、「これだけやればよい」という意味ではありません!様々な値を入力して実行し,分散と不偏分散の関係,平方根の値などをよく確認すること.
    • 「間違いを見つける」作業(=デバッグ)もプログラミング学習の一部です.まず自分で確認する姿勢が重要.実行結果をよく確認する前に「合ってますか?」と問うのはナンセンスです(実社会には「添削してくれる先生」はいません!). プログラムの間違いの多くは,実行結果の確認により発見できます.
再提出になる人が相当数生じると予想されます.提出前のチェックを徹底することはもちろんですが,あらためて,再提出の方法 をよく確認しておいてください.



JUMP → TOP   (再)                     10



プログラミング課題3(FOR〜NEXT構文の使い方)
テキストの例4を参考に,以下の2つのプログラムを作成せよ.
  • INPUT文により入力された整数 n, r に対して nPr , rPr を計算し(表示はしなくてよい),さらに 組合せの総数
    nCr = nPr / rPr
    を求めて表示するプログラム(ファイル名:「kadai03a.BAS」).
  • INPUT文により整数 n を入力.n 人のクラスにおいて,誕生日が一致する2名が少なくとも1組存在する確率を求めるプログラム.ただし閏年は無視して1年を365日とし,2月29日生まれは存在しないとしてよい(ファイル名:「kadai03b.BAS」).
*2つのプログラムを一度に提出する場合(なるべくそうしてください),件名は「(学籍番号)kadai03ab」としてください.

kadai03a.BAS に関する注意とHINT

  • FOR〜NEXT構文を2回使って公式の 分子 nPr,分母 rPr を別々に計算し,最後に割り算をした値を表示.
    • 1つのFOR〜NEXT構文で作る方法(後述の[発展1])もあるが,まずは2回使う方法で.
    • rPr = r ! = 1×2×…×r です.難しく考えないように!
  • FOR〜NEXT構文の制御変数は,2回とも k とせよ(本来なんでもよいが,添削する際の見易さのために統一).
  • 必ず提出前に n, r の値を変えて複数回実行し,別途計算した値と比較して,正しく計算されることを確認すること.
  • ★[発展1]〜[発展3]はこの課題の続きです.非常に重要なので,必ずやること!
    (次回解説するので,できなくても考えておくこと)

kadai03b.BAS に関する注意とHINT

  • ★kadaii03a.BASとは変数 n の役割が異なるので,混同しないように!
  • 考え方のヒント:
    • 余事象(=「全員の誕生日が異なる」)を考える.(求める確率)=1−(余事象の確率).
    • (n人全員の誕生日が異なる確率)
        =(n人全員の誕生日が異なる場合の数)/(n人の誕生日の起こり得るすべての場合の数)
    • (n人全員の誕生日が異なる場合の数)= xPy と表せます.x, y に入る値は?
  • ここでも実行結果の確認は必須しかしこのプログラムでは n の値が大きくなると正しく計算されたかどうかの確認が難しいので, n=1,2,3,4,5 での実行結果を 「PRINT+(変数を含まない)計算式」 によって計算させた値と比較 し,確認せよ.
    • n に自分のクラスの人数を入れて計算させ,自分のクラスに誕生日が一致する2名が存在する確率を求めてみよう!
    • さらに n にいろいろな値を入れて計算させ,「確率 0.5を超える n の値」「確率 0.9を超える n の値」etc. を求めてみよう!
    • こちらのサイトでも実行結果の値の確認ができます.
  • 【重要】「n人全員の誕生日が異なる確率」において,分母と分子を別々に計算した場合,n が大きくなったとき( n=40 あたり),「桁あふれ(overflow)」により計算不能になります.これを観察し,改善方法を考えましょう.
    • 積の計算が連続すると,値が爆発的に増えていくことに注意.まずステップ実行で値が増えていく様子を観察しましょう.
    • HINT:分母・分子はいずれも,n 個の値の積となっていることに注意.値が大きくなりすぎるのを防ぐために,FOR〜NEXT構文において,分母・分子を同時進行で計算します.
    • この改善方法がわからなくても n=30 あたりまで計算できれば一応合格としますが,[発展1]の内容・HINTも読んでよく考えておくこと(基本的なアイディアは同じ).

[発展1] まず n=100, r=100 の場合について kadai03a.BAS を実行し,結果を確認せよ(ステップ実行も行うこと). そのような結果となる理由について考察し,プログラムを改善する方法を考えよ.

  • 【発展1のための練習課題】例4のプログラム(順列の個数 nPr の計算)の第30行を以下のように書き換えたとき,同じ計算結果を導くためには第40行をどう記述すればよいか.(a)に入る式を書け.
    10 INPUT n,r
    20 LET p=1
    30 FOR k= 1 TO r
    40    LET p=p*(a)
    50 NEXT k
    60 PRINT p
    70 END
    
  • [発展1]のHINT
    • HINT1: 1つのFOR〜NEXT構文の中で,分母と分子を同時に計算します.
    • HINT2: FOR〜NEXTで挟まれる文は「LET p=p*(式A)/(式B)」の形になります.制御変数の範囲とカッコ内の式をよく考えましょう.
    • HINT3: STEPが無ければ制御変数の値は1ずつ増えることに注意.制御変数の最初の値と最後の値についてよく確認すること.
    • 【重要】HINT4: 公式の分母・分子において,掛け合わせる r 個の値をよく観察しよう:
      分子 = (n-r+1) × (n-r+2) × × (n-1) × n
      分母 = 1 × 2 × × (r-1) × r
      上下の差が常に (n-r) となっていることに注意.縦に並んだ分母・分子の値を対にして捉え,以下のいずれかの方針で考える.上下で対になる値をそれぞれ[分子][分母]と表したとき,
      1. [分子]=[分母]+(n-r) です( n = r+(n-r) ).[分母]= k とおくと,[分子]は?
      2. [分母]=[分子]-(n-r) です( 1 = (n-r+1)-(n-r),r = n-(n-r) ).[分子]= k とおくと,[分母]は?
      ★ 1., 2. の発想に基づいて,2通り(以上)のプログラムを考えること(ファイル名:「kadai03c.BAS」「kadai03d.BAS」).
  • ★(当然ながら)実行結果の確認は今回も必須です.kadai03a.BASと同じ値になることを確認すること!

[発展2] サイコロを n 回投げたとき,3の倍数(3または6)が ちょうど r 回 出る確率を求めるプログラムを作成せよ(ファイル名:「kadai03e.BAS」).

  • 【参考】 高校数学では「反復試行(または 独立試行 )の確率」と呼ばれるタイプの確率の計算を行うプログラム.統計学用語を用いると,「2項分布 B(n,1/3) に従う確率変数 X に対し,確率 P(X=r) を求めるプログラム」となります.
  • Excelの関数(BINOM.DIST)について調べ,これを用いて計算結果をチェックしてみましょう.

[発展3] X を 2項分布 B(n,p) に従う確率変数とする.INPUT文により入力された n, p, r に対し,確率

P(X=r) = nCr ・ pr (1-p)(n-r)

を求めるプログラムを作成せよ(ファイル名:「kadai03f.BAS」).

★発展課題の提出は任意ですが,試験範囲とします(今回は特に関連する問題を期末試験に出題する可能性が高い).次回以降の授業で解説するので,各自よく考えておくこと.提出してくれればもちろん添削します.ただしその場合も, n, r の値を変えて複数回実行し,正しく計算されることを確認してから提出してください.



JUMP → TOP   (再)                     10



プログラミング課題4(テーマ:組込関数 RND, INT を用いた乱数の作り方)
以下の2つのプログラムを作成せよ.ただしいずれのプログラムでも,毎回異なる乱数列が表示されるようにすること.
  • INPUT文で入力された整数 k に対し,3以上7以下の各整数 (3,4,5,6,7)をランダムに等確率で発生し,改行せず横に続けて k個 表示させるプログラムを作成せよ.保存時のファイル名は「kadai04a.BAS」.
  • INPUT文で入力された整数 m, n, k に対し, m 以上 n 以下の各整数(m,m+1,m+2,...,n)をランダムに等確率で発生し,改行せず横に続けて k個 表示するプログラムを作成せよ.保存時のファイル名は「kadai04b.BAS」.

(★上の課題が難しいと感じた人は,まず以下の練習課題に取り組んでください)
[練習課題] 以下の2つのプログラムを作成せよ(★それぞれ,課題4との関連を考えましょう).

  • INPUT文で入力された整数 k に対し,0 以上4以下の各整数 (0,1,2,3,4)をランダムに等確率で発生し,k個 表示させるプログラムを作成せよ.
  • INPUT文で入力された整数 n, k に対し, 0 以上 n 以下の各整数(0,1,2,...,n)をランダムに等確率で発生し,k個 表示するプログラムを作成せよ.

注意とHINT および発展課題
  • 2.5.6の最後のプログラムと[問]を参考にしてください.それぞれの変数の意味・役割もよく考えること!
  • FOR〜NEXT構文の制御変数は,他の変数と重複しないように!
    • 特に kadai04b.BAS では 「m 以上 n 以下の整数」 のところで n が使われているので, n を制御変数として用いることはできません!
  • ★kadai04b.BASではINPUT文を 「 INPUT m,n,k 」 とすること(添削しやすさの為に変数の順序を指定します)
  • ★よくわからない場合,プログラム中の数値を様々な値に変えて実行し,試行錯誤を繰り返しながら考えること.
  • 必ず提出前に繰り返し実行し,( k にある程度大きな値を与えて)「3以上7以下」「m以上n以下」等、指定された範囲の整数がまんべんなくほぼ一様に,計 k個 表示されることを確認すること (特に両端のmとnが出ることをしっかりチェック).

[発展1] INPUT文で入力した整数 k に対し, 3, 5, 7, 9 のいずれかの値をランダムに等確率で発生し,改行せず横に続けて k個 表示させるプログラムを作成せよ(ファイル名:「kadai04c.BAS」).

  • HINT:「3,5,7,9」は初項 3 ,公差 2 の等差数列であることに注意.まず「0,2,4,6」で考えてみる(出来たら,それを +3 ずらすだけ).

[発展2] 初項 a ,公差 r ,長さ n の等差数列 a, a+r, a+2r, ..., a+(n-1)r のいずれかの値を等確率で発生させるためには,乱数をどのような式で作れば良いか? INPUT文で与えられた a, r, n, k に対して,この等差数列のいずれかの値をランダムに k 個表示させるプログラムを作成せよ(ファイル名:「kadai04d.BAS」)



JUMP → TOP   (再)                     10



プログラミング課題5
(テーマ:PLOT LINES文, PLOT POINTS文による作図, 楕円の媒介変数表示)
以下の注意に従い,別途提示されたお手本の図形を描画するプログラムを作成せよ(ファイル名:kadai05a.BAS).
ただし,以下の指示を守ること.
  • DEF文は使わない(あまり複雑な数式は扱わないので,プログラムが長くなるだけでメリットがない).
  • SET WINDOW文の使用は1回だけ(最初に定めた座標設定を変えない).
  • FOR〜NEXT構文の制御変数は t で統一(チェックする際の見易さのため).
  • 円→楕円→半円→線分→点(×)の順 に描く(チェックする際の見易さのため)
    *従ってPLOT POINTS文はプログラムの最後(END文の直前)となります.
  • 色の組み合わせは変更して良いが,お手本で色が異なる部分は色を変更し,同じ色にならないように.
    *色の変更は(「SET COLOR」も使えますが)テキストに従い「SET LINE COLOR」と「SET POINT COLOR」を用いてください.

注意とHINT
  • 図形全体が厳密に一致する必要はないが,図形どうしの位置関係(対称性や「接しているかどうか」等)に注意.特に円どうしが接する場合は,(見た目で判断するのではなく)半径の厳密な値を計算し,設定すること.

    まず幾何学的な理解を確認するために,以下の練習課題をやってください(提出は不要ですがこれを理解しないと課題は絶対にできないので必ずやること!).

    [練習課題]以下は 互いに接する2つの円 を描くプログラムである.(a)に入る数式(2つ目の円の半径の値)を 2通り 答えよ.

    100 OPTION ANGLE DEGREES
    110 SET WINDOW -5,5,-5,5
    120 DRAW grid
    130 !!! 1つ目の円(原点中心,半径1)
    140 FOR t=0 TO 360
    150    PLOT LINES: COS(t),SIN(t);
    160 NEXT t
    170 PLOT LINES   ! 直前の ; を打ち消す
    180 !!! 2つ目の円(点(1,2)中心,半径 r )
    190 LET r=(a)
    200 FOR t=0 TO 360
    210    PLOT LINES: r*COS(t)+1,r*SIN(t)+2;
    220 NEXT t
    230 END
    HINT 1 外接内接があります.
    HINT 2 :まず r=1 として,中心の位置関係を確認.2つの円が接する時,中心間距離と半径の関係がどうなっているかをよく考えること.
    ★平方根を計算する際には,組込み関数SQR を用いること.
    ★170行を削除して実行するとどうなるかを確認し,170行のPLOT LINES文の役割について理解すること.
    (わからない場合はテキスト例16を再確認)
    ★130・170・180行のように,プログラム中に「 ! 」を入れると,その行において「 ! 」より右側はプログラム実行時に無視されます. プログラムが長くなる場合,これを用いてプログラム中に説明コメントを記入することを推奨します.
    [参考]変数 r は 「radius(半径)」の頭文字から取っています.

    ★課題5においても,上の練習課題と同様に

    • まず円の中心を決めてから 適切な半径の値を計算しましょう(先に半径を固定して中心の座標を求めようとすると, 2変数の方程式となり難しい).
      ★平方根を計算する際には,組込み関数SQR を用いること.
    • プログラムの作成段階においては DRAW GRID文 を入れておき,座標を確認しながら試行錯誤すること(ただし提出する際にDRAW GRID文を削除するのを忘れないように!).

  • SET WINSOW文による座標設定の範囲は狭すぎても広すぎても扱いづらい.どのぐらいが適切かは描く図形によって異なるので,その都度考えること(最初は大雑把に設定しておき,表示される図形を見て調節すればよい).
  • 図形全体の大きさやバランスをよく考慮し,図形がはみ出したり,逆に余白が大きくなりすぎたりしないように注意すること.
    ★特に最初の円の中心位置をよく考えること.
  • SET〜文を置く位置に十分注意すること.プログラム実行時の処理において,無駄に繰り返されないように!
  • PLOT LINES文の使い方については特に注意せよ.
    • 行末の「;」セミコロン)の役割を再確認せよ(2.6.3参照).「次のPLOT LINES文で指定された点と繋げる」ときにつけるが,そこで「止める」場合には付けない.図形の連なり方を考慮して判断する必要があるので,毎回確認すること!
    • 1本の線分は(もちろん!)1つのPLOT LINES文で両端点の座標を指定することにより描くことができる.
    • 数点を結んでできる一続きの折れ線も,1つのPLOT LINES文で描くことができる(各点の座標を で区切って記述していくだけ).
  • LET文を使ってもよいが(使わなくてもよい),1回限りとせよ最小限にとどめ,無駄に繰り返さないよう注意すること. 無意味な変数やLET文が用いられている場合も不合格.
  • 「点」に関する設定を行う SET POINT STYLE文, SET POINT COLOR文 も忘れないこと.
  • 【重要】実行結果の確認はもちろん重要だが,この課題では実行結果を見ただけでは気付きにくい間違い(SET〜文やPLOT LINES/POINTS文の使い方に関するものなど)を犯しやすいので,提出前にプログラム全体をよく見直すこと.
    ★PLOT LINES文の間違いが特に多いので充分注意すること!
  • 【重要】再提出の際はこのページの冒頭に書かれた指示に従うこと(毎年再提出が非常に多いのであらためて念を押しています).
    ※今回は長いプログラムなので,特に行番号の使用は必須です.すべての修正箇所を行番号と共に説明すること.
[発展1] kadai05a.BASを書き換えて,別途掲示された図形を描くプログラムを作成せよ(ファイル名:kadai05b.BAS).

[発展2] 別途提示されたお手本を参考に,より複雑なイラストを描くプログラムを作成せよ(ファイル名:kadai05c.BAS).
  • お手本を真似ても良いし,自由な発想で作成しても良い.
  • 独自性のある優秀作品は次回の授業で紹介します.余裕のある人は張り切って作成してください.
  • SET LINE WIDTH〜」で線を太くすることができます(お手本用のプログラムでも使用しています). また「SET AREA COLOR〜」と「PAINT」の組合せにより,領域に色を塗ることができます. 余裕がある人はヘルプで調べて使ってみましょう.


JUMP → TOP   (再)                     10



プログラミング課題6(テーマ:IF文の使い方)
1, 2, 3, 4 のいずれかの値を取る3つの乱数 x, y, z を同じ行に表示させ,さらに
  • x=y=z=1 のときは「大当たり!!!」,
  • x=y=z≠1 のときは「当たり!!」,
  • x, y, z のうち2つだけが一致したときは「惜しい!」,
  • 上記以外の場合は「残念でした」
と表示するプログラムを作成せよ(カギ括弧は不要).ただしELSEIF文を用い,IF文およびEND IF文は1回で済ませること.またIF文,ELSEIF文に記述する条件は極力不要なものを排し,必要最小限となるようにすること(ファイル名:kadai06a.BAS).

注意とHINT
  • RND関数およびRANDOMIZE文の使い方を再確認すること.
  • まず3つのLET文で変数 x, y, z にそれぞれ乱数の値(4つの値からランダムに選ばれたもの)を代入.次にPRINT文でそれらを表示.
    • IF文以降を記述する前に何度か実行させ,x,y,z の値が想定通りに表示されることを確認すること.
  • ANDOR の使い方を再確認せよ.
    • ★BASICでは「a=b=c」「a<b<c」のように複数の等号・不等号を含む式は認識されませんが,それぞれ「a=b AND b=c」「a<b AND b<c」のように記述することができます.
    • 1つのIF文・ELSEIF文の中でANDORを複数組み合わせて複雑な条件を記述することもできます.
    • ANDとORを同時に用いる場合,カッコが無ければANDが優先されますが,わかりにくいので必ずカッコを用いること (ただし kadai06a.BAS についてはANDとORの組み合せを用いずに記述できます).
  • 【重要】必ず繰り返し実行させ(F9を使うと楽), すべてのパターン で正しく表示されることを確認せよ.
    • 「すべてのパターン」としては,まず「大当たり」「当たり」「惜しい」「残念でした」の4パターンがありますが,厳密に調べるなら,さらに
      • 「当たり」については x=y=z=2,3,4 の3通り
      • 「惜しい」については,x=y≠z ,y=z≠x ,z=y≠x の3通り
      のケースについてチェックする必要があります.次項以下に挙げた方法も試してみること.
    • IF文のテスト用に,PRINT文の前に「INPUT x,y,z」という行をを挿入して実行してみるのが1つの方法(提出前に削除するのを忘れないように).
    • 何度も実行する代わりに,全体をFOR〜NEXT構文に入れて1回の実行で100〜200回程度繰り返すようにする方法もあります(提出前にFOR文,NEXT文を削除するのを忘れないように).
  • 【重要】ELSEIF文の役割を正しく理解することが大きなポイント.IF文・ELSEIF文による"場合分け"が正しく機能していることが確認できたら,IF文・ELSEIF文において記述する条件が必要最小限になっているかどうかもよく確認すること.
    • ELSEIF文を用いた記述は,IF〜END IF構文が2重になった構造 を書き換えたものであることに注意してください(例26およびその解説参照). すなわち,ELSEIF文に記述された条件は単独で作用するのではなく,より前の行に出てきたIF文・ELSEIF文に記述された条件の影響を受けることになります.
    • ★★「当たり」の条件が必要最小限になっていないケースがよく見られますので、特に注意深く考えてください.

[発展1]【グラフィックスの応用】 kadai06a.BASに付け加える形で,「大当たり!!!」のとき ◎(二重の同心円),「当たり!!」のとき ○(円),「惜しい!」のとき △(正三角形),「残念でした」のとき ×(交差する2つの線分)をグラフィックスとして表示させるプログラムを作成せよ(ファイル名:kadai06b.BAS).
  ★ PLOT LINES文の使い方をあらためて確認するのは当然ですが,◎や△の描き方は複数考えられます.工夫してみましょう.

[発展2] kadai06a.BASを「IF 条件 THEN 単純実行文」の形のIF文を4つ用いて書き換えよ(ファイル名:kadai06c.BAS).
  ★IF文の2つの形式の区別を再確認すること!
  ★「IF文の書き換え」に関する問題は過去の試験で何度も出題されています.条件の記述がどう変わるかをよく確認してください!


[発展3] kadai06a.BAS の一部を,2重の IF〜ELSE〜END IF構文 を用いて書き換えることにより,条件の記述がよりシンプルになるように せよ(ファイル名:kadai06d.BAS).

  • HINT:「大当たり」と「当たり」は 条件「x=y=z」 が共通なので,まず「"大当たり"または"当たり"」に該当するケースを抽出し,さらにこれを「大当たり」と「当たり」に分けましょう
    • 2重の IF〜ELSE〜END IF構文 を用いて場合分けを行うことにより,ELSEIF文は結果的に1つ減ります(「惜しい」以下の場合分けの記述は同じでよい).
    • 元の課題は「ELSEIF文を使う練習」の側面がありました。こちらは同一条件の部分をまとめているため,より自然な場合分けになります.

[発展4] 11, 44, 77 のいずれかの値を取る4つの乱数 x, y, z, w を同じ行に表示させ,さらに

  • x=y=z=w のときは「 (^o^) 」,
  • x, y, z, w のうち3つだけが一致したときは「 (-_-) 」,
  • 上記以外の場合は「 orz 」
と表示するプログラムを作成せよ(カギ括弧は不要).(ファイル名:kadai06e.BAS).
  • HINT:こちらは kadai06a.BAS と異なり,AND と OR を組み合わせた条件を記述する必要があります.

[考察課題] 「大当たり」「当たり」「惜しい」「残念でした」「 (^o^) 」「 (-_-) 」「 orz 」となる確率をそれぞれ求めてみましょう.



JUMP → TOP   (再)                     10



プログラミング課題7(DO〜LOOP)
RND関数を使って発生させた 3桁の整数 n を当てるゲームを作れ. ゲームの進行は以下の通りとする:
  1. コンピュータが 3桁の整数(100〜999) n をランダムに生成(表示はさせない).
  2. 「3桁の整数(100〜999) n を当ててください」と表示.
  3. 解答者はキーボードで整数 x を入力(INPUT文を使用),
  4. コンピュータは x と n を比較し,以下のいずれかの処理を行う:
    • x > n なら「n はもっと小さい数です。再入力してください。」と表示してゲームを継続( 3. に戻り,x を再入力),
    • x < n なら「n はもっと大きい数です。再入力してください。」と表示してゲームを継続( 3. に戻り,x を再入力),
    • x = n となったら ループ(繰り返し)を抜けて 5. に進む.
    (すなわち x = n となるまで 3.〜4. を繰り返す)
  5. 「正解です!」と表示して,ゲーム終了.
ただし,以下の条件を満たすこと.
  • (DO UNTIL/WHILE〜LOOPを使う方法も考えられるが) DO〜LOOPEXIT DO の組み合わせを用いる.
  • ELSEIF文を用い,IF文およびEND IF文は1回ずつ で済ませる(すなわち2重のIF〜END IF構文や「IF 条件 THEN 単純実行文」の形は使わない).
  • 繰り返す必要のない処理(1回のゲームの中で1度しか行わない処理)は,EXIT DOを除き,ループの中に入れない.
保存時のファイル名はkadai07a.BAS.

注意とHINT
  • 「値が "正解" となるまで入力を繰り返す」という構造は テキストの例33と同じ なので,これを参考にしてください.
    • ★ただし例33では「IF 条件 THEN 単純実行文」の形が使われているので,IF文の構造は変える必要があります
  • 「3桁の整数」とは言い換えれば,「100以上999以下の整数」です。kadai04b.BAS との関連も確認すること.
  • 実行するたびに異なる乱数が出るよう,RANDOMIZE文を忘れないこと.
  • n は「正解」に相当する値なので,表示させません!動作の確認のために,以下のいずれかを行ってください.
    • 動作確認用に,最初は n の値を表示させるための PRINT文を挿入 しておく(提出前に削除するのを忘れないこと).
    • ステップ実行を行い,Debugウィンドウで n の値を確認しながら動作をチェックする.
  • 繰り返し実行して結果を確認するのは当然ですが,このプログラムでは普通に実行しただけでは正しく動作しているかどうかがわかりにくいので,必ずステップ実行を用いて途中経過を確認すること.

[発展1] カウンターとなる変数を用意して x の入力回数をカウント(初期値を設定し,INPUT文を繰り返すごとに+1)し,正解時に「○回かかりました」と表示させるように改良せよ.(ファイル名:kadai07b.BAS)

[発展2] 「IF 条件 THEN 単純実行文」の形(END IF文を伴わず1行で完結)を,全体もしくは部分的に用いて,プログラムを書き換えよ.(ファイル名:kadai07c.BAS,kadai07d.BAS)

  • 【注意1】例33でも「IF 条件 THEN 単純実行文」形のIF文が使われていますが,あくまで「IF〜ELSEIF〜ELSE〜END IF」形が基本です.違いをはっきり認識し,混乱しないように!
  • 【注意2】「IF文の書き換え」に関する問題は過去の試験で何度も出題されています.

[発展3] kadai06a.BASにDO〜LOOP構文を追加し,「大当たり」が出るまでx,y,zの値および対応する文字列(「当たり」「惜しい」「残念でした」)を繰り返し表示するプログラムに書き換えよ(ファイル名:kadai06f.BAS).

[考察課題] このゲームを"最良"の手順で解いた場合,最大(すなわちもっとも運が悪い場合でも)何回以内の入力で正解に辿り着くか?

  • HINT 「なるべく回数を減らすにはどのような "戦略" を取ればよいか」 を考えましょう.



JUMP → TOP   (再)                     10



プログラミング課題8(配列)
MAT INPUT文(テキスト3.3.6例41参照)により 配列 a(1), a(2), … , a(10) に入力された10個の値について,それらの 平均,分散,標準偏差,不偏分散およびその平方根 を順に計算し表示するプログラムを作成せよ. ただし和を求める際はFOR〜NEXT構文を用いること.(ファイル名:kadai08a.bas)

注意とHINT
  • 使う公式は課題2と同じですが,配列およびFOR〜NEXT構文を使用することにより生じる違いに注意しましょう.
  • プログラムは段階的に作成すること!
    1. まず s1 = a(1)+a(2)+ … +a(10) を FOR〜NEXT構文 を用いて計算.
      • テキスト2.3.2例3の 数列の和の計算 を参考に(a(1), … , a(10) を数列と見なし,1つずつ足していけば良い).
      • s1 の初期値を LET文で与えること(例3と同様).
      • FOR〜NEXT構文の制御変数は i とせよ(チェックする際の見易さのために統一).
    2. 平均 m を計算して表示させるプログラムを作成し,これを実行して平均が正しく計算されることを確認
    3. 次に s2 = Σ1≦i≦10 ( a( i ) - m )2   を FOR〜NEXT構文 を用いて計算.
      • (a(1)-m)2, … , (a(10)-m)2 を数列と見なし,1つずつ足していけば良い.
      • s2 の初期値も LET文で与えること(例3と同様).
      • FOR〜NEXT構文の制御変数はこちらも i とせよ(チェックする際の見易さのために統一).
    4. s2 を用いて分散等も計算・表示させ,実行結果を確認
      • 平方根を求める際には 組込関数SQR を用いること.
  • 必ず何パターンかの a(1), a(2), … , a(10) の値を入力して実行し,正しく計算されることを確認すること.
    • 「どんな値を入力すれば楽にチェックできるか」ということを考える作業も重要です.
    • ★たとえば a(1) = … = a(5) = 1, a(6) = … = a(10) = 7 のとき,平均・分散・不偏分散の値は?(←暗算できるはず!)
    • 余裕があれば,Excelの関数(AVERAGE, VAR.P, STDEV.P, VAR.S, STDEV.S)を用いて同じ計算を行い,計算結果をチェックしてみましょう.

[発展] 初めに INPUT文 でデータの個数 n を入力させ,さらに MAT INPUT文 で入力された n 個の値 a(1), a(2), … , a(n) について,同様の計算・表示を行うプログラムを作成せよ. (ファイル名:kadai08b.bas)



JUMP → TOP   (再)                     10



プログラミング課題9(配列の応用)

RND関数を用いて 0, 1, 2, ... , 9 のいずれかの値がランダムに与えられた4つの添字付き変数 a(1), a(2), a(3), a(4) と,MAT INPUT文により入力された b(1), b(2), b(3), b(4) に対し, a(i)=b(i) が成り立つ i の個数 h をカウントして, h=4 となるまで「h個一致しました」と表示させ,h=4 となったら「おめでとう!」と表示させて終了するプログラムを作成せよ.(ファイル名:kadai09a.bas)


注意とHINT
  • アルゴリズム考察のポイント:
    • FOR〜NEXT構文が使えるところは必ず使うこと.課題6と異なり配列を用いているので,a(1)〜a(4) の値を与える際にもFOR〜NEXT構文が使えます.
    • DO(UNTIL)〜 LOOP構文の中で( h=4 になるまで)MAT INPUT文 による値の入力を繰り返す.
    • 条件「a(i)=b(i)」を i=1,2,3,4 に対してチェックする際に再びFOR〜NEXT構文を使用.
    • カウンター h をリセットする(初期値 0 に戻す)タイミングに注意.
  • 最初は「MAT PRINT a;」を適当な位置に挿入しておき,正解を確認できるようにした上で実行すれば,正しく動作しているかどうかのチェックが楽です(ただしMAT PRINT文は提出前に削除しておくことこと).さらに細かく調べたければステップ実行を利用しましょう.

[発展1] 課題7同様に,正解までの入力回数をカウント・表示させてゲーム性を高めよ(ファイル名:kadai09b.bas).

[発展2] a(1) 〜 a(4) が互いに異なる値となるように,プログラムを改造せよ(ファイル名:kadai09c.bas).

[発展3] さらにプログラムを発展させ,「HIT and BLOW」(有名なゲームなので,各自調べてください)のプログラムを作成しましょう.


JUMP → TOP   (再)                     10



プログラミング課題10(グラフィックスの応用)
FOR〜NEXT構文を用いて,別途提示された図形を描画するプログラムを作成せよ. ただし
  • SET WINDOW文で設定する座標の原点は,ウィンドウの中心となるようにすること.
  • 合同あるいは相似の図形を複数描く場合など,2重のFOR〜NEXT構文が使用できる場合は必ず使用すること.
  • FOR文における制御変数の範囲(「〜TO〜」の部分)は必要最小限とし,描画の重複を避けること.
    【注意】最小限にするのは"範囲"です.制御変数の開始値が最小である必要はありません!)
(ファイル名:左上から順にkadai10a.bas, kadai10b.bas, … とする)

注意とHINT(共通)
  • ★図形は WebClass上にて 順次追加する予定です.
  • ★「注意とHINT」も追加する可能性があるので,繰り返し確認すること.皆さんからの質問も反映させるので,積極的に質問してください.
  • 課題5の「注意とHINT」はこちらにも当てはまりますので,再確認してください.またテキスト「2.6.4 媒介変数表示の曲線」の補足説明も再読してください.
  • 合同な図形を並行移動させて複数表示させる場合,相似な図形を大きさを変えて複数表示させる場合の制御変数の使い方をよく考えましょう.
  • FOR文における制御変数の範囲(「〜TO〜」の部分)が広過ぎて描画が重複しても,見た目は変わらないことが多いので注意せよ.
  • 曲線・折れ線を"切る"ためのPLOT LINESの挿入位置に注意.
  • 図形の向きや 対称性中心の位置にも! ) に注意し, より簡潔な式で 表せるように工夫しましょう.
  • ★★円・多辺形の中心や線分の端点等,特徴的な点はなるべく格子点に配置するようにしましょう(試験問題の図形もそうなっています).
  • 【重要】多辺形を描く問題では,必ずステップ実行で角度の値(COS(*), SIN(*)等の*の値)の変化を確認し,変数の範囲が必要最小限になっているかどうかをチェックすること.
  • プログラムの作成・チェック段階では,途中経過を観察するために,「PAUSE」(一時停止の命令)や「WAIT DELAY」(時間稼ぎの命令)も活用してください(「練習課題1」参照).
    • 特に円を描く場合,ステップ実行では点の移動が細かすぎてチェックしづらいので,これらの命令を挿入することにより途中経過を確認します.使い方の詳細は「ヘルプ」で調べること.
    • それぞれの命令の機能をよく理解し,挿入位置を考えること.
    • WAIT DELAY文では値の大きさで停滞時間が決まります.適切な値は場合によって異なるので試行錯誤が必要.
    • PAUSE文を挿入する場合,その直前にさらにPRINT文を挿入して変数の値を表示させ,値の変化を確認すると,さらにわかりやすいかも(「練習課題1」参照).
    • ただし,以上の PAUSEWAIT DELAY やPRINT文は,あくまで途中経過を観察するためだけに用いるものであり,最終的に描画される図形とは無関係ですから,必ず提出前に削除してください(プログラムの実行時間や見づらさが増すので,添削の際には有害無益です!).
  • (続く)
★★★課題10を始める前に,必ず以下の練習課題に取り組んで,しっかり理解してください!

【練習課題1】 まず以下のプログラムを実行し,途中経過を t の値と共に確認せよ(特に200行270行の関係について,よく理解すること!).
★この図形全体を 10度 回転させるためには,プログラムをどのように変更すれば良いか?(答えは2通り)

100 OPTION ANGLE DEGREES 
110 SET WINDOW -1.5,1.5,-1.5,1.5
120 DRAW grid
130 !!! まず円を描く
140 FOR t=0 TO 360
150    PLOT LINES: COS(t),SIN(t);
160    WAIT DELAY 0.01   ! 時間稼ぎ
170 NEXT t
180 !!! 円の8等分点を順に結び,正8角形を描く
190 SET LINE COLOR 2
200 FOR t=0 TO 360 STEP 360/8
210    PLOT LINES: COS(t),SIN(t);
220    PRINT "t =";t     ! 角度 t の表示
230    pause             ! 一時停止
240 NEXT t
250 !!! 円の8等分点を 3つ目 ごとに結んだ図形を描く
260 SET LINE COLOR 4
270 FOR t=0 TO 360*3 STEP (360/8)*3
280    PLOT LINES: COS(t),SIN(t);
290    PRINT "t =";t     ! 角度 t の表示
300    pause             ! 一時停止
310 NEXT t
320 END

【練習課題2】 以下は「3重丸を描くプログラムを作成せよ」という課題に対する 間違った解答 の例である. このプログラムを修正せよ.

100 OPTION ANGLE DEGREES 
110 SET WINDOW -3,3,-3,3
120 DRAW grid
130 FOR r=1 TO 3
140    FOR t=0 TO 360
150       PLOT LINES: r*COS(t),r*SIN(t)
160    NEXT t
170 NEXT r   
180 END
[参考]変数 r は 「radius(半径)」の頭文字から取っています.


kadai10a

kadai10a.BASに関する注意とHINT

  • 練習課題1をよく理解し,関連を意識すること.

kadai10a

kadai10b.BASに関する注意とHINT

  • kadai10a.BAS および 練習課題1・2 をよく理解し,関連を意識すること.
  • FOR文における,角度を表す制御変数の範囲指定(練習課題1の260行に相当)の間違いが非常に多いので,必ずステップ実行で確認すること!

kadai10c

kadai10c.BASに関する注意とHINT

  • 練習課題2との関連を意識し,全体を何度回転させれば良いかを計算しましょう(目分量でやってはダメ!). すぐにわからなければ,紙に図を描いて考えること!

kadai10d

kadai10d.BASに関する注意とHINT

  • 同じ半径の円を,中心を移動させながら繰り返し描いています.移動は横方向のみ.
  • 対称性を意識し,中央の円を基準として他の円の中心の座標を考えましょう

kadai10e

kadai10e.BASに関する注意とHINT

  • kadai10d.BASと同様に,同じ半径の円を,中心を移動させながら繰り返し描いています.移動は斜め方向なので縦横同時に座標が変化.
  • やはり対称性を意識し,中央の円を基準として他の円の中心の座標を考えましょう
  • 課題5の練習課題を参照し,関連を確認すること! まず中心の位置を格子点上に固定し,後に半径の値を(外接するように)調節すると考えやすいはず.

kadai10f

kadai10f.BASに関する注意とHINT

  • 格子は2組の平行な線分を重ねることによって描けることに注意.
  • 線分はPLOT LINES文において両端の2点の座標を指定するだけで描けることに注意.難しく考えすぎないように!
  • 格子中の平行な線分においては端点の座標が規則的に変化しているので,これをFOR〜NEXT構文の制御変数を用いて表します.
  • 対称性を意識し,中央の線分を基準として他の線分の端点の座標を考えましょう(ただし対称性を気にしないなら,左下の線分を基準とした方が考えやすいかも).

★★★ 続きはWebClass内にアップロードします.★★★



JUMP → TOP   (再)                     10