スッキリわかるC言語入門

過去10年分析! 基本情報(FE) 午後C言語対策のポイント

令和元年秋FEについて(10/20追記)


みなさま、受験お疲れ様でした。IPAに本日の出題内容が公開されていますが、今回もなかなかの「歯ごたえのある良問」でしたね。
当エントリで予告の通り「基本文法+配列+関数」を中心とした出題で、特に近年出題が増えているというファイル系のトッピングが今回も出題されました。
スッキリCでは補講で扱っている「シフト演算」などが登場しているのが、少し難しいポイントだなと感じましたが、全体としては王道の出題だと思います(今回のJava出題があまりに覇道であったため、そう見えるだけかもしれませんが)。

そろそろ今年も、○○の秋ですね

やって参りました、「情報処理試験 秋の陣」。今年は10月20日に開催です。
受験予定のみなさんは、そろそろ「午前」の仕上げをしつつ「午後」を磨き上げていく感じでしょうか。

来年から午後試験にPythonが加わり、ますます「午後言語であえてCを選ぶ硬派さ」が際立つ予感もしますが、私が「第一種」を取得した20年前から、Cってわりと王道の良問を出す傾向があり、出題パターンも実は安定しているんです。

スッキリCの著者としては、本書を利用して勉強してくださる皆様のお役にたつべく、今回過去3年(一部10年)の過去問に基づき、傾向と対策を整理してみました!

さっそく結論

過去3年分(6回)での出題された内容について、表でまとめたものです。

この表から、以下の3つのことが言えます。

傾向と対策その1  「16章」・「15章」・「13.4以外の13章」は学習不要

本書最後の第16章は、「RPGでラスボス倒した後の勇者達を描くエンディング」的な章(エピローグ)ですので、もとからシラバス上も出題範囲外であり、実際に過去10年出題されていません。

また、第15章(ツールによる効率化: makeや静的コード解析など)も、C言語自体というより「C言語を使って実務に出た場合に必要な知識」として添えた章なのでシラバス的にも試験範囲外です(過去10年出題なし)。

注意すべきは第13章(複数ファイルによる開発)です。C言語というより処理系の話である「コンパイラやリンカ」については当然出題されていないのですが、「設問中に複数のソースファイルがあり、片方が他方を#includeする」みたいな問題も過去10年出題されていません。これからも出題されないとは断言できませんが、「複数のソースコードにわけて1つのプログラムを編成する」という設問をして非本質的な部分で問題を難しくするより、後述の関数や配列でしっかり出題しようという意図を感じました。

ただし、#defineによる定数宣言だけはかなりの頻度で例年利用されています。平成31年春は、マクロ定数ではなくマクロ関数としても登場しています。マクロによる副作用などを突いた出題はされていませんが、マクロ自体を全く知らないと少し驚くので一応13.4節は読んでおいたほうがいいでしょう。

傾向と対策その2 関数と配列を中心に、周辺構文をトッピングしてくる

過去3年分(6回分)調べた限り、毎回、ほぼ間違いなく出題されているのが、基本構文類(1〜5章)・配列(7章)と関数(8章)です。
この毎回ほぼでる「基本構文類+関数+配列の基本構成」に、試験によって毎回、以下の4パターンのトッピングになるように見えます。

構造体に関する知識を追加で要求するもの(平成30年秋・平成28年秋)

もっともよくある2大トッピングのうちの1つ。設問中に構造体が冒頭からしっかり盛り込まれており、「先頭ポインタと要素数を構造体で持つパターン」や「アロー演算子」なども登場しています。まったく知識なしだと、ほぼ回答することができません。

文字列に関する知識を追加で要求するもの(平成30年春・平成29年秋)

2大トッピングのうちのもう1つ。文字列リテラル特有の宣言、終端文字に加え、strcpyなどの文字列操作関数が多数される回もありました。終端文字を喪失することによるオーバーランなどを仕込んだ上で問題分析させるような回は過去6回の試験では見られませんでした(詳細は後述)が、そろそろ出題する年があってもおかしくないように個人的には思います。

追加で特に知識を要求しないもの(平成29春・平成28秋)

ここ2年はないのですが、3年前あたりは、「特にトッピング知識を要求しない」というものもありました。
符号なし整数(付録D.1)やビット演算(付録D.2)などを絡めてくる年もあるとはいえ、基本的には、基本構文(1〜5章)と関数(8章)と配列(7章)だけで攻めてくる問題です。ラッキーと思う人もいるかもしれませんが、これは「問9(C言語)と問8(疑似言語)の出題特性が似てくる」ことを意味していて、いわゆる「ロジック読み解きながらひたすら動作を辿るのが苦手な人」は大問2つともを失ってしまう危険性があります。

