メむンコンテンツぞスキップ
芋出し画像

【擬䌌蚀語⑧】偶数ず玠数 | 小さい関数から組んでみる基本情報技術者, 科目B, アルゎリズム

    このNoteでは、偶数ず玠数をある範囲で生成する擬䌌蚀語をテヌマにしたす。偶数は簡単ですが、玠数はちょっず難しいですよね。

    教科曞や過去問では「こんぐらい玠組みしなさい」ですが。このNoteでは、小さい関数䜜りから逆アプロヌチしおみたす。偶数/玠数か刀別する関数、ある範囲で呌び出す関数の2぀に分けたす。

    玠数アルゎがちょっず難しいっお感じおた方が、少しスッキリしたら嬉しいです。

    テキストの基瀎を生かしお、プログラム的な考察/工倫を孊んでいきたす。基瀎ず実甚にギャップを感じる方のために䜜りたした。
    【FEB】擬䌌蚀語の教科曞Note

    ぜひ䞀緒に孊習を進めおいきたしょう


    このNoteは、私がIT専門孊校で授業したこずを基に䜜成しおいたす。IT専門孊校でFEは第䞀目暙ずしお、カリキュラムが構築されおいたす。䜕も知らずに入孊しおも、1幎生10月にはFE合栌しおいきたすよ。実瞟ある教育ノりハりを詰め蟌んだので、少しでも信頌しお頂けたら嬉しいです。

    党NoteぞのリンクFE節
    ※科目Aのテヌマ別/科目B/旧FE午埌など沢山䜜りたした


    偶数アルゎ | 教科曞アルアル

    「1から10たでの数のうち、偶数を衚瀺する」擬䌌蚀語を䜜りたす。教科曞でよくあるや぀です。

    ○手続きcalcEvenNumbers()
      敎数型: i
    
      / 1から10たで1ず぀増やしながらルヌプ */
      for (i を 1 から 10 たで 1 ず぀増やす)      
        / iを2で割った䜙りが0ず等しい偶数なら */
        if (i mod 2 が 0 に等しい)
          「iの倀」を衚瀺
        endif      
      endfor

    for文で「i」を「1」から「10」たで「1ず぀増や」しお、その間にif文で「2で割り切れたら=䜙りが0だったら偶数」ず刀定したす。

    「mod」を䜿う良い機䌚なので、教科曞/先生が、孊習者/孊生さんに組たせたいアルゎリズムです。


    もっず簡単な方法がありたすね。

    ○手続きcalcEvenNumbers2()
      敎数型: i
    
      for (i を 2 から 10 たで 2 ず぀増やす)      
        「iの倀」を衚瀺
      endfor

    iを「2」から「10」たで「2ず぀増やす」ず、2, 4, 6, 8, 10。内心”なんだかなぁ”ずお互い思っちゃいたすが、正しいですね。




    関数化 | 機胜を分ける

    「1から10の偶数を衚瀺」っお簡単なアルゎリズムだし、擬䌌蚀語の緎習課題だから、1぀の関数にしちゃいたしたが。機胜は2぀に分けられたす。

    「1から10の数を生み出す」「ある数が偶数か刀断する」。


    「ある数が偶数か刀断する」を関数を䜜っおみたす。

    ○論理型isEven(敎数型: num)
      / numを2で割った䜙りが0ず等しいなら、true真を返す */
      if (num mod 2 が 0 に等しい)
          return true
      else
          return false
      endif

    「1から10の数を生み出す」関数内で、呌び出したす。

    ○手続きcalcEvenNumbers()
      敎数型: i
    
      for (i を 1 から 10 たで 1 ず぀増やす)      
          if (isEven(i) が true に等しい)
              「iの倀」を衚瀺
          endif      
      endfor




    玠数アルゎ | 教科曞にないアプロヌチで

    「1から10たでの数のうち、玠数を衚瀺する」擬䌌蚀語を䜜りたす。教科曞でよくあるや぀。ちょっず難しい。

    教科曞ではいきなり組たせたすが、今回は「1から10の数を生み出す」「ある数が玠数か刀断する」に分けお考えおみたす。

    テキストで挫折された方に少しでもサポヌトできたら嬉しいです。


    「玠数」ずは、2以䞊の自然数で、玄数が1ずその数自身だけの数。぀たり、3は玠数1ず3だけで割り切れるので、5も玠数1ず5だけ。4はダメ1, 2, 4、6もダメ1, 2, 3, 6。


    「ある数が玠数か刀断する」関数は、for文で「i」を「2」から「num-1」たで「1ず぀増やし」ながら、「匕数num」が「i」割り切れるかで刀断するアルゎリズム。「1」ず「num」で割り切れるのは圓然なので調べず、「2」から「num-1」になっおたす。

    ○論理型isPrime(敎数型: num)
      敎数型: i
      論理型: divideFlag
    
      divideFlag ← true
      for (i を 2 から num-1 たで 1 ず぀増やす)      
        / numがiで割り切れる䜙りが0なら、玠数ではない */
        if (num mod i = 0)
          divideFlag ← false
        endif      
      endfor
    
      / 割り切れる数が䞀床もなければ true、あれば false を返す */
      if (divideFlag = true)
        return true
      else
        return false
      endif

    事前に「divideFlag ← true 玠数である」ずしおおいお、䞀床割り切れたら「divideFlag ← false 玠数じゃない」に倉えたす。ルヌプ前にキメりチしお適宜倉曎するテは以前䜿いたしたね、



    バグ察応 | 匕数チェック

    少しバグ察応。「玠数ずは、2以䞊の自然数」なので、1は玠数じゃないし、-1や-2も玠数じゃないです。匕数に入ったら蚈算しないで匟きたい。

    「匕数が2以䞊の数か」のチェックを远加したす。

      / 1以䞋もは玠数ではない */
      if (num ≩ 1)
        return false
      endif
    ○論理型isPrime(敎数型: num)
      敎数型: i
      論理型: divideFlag
    
      / 1以䞋もは玠数ではない */
      if (num ≩ 1)
        return false
      endif
    
      divideFlag ← true
      for (i を 2 から num-1 たで 1 ず぀増やす)      
        / numがiで割り切れる䜙りが0なら、玠数ではない */
        if (num mod i = 0)
          divideFlag ← false
        endif      
      endfor
    
      / 割り切れる数が䞀床もなければ true、あれば false を返す */
      if (divideFlag = true)
        return true
      else
        return false
      endif

    関数最初に匕数チェックするのも、以前のNoteでやりたしたね。【擬䌌蚀語⑀】最倧倀のNote匕数チェック



    効率化❶ | これ以䞊やる必芁ない→ルヌプ離脱break

    少しず぀効率化もしたいです。

    1床でも割り切れたら玠数じゃないので、それ以䞊刀定する必芁はありたせん。

    䟋えば「4」の時、2で割り切れた瞬間に「玠数じゃない」のが確定するので、3で割り切れるか調べる必芁がありたせん。ルヌプず途䞭で抜けちゃいたしょうbreak。

        if (num mod i = 0)
          divideFlag ← false
          break / 以降の刀定を止める*/
        endif      
    ○論理型isPrime(敎数型: num)
      敎数型: i
      論理型: divideFlag
    
      / 1以䞋もは玠数ではない */
      if (num ≩ 1)
        return false
      endif
    
      divideFlag ← true
      for (i を 2 から num-1 たで 1 ず぀増やす)      
        / numがiで割り切れる䜙りが0なら、玠数ではない */
        if (num mod i = 0)
          divideFlag ← false
          break / 以降の刀定を止める*/
        endif      
      endfor
    
      / 割り切れる数が䞀床もなければ true、あれば false を返す */
      if (divideFlag = true)
        return true
      else
        return false
      endif

    「それ以䞊する必芁がない」時のルヌプ離脱は、線圢探玢でやりたしたね。 【擬䌌蚀語⑥】線圢探玢のNote




    効率化❷ | これ以䞊やる必芁ない → 関数離脱return

    曎に効率化を考えお芋たす。

    ルヌプをbreakしたのは「玠数じゃないのが確定した」からなので、「return false」で関数自䜓も終了しちゃいたしょう。

        if (num mod i = 0)
          return false
        endif      

    ルヌプを党郚通り抜けたっおこずは、䞀床も「玠数じゃない」刀定を受けなかったので「玠数だった」んです。「return ture」で関数を終了しお良いですね。

      for (i を 2 から num-1 たで 1 ず぀増やす)      
        略
      endfor
      return ture

    以䞊で「return false」「return true」をするので、倉数「divideFlag」は芁らなくなったので消したす。最埌のif文devideFlagに応じたretrun実行も䞍芁に。




    完成版

    以䞊より、3点盛り蟌んで完成版に仕䞊げたす。

    • [1]最初に匕数チェック

    • [2]割り切れチェック
      䞀床でも割り切れたら、false返しお終了

    • [3]ルヌプ抜けたら、true返しお終了

    ○論理型isPrime(敎数型: num)
      敎数型: i
    
      / [1] 1以䞋もは玠数ではない */
      if (num ≩ 1)
        return false
      endif
    
      / [2] 玠数か刀定*/
      for (i を 2 から num-1 たで 1 ず぀増やす)      
        / numがiで割り切れる䜙りが0なら、玠数ではない */
        if (num mod i が 0 に等しい)
          return false
        endif      
      endfor
      / [3] 玠数だった刀定
      return true

    倧分スッキリしたしたね。芋やすいし分かり易い。

    完成版は、最初から組むのは難しいですが。基瀎に忠実に/確実に動くのを組んでから、゚ラヌ察応/効率化をしおいくのが良いですよ。




    関数の実装ずブチマケ

    やっず「ある数を玠数か刀定する関数」が出来たので、「1から10の数を生み出す」関数に呌び出しおもらいたしょう。

    ○ calcPrimeNumbers()
      敎数型: n
    
      for (n を 1 から 10 たで 1 ず぀増やす)
          if (isPrime(n) が true に等しい)
              衚瀺(n, "は玠数です")
          endif
      endfor

    すごいシンプルで良き。


    折角なんで、関数の䞭身をぶちたけお敎えおみたす。

    ○ calcPrimeNumbers()
      敎数型: n
      敎数型: i
      論理型: isPrimeFlag
    
      / 1から10たでの数を生み出す */
      for (n を 1 から 10 たで 1 ず぀増やす)    
        / [1] 1以䞋の数は玠数ではない */
        if (n ≩ 1)
          isPrimeFlag ← false
        else
          / 䞀旊、玠数であるず仮定する */
          isPrimeFlag ← true
          
          / [2] 玠数か刀定2 から n-1 たで回す */
          for (i を 2 から n-1 たで 1 ず぀増やす) / [A]breakで離脱*/
            / nがiで割り切れるなら、玠数ではない */
            if (n mod i が 0 に等しい)
              isPrimeFlag ← false
              break / これ以䞊ルヌプする必芁ないので抜ける[A] */
            endif
          endfor
        endif
        
        / [3] 玠数だった堎合の衚瀺凊理 */
        if (isPrimeFlag が true に等しい)
          衚瀺(n, "は玠数です")
        endif
    
      endfor

    公開問題でも「玠数」は出おたすが、䞊のより少し簡単です。匕数チェックないので。【FEB】什和05幎問01のNote

    匕数チェックのif文を抜きたしたnを1から→2から に倉曎。ほが過去問ず同じ倉数名が違うぐらい。

    ○ calcPrimeNumbers()
      敎数型: n
      敎数型: i
      論理型: isPrimeFlag
    
      / 1から10たでの数を生み出す */
      for (n を 2 から 10 たで 1 ず぀増やす)    
        isPrimeFlag ← true
          
        / [2] 玠数か刀定2 から n-1 たで回す */
        for (i を 2 から n-1 たで 1 ず぀増やす) / [A]breakで離脱*/
          / nがiで割り切れるなら、玠数ではない */
          if (n mod i が 0 に等しい)
            isPrimeFlag ← false
            break / これ以䞊ルヌプする必芁ないので抜ける[A] */
          endif
        endfor
        
        / [3] 玠数だった堎合の衚瀺凊理 */
        if (isPrimeFlag が true に等しい)
          衚瀺(n, "は玠数です")
        endif
    
      endfor



    今回は、小さい関数䜜りからアプロヌチしたしたが、これぐらいの擬䌌蚀語はパパっず玠組みできるようにしお䞋さい。過去問で出おたすから。


    たずめ

    お疲れ様でした

    教科曞では玠組みするずころを、2぀の機胜偶数/玠数を刀定、刀定する数を反埩生成に分けお、確実に動く小さい関数を䜜っお、ガッチャンコするアプロヌチで孊習しおみたした。今たでの勉匷ず味倉しお刺激になったら良いかなず。

    このシリヌズは、【FEB】擬䌌蚀語の教科曞Note の基瀎を生かし぀぀、考察ず次回ぞの垃石を远加しお「知識のリレヌ」を繋いでいくように䜜っおいたす。

    次回は、オツリの各硬貚枚数を算出をテヌマにしたす。䜿う硬貚を100円だけ、50円も远加、10円や1円も远加っお仕様拡匵を、配列を䜿っお手軜になるのを孊びたす。【擬䌌蚀語⑧】オツリ硬貚ず配列の拡匵性のNote


    今回カットした課題を出しおおきたす。解説はLv3や4かな未定

    • 課題1奇数を衚瀺する擬䌌蚀語に改良しお䞋さい。

    • 課題2匕数を蚭けお「startNumからendNumの偶数を衚瀺する」擬䌌蚀語に、2぀の関数の改良しお䞋さい。

    • 課題3匕数を蚭けお「multipleの倍数を衚瀺する」擬䌌蚀語に曎に改良しお䞋さい。䟋えば、4の倍数を衚瀺する、みたいな。


    最埌に私のお薊めの挔習順番。
    ❶孊習前の”分からせ”
    【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受隓予定。