基本情報技術者試験〔科目B〕演習 2022年サンプル問題 問3(文法問題、一次元配列)
問3(文法問題、一次元配列)
次の記述中の □ に入れる正しい答えを、解答群の中から選べ。ここで、配列の要素番号は1から始まる。
関数 makeNewArray は、要素数2以上の整数型の配列を引数にとり、整数型の配列を返す関数である。関数makeNewArray ({3, 2, 1, 6, 5, 4})として呼び出したとき、戻り値の配列の要素番号5の値は □ となる。
〔プログラム〕
1: 〇整数型の配列:makeNewArray (整数型の配列:in)
2: 整数型の配列: out ← {} // 要素数0の配列
3: 整数型: i, tail
4: outの末尾に in[1]の値を追加する
5: for (i を2から in の要素数まで1ずつ増やす)
6: tail ← out [outの要素数]
7: outの末尾に(tail + in[i])の結果を追加する
8: endfor
9: return out
解答:17
ループ処理による変数及び配列の変化
初期状態:
out = {3}
i = 2:
tail = 3
追加する値 = tail + in[2] = 3 + 2 = 5
out = {3, 5}
i = 3:
tail = 5
追加する値 = tail + in[3] = 5 + 1 = 6
out = {3, 5, 6}
i = 4:
tail = 6
追加する値 = tail + in[4] = 6 + 6 = 12
out = {3, 5, 6, 12}
i = 5:
tail = 12
追加する値 = tail + in[5] = 12 + 5 = 17
out = {3, 5, 6, 12, 17}
i = 6:
tail = 17
追加する値 = tail + in[6] = 17 + 4 = 21
out = {3, 5, 6, 12, 17, 21}
・Javaでコーディング
public class ArrayGenerator {
public static int[] makeNewArray(int[] in) {
// out の初期化 (空の配列)
int[] out = new int[1];
out[0] = in[0]; // 最初の要素を追加
// 動的に配列を拡張するためのArrayListを使用
java.util.ArrayList<Integer> outList = new java.util.ArrayList<>();
outList.add(in[0]);
for (int i = 1; i < in.length; i++) {
int tail = outList.get(outList.size() - 1); // out の末尾
outList.add(tail + in[i]); // 新しい値を追加
}
// ArrayList を配列に変換して返す
return outList.stream().mapToInt(Integer::intValue).toArray();
}
public static void main(String[] args) {
int[] input = {3, 2, 1, 6, 5, 4};
int[] result = makeNewArray(input);
// 結果を出力
System.out.println("戻り値の配列: " + java.util.Arrays.toString(result));
System.out.println("要素番号 5 の値: " + result[4]);
}
}
・Pythonでコーディング
def make_new_array(in_array):
# out の初期化 (空のリスト)
out = []
# 最初の要素を追加
out.append(in_array[0])
# 配列をループで処理
for i in range(1, len(in_array)):
tail = out[-1] # out の末尾
out.append(tail + in_array[i]) # 新しい値を追加
return out
# テスト用コード
input_array = [3, 2, 1, 6, 5, 4]
result = make_new_array(input_array)
# 結果を出力
print("戻り値の配列:", result)
print("要素番号 5 の値:", result[4])
出力結果
戻り値の配列: [3, 5, 6, 12, 17, 21]
要素番号 5 の値: 17
補足
本問題における背景、目的、得られた結果及び応用事例
Chat-GPTによる解答
背景
基礎的なプログラミングスキルの評価
この問題は、配列やループ処理の基本的な操作を理解しているかどうかを確認する目的で作成されたと考えられます。特に、配列の末尾要素の操作や、順次処理を行うアルゴリズムを正確に記述・理解する能力が重要です。アルゴリズム設計の練習
入力データに基づいて新しい配列を生成するという課題は、アルゴリズムの設計力を養うための典型的な問題設定です。これにより、動的データ構造や計算過程の可視化を学びます。実践的な問題解決の準備
こうした小規模な問題は、実際のプログラミングで必要なデータ処理やロジック構築の練習問題として活用されます。
目的
配列操作の理解
配列の要素を読み取る、計算する、新しい配列を生成する過程を学ぶことが目的です。
特に「末尾の要素を利用して次の要素を計算する」というステップが重要です。
ループと条件処理の強化
繰り返し処理の中でデータを蓄積する手法を身につけます。
この問題では、インデックス操作が正確にできるかどうかが問われています。
プログラムの流れを把握する力
コードを読んで実行結果を追いかける「トレーシングスキル」の向上が目的です。
汎用性の高いアルゴリズムの学習
末尾要素を基に次の値を生成する考え方は、累積和やシミュレーションなど、多くの分野に応用可能です。
得られた結果
基本的な配列操作スキル
配列を初期化し、要素を追加し、計算結果を生成するプロセスを習得できます。
アルゴリズムの理解と応用力
問題を分解して段階的に解く力を得ることができます。
作業を効率化する方法や配列を効率的に処理する手法が学べます。
プログラムの動作を予測する能力
問題文に基づいてコードの結果を予測するスキルを養います。
応用事例
この問題で学んだスキルは、以下のような実際の問題解決に応用できます:
データの累積処理
売上、クリック数、アクセス数などの累積集計を行うプログラムの作成。
例:月ごとの売上データから累計売上を計算する。
動的配列の構築
入力データに基づいて、新しい配列やリストを生成するアルゴリズム。
例:株価の変化に基づいて、累積的な増減データを計算する。
フィボナッチ数列や累積和の計算
末尾の値を使って次の値を計算するアルゴリズムは、数列生成や再帰的な計算に応用可能です。
ゲームロジックの設計
シンプルなルールに基づいて状態を更新するロジック設計。
例:ターンベースゲームにおけるプレイヤーのスコア計算。
教育現場での練習問題
初学者向けの練習問題として、配列操作やアルゴリズム設計の教材として広く活用できます。
以上。