ファイルアクセスの知識を要求するもの(平成31年春・平成30年春)

ここ1〜2年ほど、ファイルアクセス系の題材が用いられることが増えているようです。特に平成31年春は、fgetsだのfprintfだの、標準関数をバンバン使いまくる問題でしたので、(末尾にリファレンスがあるとはいえ)事前学習なしで正答に辿り着くのはかなり苦しいと思います。

傾向と対策その3 意外にオーバーラン系やアドレス系は出題されにくい

実務であると、文字列宣言で終端文字分が確保されていないとか、forループでの範囲外アクセス、未初期化変数領域へのアクセス、アドレスを手計算した上での*演算子による任意メモリ領域アクセスなどが、ソースコードを「見抜く力」「悲劇を避ける力」という意味で非常に重要です。そのため「このコードはなぜか○行目で異常な表示がなされたり強制終了することがある。それはなぜか。以下の4つから原因と考えられるものを選べ」的な問題が出題されてもおかしくないと個人的には思ったのですが、過去3年分を見た限りは、この手の出題は見つけることができませんでした。

たとえば「カラクリ構文」についても深い理解を要求するものもなく、自然にさらっとコード中で使ってある程度です。あまり「C言語特有のアドレス周りの特殊な扱いを知っているか」を問うてくるというより、関数や配列という道具を使った普通の高級言語としての機能を素直に問うてくるケースが多い印象です。ですので、いまのところ「どこかでオーバーランやアドレス操作を間違えるような処理が混入させられてる意地悪コードじゃないかな?」と注意しながら問題文のコードを読む必要は低そうです(それをするか否かでぜんぜん回答速度がかわってくると思います)。

ただ、今後Pythonの登場により、高級言語として守備範囲がPythonに移動し、「組み込み屋さんのためにC言語を残す」というような方向性になるかもしれません。その場合、アドレス系やオーバーラン系の出題も増えてくるかもしれませんので、そろそろ気をつけて一応、スッキリCの第III部の内容を中心に対策をしておくと安心かもしれませんね。

【結論】 スッキリCのほとんど全域が「出題範囲」です

実は、スッキリCに対して「(基本情報処理試験の)試験範囲に比べ不要な部分が多く合致しない」というAmazonレビューを1件いただいたのですが1、記事冒頭の表や上記の出題傾向を見ると、「スッキリCの15章以外はほぼ過去3年で出題されており、ほぼすべてが出題範囲であると考えて、まんべんなく学習いただいた方が安全」だと思います。

もしどうしても準備時間に制約がある場合、「前提知識として当然のように要求される」第I部と、「中心的に知識を問うてくる領域」である第II部をより重点的に学んでおくことをお勧めします。

素敵な「通過点」を。

ちなみに、スッキリシリーズはJavaやSQLも含めて「資格を取るためにも、とった後にも役立つ、エンジニアに求められる本質を。」というコンセプトで執筆されています。そのため、スッキリわかるC言語入門でも、普通の入門書でも紹介される構文や言語機能はもちろん、実務で重要な注意点やノウハウ、15章のようなツール系の内容もしっかり盛り込ませていただきました。

盛り込んだ実践ノウハウ部分については、ページ分量としてはさほど多くないのですが、その部分に重要性や魅力を感じてくださる方は、相対的に「スッキリCはFE試験範囲以外の部分が多い」と感じていただくかもしれません。

あ、でも、スッキリシリーズが資格を軽んじているわけではありませんよ2

よく「資格なんて、しょせんただの通過点だから」みたいな感じで言っちゃう人もいますし、もちろん医師免許とかと違って「FEを持ってないとできない仕事」が存在するわけではないのは事実。

ただ、そんな「絶対必須ではないもの」を取るっていうことは、自分の技能を対外的に立証しようという意志の表れだと思うんです。

単に自分がスキルを得るだけでなく、可視化して他人にそれを示そうとすることは、「誰かのためにスキルを使役し、その道で身を立てていこうと考える」ならば欠かせないことではないでしょうか。そしてそのように、資格取得に取り組む姿そのものが「資格取得後もプロフェッショナルのエンジニアとして求められる姿勢」だと感じます。

近年特に難易度があがっているといわれるFE試験ですが、受験のみなさん、「素敵な通過点」に向けてラストスパート頑張って下さいね。

  1. しかも2桁以上の人がそのコメントを参考になさってしまったようなのですが...
  2. 中山自身、なぜかフィナンシャルプランナーとか知財技能士とかいろいろもってますし...

-スッキリわかるC言語入門
-,