2022 サンプル問題9テクノロジ系

基本情報 2022 サンプル問題 問9:テクノロジ系に関する問題

プログラムのコーディング規約に規定する事項のうち,適切なものはどれか。

  • a局所変数は,用途が異なる場合でもデータ型が同じならば,できるだけ同一の変 数を使うようにする。
  • b処理性能を向上させるために,ループの制御変数には浮動小数点型変数を使用す る。
  • c同様の計算を何度も繰り返すときは,関数の再帰呼出しを用いる。
  • d領域割付け関数を使用するときは,割付けができなかったときの処理を記述する。正答
正答:D領域割付け関数を使用するときは,割付けができなかったときの処理を記述する。

AI解説(初心者・標準・上級)

理解度に合わせて3レベルの解説を無料で読めます。

初心者向けまずはここから。やさしく要点を解説

答えは d「領域割付け関数を使うときは、割付けできなかった時の処理を書く」 です。

プログラムでメモリ(記憶領域)を借りるとき、「ごめん、もう空きがないよ」 と断られることがあります。これを無視するとプログラムが突然クラッシュしたり、変なデータを書き込んだりして危険。だから 「借りられなかった時にどうするか」を必ず書くべき という規約は正しい。

ほかの選択肢がダメな理由:

  • a: 「データ型が同じなら同じ変数を使い回せ」は罠。あとから見た人が「これ何の変数?」と混乱する → バグの元。
  • b: 小数(浮動小数点)でループを数えるな。誤差で「ぴったり10回」にならず、ループが終わらない事故が起きる。
  • c: 何でもかんでも再帰呼び出しは×。スタック(メモリの一種)を消費しすぎて落ちることがある。普通のループで十分。

👉 覚え方: 「メモリ借りたら借りれたか確認」 がd。失敗時の処理を必ず書く。

標準試験対策の基準レベル

なぜこれが正解か

正解は d。`malloc`(C)/`new`(C++/Java)等の 領域割付け関数は失敗する可能性(メモリ不足等)があり、戻り値をチェックして失敗時のエラー処理(ログ、リトライ、安全な終了)を実装するのが規約の鉄則。失敗放置は NULL 参照 → セグフォルト → クラッシュに直結。

各選択肢の解説

  • a 不適切: 局所変数の使い回しは 可読性・保守性を損なう。用途別に名前を分けるのが原則。レジスタ割当はコンパイラが最適化するので性能メリットも薄い。
  • b 不適切: ループ制御変数に 浮動小数点型は厳禁。IEEE 754 の丸め誤差で `for (f=0.0; f<1.0; f+=0.1)` が10回にならない事故が起きる。整数型必須。
  • c 不適切: 再帰は「同様の計算の繰返し」には不適切。スタック消費・呼出しオーバヘッドがあり、単純反復は for/while で書く。再帰は分割統治・木構造探索など本質的に再帰的な問題に限定。

覚え方・ひっかけ注意

コーディング規約 = 「将来のバグを防ぐ予防的ルール」。性能より 可読性・安全性・保守性 を優先。NULLチェック・エラー処理・命名・型選択が基本。MISRA C/CERT C 等の業界標準が存在する。

上級誤答論破・背景理論まで深掘り

ソフトウェア工学的背景

コーディング規約は 欠陥混入率の削減保守コストの低減 を目的とする。Capers Jones の調査では、コーディング規約遵守により欠陥発生率が25〜40%削減されるとの報告がある。代表的な業界規約:

  • MISRA C/C++: 自動車・組込み系。ISO 26262 機能安全認証で参照。
  • CERT C/C++/Java Secure Coding Standard: セキュリティ重視。脆弱性パターン(CWE)を予防する規約。
  • Google C++ Style Guide / PEP 8(Python): 大規模プロジェクトの一貫性確保。

メモリ管理の深層

本問の核心 `malloc` 失敗処理は 防御的プログラミング の典型。実装パターン:

```c

void *p = malloc(size);

if (p == NULL) {

/ エラー処理: ログ、リトライ、graceful degradation /

return ERROR_OOM;

}

```

C++ では `new` 失敗時 `std::bad_alloc` 例外を投げる(`new(std::nothrow)` で NULL 返却に切替可)。Java/C# は GC により mall失敗が起きにくいが、`OutOfMemoryError`/`OutOfMemoryException` を捕捉する必要がある場面も。

RAII とスマートポインタ

C++/Rust では RAII(Resource Acquisition Is Initialization) により、スコープを出る際にデストラクタで自動解放され、メモリリークを構造的に防ぐ。スマートポインタ(`std::unique_ptr`, `std::shared_ptr`)を使えば手動 free 不要。Rust は所有権モデルで実行時オーバヘッドなしに同等以上の安全性を達成。

試験での位置づけ

ソフトウェア工学・開発技術の頻出単元。基本情報技術者試験ではコーディング規約、命名規則、コメント、レビュー、リファクタリング、構造化プログラミングが基礎。応用情報以降ではセキュアコーディング(CERT)、静的解析ツール(Coverity, SonarQube)、形式手法(モデル検査、契約プログラミング)、SOLID 原則、デザインパターンまで範囲拡大。

選択肢の発展補足

  • a の例外: 短い処理スコープ内のループカウンタ `i` は使い回しが一般的(慣習的に許容される短命変数)。ただし用途が異なるなら別名を推奨。
  • b の例外: 浮動小数点でも `for (int i=0; i<=10; i++) { float f = i * 0.1f; ... }` のように 制御は整数、計算で浮動小数点 とすれば安全。
  • c の例外: 再帰が自然な問題(木構造、フラクタル、分割統治)では再帰の方が可読性高い。末尾再帰最適化を持つ言語ではループと同等の効率。
  • 静的解析の活用: 規約違反は人手レビューより静的解析ツール(clang-tidy, ESLint, RuboCop, Pylint, SpotBugs)で機械的に検出するのが現代の主流。CI/CD パイプラインに組み込みPR時に自動チェック。
出典・引用について

出典:IPA(情報処理推進機構)公式 基本情報技術者試験 2022 サンプル問題9/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。

テクノロジ系の他の過去問

1
テクノロジ系
2
テクノロジ系
3
テクノロジ系
4
テクノロジ系
5
テクノロジ系

あなたの弱点を診断して、合格までの最短ルートを

この分野を連続演習し、AIがあなたの弱点を分析。合格ナビなら基本情報の過去問を解きながら学べます。