3 アルゴリズムの記述
3.1 If 〜 end if構文とIF文
(テキストの該当箇所を右に表示)
【要点】条件によってアルゴリズムを分岐させるときは IF〜END IF構文 を用いる.
IF文に書かれた条件を満たすときはIF文の直後に書かれた内容を実行し,満たさないときはその部分は飛ばしてELSE文以下を実行する(ELSE文がなければEND IF以下へ).またアルゴリズムをさらに細かく分岐させるためにはIF〜END IF構文を2重,3重に用いる方法や,ELSEIF文を使う方法がある.
さらにEND IF文を伴わない特殊な記述法もある(3.1.3参照).
|
3.1.1 IF 〜 ELSE 〜 END IF
- 2次方程式の解の公式,判別式を思い出せ!
- 例25のプログラムを入力・実行し,結果を確認せよ.正しく計算されることを確認するために,ax2+bx+c=0 が簡単な解(整数解など)を持つようなa,b,cの値を入力してみること.また重解を持つ(判別式D=0となる場合)ようなa,b,cの値も入力し,同じ値が2つ表示されることを確認せよ.
- テキストの解説をよく読んで,IF〜END IF構文の基本的な使用法を理解せよ.
- IF文(「IF 条件 THEN」の形) と END IF文 が対になる構造が原則です!(後述の3.1.3の記述法は例外的)
3.1.2 IF 〜 ELSEIF 〜 ELSE 〜 END IF
- 例25のプログラムをテキストの「たとえば」以下のように書き換えて,「ex25a.bas」として保存せよ.さらに,方程式が重解を持つようなa,b,cの値を与えて実行し,解が1つしか表示されなくなったことを確認せよ.
[注意]プログラムの構造に合わせて インデント が2段階になっていることに注意.これまでと同様,インデントはプログラムを実行すると自動的に行われるので入力時には必要ないが,2重構造をよく理解しながら入力すること.
- ex25.BASとex25a.BASの違い(ELSE文以降)に注目し,IF〜END IF構文を2重に用いる方法を理解せよ.
- 例26のプログラムを入力・実行し,重解の場合も含めてex.25a.BASと同じ結果となることを確認せよ.
- ex25a.BASと例26のプログラムを比較し,ELSEIF文の使用法を理解せよ.
★ELSEIF文を用いることにより IF〜END IF構文 の2重構造が 見かけ上 解消されますが,論理構造は変わっていません.
★以上,すべてIF文(「IF 条件 THEN」の形)とEND IF文が対をなす構造であることに注意.
★ELSEIF文は必ず 「 ELSEIF 条件 THEN 」 の形で記述され,対応するIF文(「IF 条件 THEN」の形) と END IF文 に挟まれる.
3.1.3 IF文
ここで説明されている END IF文 を伴わない記述法は,文法上は例外的です(ただし使用頻度は少なくない).
通常の IF〜ELSE〜END IF構文 とはしっかり区別して理解すること.
- 2種類のIF文の区別・使い分けで混乱する人が毎年多いので,よく注意してください.
★THEN の直後で改行しているかどうかが区別のポイントです.
- THEN の直後で改行していれば,対応する END IF文 が存在 ( こちらが原則,常に使える ).
- THEN の後も改行せずに続いていれば,END IF文 を伴わず1行で完結する形式 ( こちらは例外的,使えるケースが限られる ).
- ex25.BASをテキストのように書き換えて,「ex25b.BAS」として保存せよ.さらに,a,b,cに適当な値を与えて実行し,結果を確認せよ.
- テキストをよく読み,ex25b.BASの第30行の記述法を理解せよ.
[注意]プログラムは全体としての論理構造の簡潔さ・わかりやすさ が重要であり,必ずしも行数が少ない方が良いとは限らないので,ex25b.BASがex25.BASより優れているわけではありません.
3.1.4 条件の書き方
- テキストの解説をよく読んで,AND, OR, NOT などを用いた複雑な条件の書き方を理解せよ.特に 最後の2行に注目.条件「a<x<b」はプログラム中では「a<x AND x<b」と2つに分けて書く必要がある!(そもそも本来,「a<x かつ x<b」を簡略化した書き方が「a<x<b」である)
- 例27のプログラムを入力・実行し,結果を確認せよ.計算過程の確認のためにステップ実行も利用すること.
- 特に第30行のMOD関数(→2.5.4)とORの使い方を理解すること.
- 例27の40行と50行の間に「45 PRINT n,t」を挿入して実行し,変数tに「3または8で割り切れる数」が加算されていく様子を観察せよ.
- さらに(45行を挿入したまま)30行のORをANDに書き換え,結果を予想してから実行し,結果を確認せよ.
- 例27の第40行は単純実行文なので,30-50行を「IF 条件 THEN 単純実行文」の形(3.1.3で出てきたEND IF文を伴わず,1行で完結する形)で記述することもできます.
3.1.5 ピタゴラス数
- まずテキストの解説を読んでピタゴラス数の意味を理解せよ.次に例28のプログラムを入力・実行し,100以下のピタゴラス数が正しく表示されることを確認せよ.
- 第10行と第20行の文末をいずれも「TO 5」と書き換えた後,ステップ実行により,計算手順と各変数の変化を観察せよ(ピタゴラス数(x,y,z)=(3,4,5)が表示されるまで続ける).FOR〜NEXT構文が2重になった構造を理解すること.
- 例28の第40行は「IF 条件 THEN 単純実行文」の形(3.1.3で出てきたEND IF文を伴わず,1行で完結する形)になっていることに注意.
[練習課題](2種類のIF文の確認)
- 例27の第30-50行を「IF 条件 THEN 単純実行文」の形で(すなわち1行で)書き直せ.
- 例28の第40行を通常の IF〜END IF構文 で(すなわち3行で)書き直せ.
|
第6回の範囲はここまで.プログラミング課題6を提出し,「OK」の返信を確認したら終了.
.
課題のページを表示.
3.2 DO〜LOOP
(テキストの該当箇所を右に表示)
【要点】DO (WHILE/UNTIL)〜LOOP構文では DO (WHILE/UNTIL)文とLOOP文で挟まれる部分の処理を繰り返す.ループ(繰り返し)の回数は事前には決まっておらず,どこでループを止めるかはWHILEまたはUNTIL以下の条件を満たすかどうかで決まる.またEXIT DOを使えば途中でループを抜けることもできる.
|
3.2.1 DO〜LOOP
例29のプログラムを入力・実行し,結果を確認せよ.適当なところでプログラムを中断させること(テキストの[補足]を参照).
3.2.2 DO WHILE〜LOOP
- 例30のプログラムを入力・実行し,結果を確認せよ.
- テキストの指示に従って例30の第20行を書き換え,結果の違いを確認せよ.
3.2.3 DO UNTIL 〜 LOOP
- 例31のプログラムを入力・実行し,結果を確認せよ.
- 例30と例31の実質的な内容がまったく同じになる理由を理解し,「DO WHILE〜」と「DO UNTIL〜」を NOT を使わずに いつでも書き換えられるようにしておくこと.
3.2.4 素因数分解
- MOD関数の機能と使い方を再確認せよ(2.5.4参照).
- 例32のプログラムを入力・実行し,結果を確認せよ(最初小さい値から試し,徐々に大きな値,約数の多い値で計算させる).
- どのような順序で処理が行われるかをステップ実行で確認し,2重ループの構造を理解せよ.
3.2.5 EXIT DO
- 例33のプログラムを入力・実行し,結果を確認せよ.
- アルゴリズムを確認し,EXIT DOの役割(ループを抜ける)を理解せよ.
- 【重要】例33の第40行は「IF 条件 THEN 単純実行文」の形(END IF文を伴わず,1行で完結する特殊な用法)であることに注意.
- 「IF 条件 THEN 単純実行文」の形は常にIF〜END IF構文で書きなおすことができます.すなわち,例33の第40行は
[各自考えてください(習課題1)]
と 3行で 書きなおすことができます.
- さらに第40-50行をまとめて,以下のように「IF〜ELSE〜END IF」の形で
[各自考えてください(練習課題2)]
と 5行で 書きなおすこともできます
(条件を 満たす/満たさない 場合それぞれの処理が明確になるため,こちらの方が自然かも).
第7回の範囲はここまで.プログラミング課題7を提出し,「OK」の返信を確認したら終了.
課題のページを表示.
3.2.6 基底の変換→省略
3.2.7 ユークリッドの互除法→省略
3.3 配列
(テキストの該当箇所を右に表示)
【要点】 DIM文を使うと,配列(添字付き変数の集合)を定義することができる.たとえば「DIM A(10)」で10個の添字付き変数 A(1),A(2),…,A(10)が定義される.カッコ内が添字で,ここに変数や数式を入れることもできる.またMAT文を用いると配列を一括して扱うことができる.
|
3.3.1 DIM文
- テキストの解説をよく読み,プログラムを入力・実行して(必要と思えば適当なファイル名を付けて保存せよ)DIM文の使い方,添え字付き変数の意味をよく理解せよ.
[注意]「B1」などカッコ無しで変数名の一部として使われている数字は添え字としては扱われない(単なる「変数名の一部」).
- 例36のプログラムを入力・実行し,結果を確認せよ(漸化式の意味を理解し,フィボナッチ数列が正しく計算されていることを確認).
3.3.2 分布表を作る
- テキストの解説をよく読んで,DIM文における添字の範囲の指定の仕方,「MAT 〜 =ZER」の使い方を理解せよ.
★配列で与えられた変数に,1つ1つLET文で 0 を代入する代わりにまとめて代入する記述法です(省略しても初期値は 0 となるが,初期値の明示のために記述しておく).
- 例37のプログラムを入力・実行し,結果を確認せよ.さらにプログラム内容をよく理解すること.特に以下の点に注意.
- DIM文,「MAT 〜= ZER」の使い方を確認.
- 変数 m( i ) は「( 10×i )点以上 (10×i + 9)点以下」の点数を取った人を数えるカウンタの役割を果たしており,第150行で点数 n を対応する添字 i (= n の10の位の値)に変換,第160行で対応するカウンタ m( i ) に1を加えてカウントしている.
- 第140行の EXIT DO の使い方
- 第190行のようなPRINT文の複雑な使い方(セミコロンとカンマの役割を再確認!)
- 例38のプログラムを入力して複数回実行し,結果を確認せよ.テキスト通りだと,RNDで与えられる乱数が固定されているので,何回実行してもまったく同じヒストグラムになることに注意.
- 例38のプログラムの内容をよく理解せよ.特に以下の点に注意.
- 第120行〜180行ではFOR〜NEXT構文が二重になっている.第140行〜160行で10個のサイコロの目の和を計算し,さらに外側のFOR〜NEXTでそれを10000回繰り返している.
- 第150行のINT関数,RND関数の使い方を再確認せよ.
- 変数tは10個のサイコロの目の和を表す.和がtとなる回数を示すカウンタがA(t)で,第170行でカウントしている.
- 第190行のSET WINDOW文の引数が「9,61,0,1000」となっている理由を確認せよ(9=10-1, 61=60+1 である).
- ヒストグラムの折れ線の書き方(第200行〜220行)を理解せよ.第210行は高さ A(t) の位置に幅1( t を中心に±0.5)の水平な線分を引いている.
★行末のセミコロンを削除して実行し,この線分を確認すること.
- 例38のプログラム冒頭にRANDOMIZE文を入れて再び複数回実行し,(概形は同じだが)毎回異なるヒストグラムが得られることを確認せよ.
- [統計学]統計の教科書やネット検索で中心極限定理について学習し,ヒストグラムの概形が正規分布の密度関数のグラフに似た形になる理由を理解せよ.
- 例38を書き換えてシミュレーションの回数を1/10〜10倍程度に増減させて結果を比較せよ.繰り返しの回数を変更する(第120行)だけでなく,第190行でウィンドウの縦方向のサイズを調節するすること.
★3.3.3〜3.3.5は試験範囲外ですが,3.3.6は試験範囲です.
3.3.3 エラトステネスのふるい→省略
3.3.4 配列宣言→省略
3.3.5 2項係数(パスカルの三角形)→省略
3.3.6 MAT文(★試験範囲)
- 例41のプログラムを入力・実行し,結果を確認せよ.さらにテキストをよく読んでMAT INPUT文, MAT PRINT文の使い方を理解せよ.
- 例41のMAT PRINT文をFOR〜NEXT構文を使って書き換え,ex41aとして保存せよ.同じ実行結果になることを確認し,MAT PRINT文の役割を理解すること.
- 例42のプログラムを入力・実行し,結果を確認せよ.さらにMAT READ文およびDATA文の使い方を理解せよ.
- 例42のプログラムにおいて,最小数を求めるアルゴリズム(第40行〜70行)を理解せよ.
★60行と70行の間に「65 print i;a(i), k;a(k)」と挿入し,表示される値を観察しましょう.
- 例42は例41のようなFOR〜NEXT構文を使った書き換えはできないことに注意(書き換えるとしたらLET文をデータの数だけ並べるしかない).
★平成25年度の試験範囲はここまで.
課題のページを表示.
試験に関する注意(2013年度版)
3.3.7 整列(選択ソート)
- 例43のプログラムを入力・実行し,結果を確認せよ.ソート(整列)が正しく行われることを確認するためにいろいろな順序で数値を与えてみること.
[注意] 「 ! 」以降は行末注釈(テキスト参照)なので入力する必要はない.
- テキストをよく読んで,選択ソートにより数値を大きさの順に並び替えるアルゴリズムを理解せよ.
- 第210行のMAT PRINT文を適当な位置(FOR〜NEXT構文の中)に移動させ,ソートの途中経過が表示されるようにせよ.
- さらにソートの途中経過をよく観察し,選択ソートのアルゴリズムを確認せよ.ソートの途中経過を,プログラムを実行させる前に自分で予想して書けるようにしておくことが望ましい.
試験範囲はここまで.
BACK