【基本情報】コード掲載!科目B問14「配列の特徴値を返すプログラム」について解説

20231112_sample14 資格試験

基本情報の午後試験はプログラム問題です.

科目B問題を解けるようになるにはプログラムを元に自分でコードを書いてみるのが1番良いでしょう.

今回は科目B問14「配列の特徴値を返すプログラムの解説とそのコードを紹介します.
プログラムを元にPythonで書き直しました.

Pythonで書いてみたので是非手元で実行してみてください.

サンプル問題 科目B 問14「配列の特徴値を返すプログラム」

問題文は以下のとおりです.
配列に関する問題ですね.

問14 問題文と回答選択肢|クリックして拡大できます
サンプル問題[科目B]問14 配列の特徴値を返すプログラム

プログラムをPythonで書き直す

問14に掲載されているプログラムを元にPythonで書き直しました.

from typing import List
import math

# 配列を
def findRank(sortedData: List[float], p:  float):
    
    i = math.ceil(p * (len(sortedData) - 1)) # 小数点を切り上げる
    return sortedData[i]

def summarize(sortedData: List[float]):
    rankData = []
    p = [0, 0.25, 0.5, 0.75, 1] # 配列を特徴づける5つの値
    
    for i in range(0, len(p)):
        rankData.append(findRank(sortedData, p[i]))
        
    return rankData

dataList = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] # 配列
print(summarize(dataList))
スクリーンショット 2023-11-12 174000
プログラムの実行結果|クリックして拡大できます

プログラムを実行すると [0.1, 0.4, 0.6, 0.8, 1] となりました.

この問題の答えは「ク」なのでプログラムの結果とも一致しました.

ポイントを確認しましょう!

ポイント1 プログラムの実行順序を確認する

このプログラムでは2つの関数を使いました.

  • summarize関数(findRank関数の結果をrankData配列に追加する)
  • findRank関数(配列を特徴づける5つの値から1つを使いsortedDataのインデックスを指定し,その要素を返す)

関数の中で別の関数が使われている構造ですね.
summarize関数の変数をfindRank関数に引き継ぐイメージです.

findRank関数で使う変数名は必ずしもsummarize関数の変数名と一致しないので気をつけましょう!

def summarize(sortedData: List[float]):
    rankData = []
    p = [0, 0.25, 0.5, 0.75, 1] # 配列を特徴づける5つの値
    
    for i in range(0, len(p)):
        rankData.append(findRank(sortedData, p[i])) # findRank関数の処理を実行する
        
    return rankData # rankData配列を返す

ポイント2 トレースする

iを0から4までループしている処理をトレースしましょう!

コメントで変数に入る数字を補完しました.
Pythonコードを実行して処理過程を確認するのも良いでしょう.

def summarize(sortedData: List[float]):
    rankData = []
    p = [0, 0.25, 0.5, 0.75, 1] # 配列を特徴づける5つの値
    
    for i in range(0, len(p)): # i=0, len([0, 0.25, 0.5, 0.75, 1])=5
        rankData.append(findRank(sortedData, p[i])) # sortedData=[], p[0]=0

        # findRank関数の処理
        i = math.ceil(p * (len(sortedData) - 1)) # p=0, len(sortedData)-1=9 , i=0 
        return sortedData[i] # i=0, sortedData[0]=0.1
        
    return rankData # [0.1]
def summarize(sortedData: List[float]):
    rankData = []
    p = [0, 0.25, 0.5, 0.75, 1] # 配列を特徴づける5つの値
    
    for i in range(0, len(p)): # i=1, len([0, 0.25, 0.5, 0.75, 1])=5
        rankData.append(findRank(sortedData, p[i])) # sortedData=[0.1], p[1]=0.25

        # findRank関数の処理
        i = math.ceil(p * (len(sortedData) - 1)) # p=0.25, len(sortedData)-1=9, i=3
        return sortedData[i] # i=3, sortedData[2]=0.4
        
    return rankData # [0.1, 0.4]
def summarize(sortedData: List[float]):
    rankData = []
    p = [0, 0.25, 0.5, 0.75, 1] # 配列を特徴づける5つの値
    
    for i in range(0, len(p)): # i=2, len([0, 0.25, 0.5, 0.75, 1])=5
        rankData.append(findRank(sortedData, p[i])) # sortedData=[0.1, 0.4], p[2]=0.5

        # findRank関数の処理
        i = math.ceil(p * (len(sortedData) - 1)) # p=0.5, len(sortedData)-1=9, i=5
        return sortedData[i] # i=5, sortedData[5]=0.6
        
    return rankData # [0, 0.4, 0.6]
def summarize(sortedData: List[float]):
    rankData = []
    p = [0, 0.25, 0.5, 0.75, 1] # 配列を特徴づける5つの値
    
    for i in range(0, len(p)): # i=3, len([0, 0.25, 0.5, 0.75, 1])=5
        rankData.append(findRank(sortedData, p[i])) # sortedData=[0.1, 0.4, 0.6], p[3]=0.75

        # findRank関数の処理
        i = math.ceil(p * (len(sortedData) - 1)) # p=0.75, len(sortedData)-1=9, i=7
        return sortedData[i] # i=7, sortedData[7]=0.8
        
    return rankData # [0, 0.4, 0.6, 0.8]
def summarize(sortedData: List[float]):
    rankData = []
    p = [0, 0.25, 0.5, 0.75, 1] # 配列を特徴づける5つの値
    
    for i in range(0, len(p)): # i=4, len([0, 0.25, 0.5, 0.75, 1])=5
        rankData.append(findRank(sortedData, p[i])) # sortedData=[0.1, 0.4, 0.6, 0.8], p[4]=1

        # findRank関数の処理
        i = math.ceil(p * (len(sortedData) - 1)) # p=1, len(sortedData)-1=9, i=9
        return sortedData[i] # i=9, sortedData[9]=1.0
        
    return rankData # [0, 0.4, 0.6, 0.8, 1.0]

以上の処理を経ることで最終的にrankDataには[0, 0.4, 0.6, 0.8, 1.0]が入りましたね.

まとめ

今回は科目B問14「文配列の特徴値を返すプログラム」について紹介しました.

関数の中で関数を使うと処理を追うのが大変になりますね
実務ではよく処理ごとに関数を分けるので,このような複雑なプログラムにも慣れておきましょう!