【擬似言語⑤】最大値 | 1番目データで初期化(基本情報技術者, 科目B, アルゴリズム)
このNoteでは、>前回のNote でのデータ配列を引数で受けて、最大値を求める擬似言語をテーマにします。前回学んだ「初期値」と「引数」への検査を新しく考察します。
テキストの基礎を生かして、プログラム的な考察/工夫を学んでいきます。基礎と実用にギャップを感じる方のために作りました。
>【FEB】擬似言語の教科書Note
ぜひ一緒に学習を進めていきましょう!
このNoteは、私がIT専門学校で授業したことを基に作成しています。IT専門学校でFEは第一目標として、カリキュラムが構築されています。何も知らずに入学しても、1年生10月にはFE合格していきますよ。実績ある教育ノウハウを詰め込んだので、少しでも信頼して頂けたら嬉しいです。
>全Noteへのリンク(FE節)
※科目Aのテーマ別/科目B/旧FE午後など沢山作りました!
バグを見つける復習
「学級の100点満点のテスト結果から、最高得点を決める」擬似言語を作ってみます。学生さんの点数を配列dataで関数に渡します。
〇findMax(整数型の配列: data)
整数型: maxVal
整数型: i
for (i を 1 から dataの要素数 まで 1 ずつ増やす)
if (data[i] > maxVal)
maxVal ← data[i]
endif
endfor
maxVal を表示するバグがある、というか。運が良かったら正しく動くけど、たぶん不具合が発生するだろうな、ってのが分かりますか?
ヒント1。前々回にバッチリ学んでます。>【擬似言語③】合計 | 自己更新式と初期値のNote
ヒント2。私がわざわざ「100点満点」と書きました。
修正版は下記。
〇findMax(整数型の配列: data)
整数型: maxVal ← -1
整数型: i
for (i を 1 から dataの要素数 まで 1 ずつ増やす)
if (data[i] > maxVal)
maxVal ← data[i]
endif
endfor
maxVal を表示するmaxValの初期値「maxVal ← -1」。
「-100」とかでも構いません。100点満点テストは0~100点なので、「あり得ない値を初期値」にすればOK。>【擬似言語③】合計 | 自己更新式と初期値のNote
初期化が必要な理由は、「if (data[i] > maxVal)」。もしmaxValに1000とか入ってたら、一生勝てません。最高得点1000になります。
結果のエラー検出ではダメ
maxValの初期値「maxVal ← -1」を怠る話。
計算結果を検証するテがありました。>【擬似言語②】じゃんけん | 論理演算と数式化のNote
でもダメ。「if(maxVal≧0 かつ maxVal≦100)」を追加してもダメ。
もしうっかりmaxValに99が入ってて、学級(data[])の最高点が70だったら、最高99点って誤った結果を出します。最大値処理前に初期化する必要があります。
入力のエラー検出を誰がやる?
前節で返り値の検査の話が出たので、引数の検査にも考えが及びます。
もし「整数型の配列: data」に、0未満や100より大きい値が入っていたら。入力間違いですよね。
findMax関数内で検査すべきか、別関数checkScoreでも作ってやるべきか迷う所。
○論理型: checkScore(整数型の配列: data)
整数型: i
for(iを1から dataの要素数まで 1ずつ増やす)
if(data < 0 または data > 100 )
return false
endif
endfor
return truefindMax関数を「今後も100点テストだけで使うなら」引数検査を組み込みます。
でも、今後200点満点テストの最高点を見つけたり、そもそも数値(負の数も含む)の最大値を見つける用途にも使いたいなら、checkScore関数を新設して使います。
if (checkScore(data)がtrue)
findMax(data)
else
”データに範囲外の値が含まれています”と表示する
endiffindMax関数を純粋に、配列dataから最大値を見つける機能だけにして、いかようにも使えるようにできます。
小中学校だと100点満点ですが、小テストとか10点満点にすることもありますね。高校だと数/国/英が200点満点ですね。
checkScore100関数とかcheckScore10関数にcheckScore200関数かな。それか引数で、checkScore(0, 100)やcheckScore(0, 200)と指定できるようにするかな。
学校で使うなら、checkScore100関数など専用かな。あらゆる数値範囲を網羅する必要はないし。たかだか100, 200, 10の3種類ぐらいでしょう。あと、引数を間違えたら不都合がでますからね。
まだ初期値がネック
でもまだ「findMax関数を純粋に、配列dataから最大値を見つける機能」になりきってません。
例えば、dataが「-100~-50」の時を考えて見て下さい。
〇findMax(整数型の配列: data)
整数型: maxVal ← -1
整数型: i
for (i を 1 から dataの要素数 まで 1 ずつ増やす)
if (data[i] > maxVal)
maxVal ← data[i]
endif
endfor
maxVal を表示する初期値が「maxVal ← -1」なので、「-100~-50」が全部負けて、最大値-1って結果が出ます。
次節で解決します。
1番目のデータを初期値にする
解決策は「データをmaxValを初期値する」です。
例えば1番目のデータで初期化「maxVal ← data[1]」。forループでの値比べに入ります。一旦、1人目をチャンピオンにして、2人目以降と比べていく方針。
〇findMax(整数型の配列: data)
整数型: maxVal
整数型: i
maxVal ← data[1]
for (i を 2 から dataの要素数 まで 1 ずつ増やす)
if (data[i] > maxVal)
maxVal ← data[i] / チャンピオンの交代 */
endif
endfor
maxVal を表示する初期値はdataからなら、1番目data[1]でなくても、2番目data[2]でも30番目data[30]でも構いません。
でも、data[30]が存在しないこともありますからね。25名学級ならdata[25]まで。敢えてdata[2]やdata[30]を初期値にする意味はないです。むしろ不具合の原因になる。
またforループの「iを2から」が気持ち悪ければ、「iを1から」でも構いません。
〇findMax(整数型の配列: data)
整数型: maxVal
整数型: i
maxVal ← data[1]
for (i を 1 から dataの要素数 まで 1 ずつ増やす) // ←←←変更箇所
if (data[i] > maxVal)
maxVal ← data[i] / チャンピオンの交代 */
endif
endfor
maxVal を表示するi=1の時「if(data[1] > maxVal)」が、実際のところ「if(data[1]>data[1])」って自分と比較する無駄処理が1回増えるだけ。実害はないです。
「ループ前に、とりあえずデータ1個仕込んでおく」って発想は次回も使います。>【擬似言語⑥】線形探索 | 番兵法のNote
まとめ
お疲れ様でした!
今回はまぁまぁ集大成でした。
>④平均のNote での「配列」を基礎に、>③合計のNote で考察した初期値への考慮を再確認。さらに >②ジャンケンのNote での引数/返り値の検査機構も触れました。
>【擬似言語④】平均 | 個数カウントのNote
>【擬似言語③】合計 | 自己更新式と初期値のNote
>【擬似言語②】じゃんけん | 論理演算と数式化のNote
FE合格は勿論。プログラムの工夫や考察を通して、アルゴリズムの思考力、擬似言語の読解力/実現力を鍛えられたらなぁ、と作りました。
このシリーズは、>【FEB】擬似言語の教科書Note の基礎を生かしつつ、考察と次回への布石を追加して「知識のリレー」を繋いでいくように作っています。
以前のNoteを多少忘れても分かるようにも書いてます。
少しでも、基礎から応用/実用への橋渡しがスムーズに行くお手伝いができたなら嬉しいです。
次回は、今回の「ループ前に、とりあえずデータ1個仕込んでおく」を生かして、お目当てのデータを見つける「線形探索法」を学習します。>【擬似言語⑥】線形探索 | 番兵法のNote
今回やって欲しい課題は「最小値を見つける」擬似言語への改良です。
最後に私のお薦めの演習順番。
❶学習前の”分からせ”
>【FEB】サンプル問題2のNote
❷テキスト
>【FEB】擬似言語の教科書Note
>【FEB】擬似言語の理解演習Note ←いまこの辺
↓※必要なら
うかる! 基本情報技術者 [科目B・セキュリティ編](amazon)
うかる! 基本情報技術者 [科目B・アルゴリズム編](amazon)
❸各年度の公開問題
>【FEB】令和07年科目BのNote
>【FEB】令和06年科目BのNote
>【FEB】令和05年科目BのNote
➍解法の総復習(➋や➌と併用可)
>【FEB】擬似言語の11の解法Note
➎模擬試験
>【FEB】サンプル問題1のNote(擬似言語)
>【FEB】サンプル問題1のNote(セキュリティ)
いいなと思ったら応援しよう!
学習方法・問題特集のNoteは全て無料提供を続けます▼
もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼
もちろんコメントでも結構です(・ω・▼)ノシ