基本情報の午後試験はプログラム問題です.
科目B問題を解けるようになるにはプログラムを元に自分でコードを書いてみるのが1番良いでしょう.
今回は科目B問14「配列の特徴値を返すプログラム」の解説とそのコードを紹介します.
プログラムを元にPythonで書き直しました.
Pythonで書いてみたので是非手元で実行してみてください.
サンプル問題 科目B 問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))
プログラムを実行すると [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「文配列の特徴値を返すプログラム」について紹介しました.
関数の中で関数を使うと処理を追うのが大変になりますね
実務ではよく処理ごとに関数を分けるので,このような複雑なプログラムにも慣れておきましょう!