見出し画像

【擬似言語⑤】最大値 | 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 true


findMax関数を「今後も100点テストだけで使うなら」引数検査を組み込みます。

でも、今後200点満点テストの最高点を見つけたり、そもそも数値(負の数も含む)の最大値を見つける用途にも使いたいなら、checkScore関数を新設して使います。

if (checkScore(data)がtrue)
  findMax(data)
else
  ”データに範囲外の値が含まれています”と表示する
endif

findMax関数を純粋に、配列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は全て無料提供を続けます▼ もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ

この記事が参加している募集