メインコンテンツへスキップ
見出し画像

【擬似言語④】平均 | 個数のカウント(基本情報技術者, 科目B, アルゴリズム)

    このNoteでは、>前回の合計値Note を流用して平均値算出をテーマにします。新たな学びは「個数カウントの2方式」「配列による汎用性」です。

    テキストの基礎を生かして、プログラム的な考察/工夫を学んでいきます。基礎と実用にギャップを感じる方のために作りました。
    >【FEB】擬似言語の教科書Note

    ぜひ一緒に学習を進めていきましょう!


    このNoteは、私がIT専門学校で授業したことを基に作成しています。IT専門学校でFEは第一目標として、カリキュラムが構築されています。何も知らずに入学しても、1年生10月にはFE合格していきますよ。実績ある教育ノウハウを詰め込んだので、少しでも信頼して頂けたら嬉しいです。

    >全Noteへのリンク(FE節)
    ※科目Aのテーマ別/科目B/旧FE午後など沢山作りました!


    合計+個数で平均へ

    「平均 = 合計 ÷ 個数」なので、合計計算は >前回Note をそのまま流用して、個数数えて割り算する部分を追加します。

    〇calcAve(整数型: startNum, 整数型: endNum)
      整数型: sum ← 0
      整数型: count
      整数型: i
      実数型: average
    
      for (i を startNum から endNum まで 1 ずつ増やす)
        sum ← sum + i
      endfor
    
      count ← endNum - startNum + 1
    
      average ← sum / count
    
      average を表示する

    「sum←0」の初期化、個数算出式「endNum - startNum + 1」が計算の肝でしたね。


    なお、sumを残す必要がないなら
    「average ← sum / count」を
    「sum←sum / count」としても構いません。
    sum(合計)に平均値(average)が入るのが若干気持ち悪いですけど。

    とはいえ「average ← average + i」も気持ち悪い。
    私だったら「result ← result + i」「result ← result / count」にするかもですね。resultは「結果」って意味。

    まぁこのままで良いでしょう。変数が1個増えた程度のメモリ容量増を節約するほどひっ迫してませんので。




    方式1 | 個数の算出式

      count ← endNum - startNum + 1

    「endNum - startNum + 1」の「+1」に注意。

    個数や差は、必ず簡単な数値で指折り数えてください。

    「1から3だったら、1, 2, 3で3個だな」と。「簡単!当然」と思うかもですが、「じゃぁ-1から1の時はすぐ分かりますか?」。-1, 0, 1の3個。1-(-1)+1=1+1+1=3個。

    私が担任してきたIT専門学生さんも、ついつい暗算や思い込みで良く間違えます。

    暗算/思い込みを過信せず、毎回指折り/メモに書き出す慎重さが重要です。




    方式2 | 個数=ループ回数

    ループ回数を数えて、個数をカウントする方法もあります。

    〇calcAve(整数型: startNum, 整数型: endNum)
      整数型: sum ← 0
      整数型: count ← 0
      整数型: i
      実数型: average
    
      for (i を startNum から endNum まで 1 ずつ増やす)
        sum ← sum + i
        count ← count + 1
      endfor
    
      average ← sum / count
    
      average を表示する

    ループ内で計算すると同時に、回数も数えるので確実です。「1回目の足し算、2回目の足し算…」って。


    もしforループの「1ずつ増やす」が「2ずつ」になると式「endNum - startNum + 1」って数式が通用しなくなりますね。

    「だったら直接数えれば良い」って考え。「count+1」分だけ処理回数は多くなりますが、私の好みです。


    あと「 整数型: count←0」は見落としてませんよね?

    ループ内。i=1の時にcount←count+1でcount=1になりたい。

    うっかり「count」って初期化しなかったり、「count←1」にしたら不具合でますよ。

    「sum」と同じく、ループ前に初期化が必要です。

    「自分 ← 自分+1」を使う時は必ず初期化するって思っても良いかも。




    方式3 | 配列で汎用性アップ

    現状「1, 2, 3…」みたいなキレイな値しか計算できません。

    >前回のNote と同じでデータ配列を引数に入力してもらうように改良します。配列は次回も使います。>【擬似言語⑤】最大値 | 1番目データで初期化のNote

    データが配列dataで引数に与えられるので、任意の「1, 5, 11…」のデータにも対応できる関数になりました。

    〇calcAveArray(整数型の配列: data)
      整数型: sum ← 0
      整数型: i
      実数型: average
    
      for (i を 1 から dataの要素数 まで 1 ずつ増やす)
        sum ← sum + data[i]
      endfor
    
      average ← sum / data0要素数
    
      average を表示する

    「average ← sum / dataの要素数」は「average ← sum / i」でもOKです。

    個人的な話。私はfor文は「iを1から~」で組みます。いつも同じにしたいし、個数が必要になった時にそのまま「i」を使えるので。「i を startNum から endNum まで~」と、直接使うのは、あんまりやりたくないです。個人的な好みですが。




    汎用性と使用性

    calcAveArray関数を呼び出す側の話。「calcAveArray(整数型の配列: data)」を使うにはデータの準備が必要ですね。

    関数の引数に配列要素を入れる形。

    calcAveArray({1, 5, 11, 100, 300})

    データを配列に入れて、引数に配列を入れる形。

    整数型の配列: dataArray ← {1, 5, 11, 100, 300}
    calcAveArray(dataArray)

    私は後者が好き。dataArrayの要素を編集する時に関数をうっかり編集しなくて済むし。関数の引数をdataArrayから別配列に変更するだけで、別データの入力ができるので。

    整数型の配列: dataArray  ← {1, 5, 11, 100, 300}
    整数型の配列: dataArray2 ← {2, 4, 8}
    calcAveArray(dataArray)
    calcAveArray(dataArray2)


    一方で、1ずつ増える等間隔なら、配列化前のcalcAverage関数の方が楽。

    calcAveArray({1, 2, 3, 4, 5, 6})
    calcAvege(1, 6) / ←こちらが楽

    要は目的と汎用性のバランス。”必要”な機能が”確実”に動く関数を作るだけですね。




    まとめ

    お疲れ様でした!

    今回は、>前回 の「合計計算」を「平均計算」に流用して、「個数のカウント」を考察しました。さらに、引数を設けたり、配列に対応して、実用性を高めました。

    次回は、今回のfor文と配列を生かして、最大値を求める擬似言語をテーマにします。>【擬似言語⑤】最大値 | 1番目データで初期化のNote


    2つ「試験に出ないから、やらなくて良い課題」も出しておきます。このNoteで気になった方向け。

    • 課題1:「calcAveArray(整数型の配列: data)」を「実数型の配列:data」に対応させて下さい。すぐ終わりますね。

    • 課題2:「平均 = 合計 ÷ 個数」を「平均 = 加重合計 ÷ 重みの合計」に対応させて下さい。引数は「整数型の配列: data」と「整数型の配列: weight」。まぁ実数でも良いですけど、検算が面倒なので整数で。
      ヒント:>【FE計算②】表は×て+すNote
      ヒント:>【AP計算㉛】加重平均のNote
      答え:>【擬似言語④裏】加重平均のNote

    •  課題3:分散を計算する関数「〇実数型: calcVarianceArray(整数型の配列: data)」を作って下さい。平均を計算する関数「〇実数型: calcAveArray(整数型の配列: data) 」を使って構いません。分散の数式は調べてください(wikipedia)。>答えのNote(準備中*)

    課題2はヘビィですよ。解説はLv3かLv4のシリーズかなぁ。>【擬似言語④裏】加重平均 | 2つの配列で計算の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。 学生時代にITパスポート試験・基本情報技術者試験・応用情報技術者試験を独学で高得点合格。情報処理安全確保支援士試験(セキスペ)・データベーススペシャリスト試験・ネットワークスペシャリスト試験・G検定なども取得。 2027年にPD-S受験予定。