C言語の勉強法と勉強において注意すべきポイント Part2

Part2C言語
スポンサーリンク

では、C言語の勉強法と勉強において注意すべきポイントのPart.2になります。

前回のPart.1をご覧になっていない方は、以下のリンクからご覧ください。

C言語の勉強法と勉強において注意すべきポイント Part1
コチラでは基本情報技術者試験におけるC言語の勉強法、勉強において注意すべきポイントについて解説しています。C言語はアセンブラや表計算と比べて、問題の難易度が格段に高いため、スケジュールに余裕を持たせて勉強を始めましょう。

C言語の注意すべきポイント

・プログラムをトレースして理解度アップ

調べる

前回のPart.1では、
「プログラムの機能を想像するには、問題を解いたという経験が必要」
という内容を解説しました。

ではもう一段階踏み込んで、プログラムの処理を理解するには、どうした良いでしょうか?

答えは簡単。

プログラムをトレースしてください

またプログラムの概要を上手く把握できるかというポイントも、プログラムにおける処理の理解をするためには、重要な要素と言えます。

プログラムの内容を読んで、プログラムをトレースすると、自然にプログラムの処理が把握できる力が付くようになります。

 

ちなみにプログラムをトレースする際に注意すべきポイントは、

  • 変数の内容(構造体を含む)
  • 配列の要素
  • 配列に入っている内容
  • ポインタの内容

といった点になります。

上記のポイントを細かくメモしながら勉強を進めると、プログラムの処理を読む能力が着実に身に付くでしょう。

またプログラムをトレースする力は、
プログラムの実行結果を求める問題を解く時に、重要な要素となります

プログラムの実行結果を求める問題は、難しく正答率が低い問題ですが、正解できれば合格にグッと近づくと思って、プログラムをトレースする力を身に付けましょう。

 

他にもプログラムの概要を把握できない場合は、

  • 問題文に書かれているイラストの内容をメモする
  • 問題文に書かれている内容をプログラムに当てはめてみる(結果や内容をメモする)
  • イラストがなければ自分で簡単に図を書いてみる

といったやり方を試してみてください。

頭の中で考えているよりも、遥かに把握しやすくなるためおススメです。

 

チョコ
チョコ

C言語のプログラムって、アセンブラとか表計算に比べると、使っている変数や配列が多くて、プログラムをトレースするのが難しいよな

シロ
シロ

確かにね。けどプログラムをトレースする工程は、短いプログラムでもない限り、プログラムを理解するのに必要不可欠だから、仕方ないとも言えるよ

チョコ
チョコ

他のプログラムに鞍替えしても、プログラムをトレースするという作業は、多かれ少なかれ必要だからな。まあ粘り強くプログラムを追うしかないか・・・

スポンサーリンク

・配列の要素数は常に注意しておく

配列の要素数をチェック

基本情報技術者試験におけるC言語の問題において、出題がされやすいポイントがあります。

それは配列の要素数です。

そのためC言語の勉強を進める際には、常に配列の要素数に注意して勉強を進めてください。

また配列の要素数が更新されやすいループや代入といった処理では、配列内容や要素数の読み取りミスが発生しやすいため、プログラムを慎重に読む必要があります。

状況によっては、配列の後ろから内容を読み込んでいるパターンもあるため、注意してプログラムを読んでください。

 

ちなみに配列を操作する際には、
%やべき乗を使った計算によって、配列の要素数を操作するといった処理もあります。

だからこそ%やべき乗を使った計算を練習して、配列の要素数として使われているint型の変数がどのような動きをするか、といったポイントを理解しておきましょう。

 

チョコ
チョコ

単純にループで配列の要素数を操作するだけでなく、%やべき乗を使って、要素数を操作するパターンもあるんだな

シロ
シロ

うん。だから試験が始まる前に%やべき乗を使った要素数の操作を一度触ってみた方が良いかもね

チョコ
チョコ

知っているだけと触ったことがある、っていう違いは大きいからな

・i++や++iの演算子は処理の順番に注意

演算子

i++と++i、みなさんは2つの演算子について違いをご存知でしょうか?

例えば、2つの演算子をプログラムで書いてみると、

  • i++
    result = i++;
    iをresultに代入してからiを1増やす
  • ++i
    result = ++i;
    iを1増やしてから、resultに代入する

といった形になっています。

基本情報技術者試験において、この「++」増分演算子が度々プログラムに出てくるため、必ず違いを把握しておくようにしましょう。

 

また「++」だけでなく、「–」の減分演算子も同じです。

どちらもC言語の基礎と言える内容ではありますが、処理が簡単だからと言って、いいかげんに把握しておくと、思わぬところで点数を落とす切っ掛けになるため注意してください。

シロ
シロ

この「++」の増分演算子と「–」の減分演算子は、ループのカウント変数や配列の要素数操作でよく出てくる演算子だから、しっかり覚えておいてね

チョコ
チョコ

もちろんプログラムで出てくるだけでなく、問題のメインとして出題されるパターンもある。だからこそ処理の内容や処理の流れをキッチリ把握しておこう

C言語の問題傾向

・文字列は出題率が高いため要注意

文字列問題に注意

基本情報技術者試験のC言語において、出題されやすい内容が有ります。

それが文字列を題材とした問題です。

例えばC言語問題において、文字列を題材とした問題は、以下のようなものがあります。

  • 平成31年春期
    入力ファイル中の文字列に対して、それぞれの文字数をカウントする
  • 平成29年秋期
    文字列の中から回文を探す
  • 平成27年春期
    与えられた文字列を暗号化する
  • 平成26年春期
    文字列を編集してファイルへ出力する
  • 平成25年秋期
    2つの英単語を辞書順で比較する
  • 平成22年春期
    英文を読み込んで、単語が途切れないように出力する

上記の出題歴を見てわかる通り、近年の試験では高確率で出題される内容となっています。

そのため基本情報技術者試験のC言語を対策する際には、
文字列操作や比較といった内容を重点的に復習しておきましょう。

 

またC言語のプログラムでは、文字列を比較、文字列をコピーする関数が出てきます。

  • strcpy(a,b)
    文字列bをaにコピーする
  • strncpy(a,b,c)
    文字列bをcの長さだけ、aにコピーする
  • strcmp(a,b)
    文字列aとbを比較して、結果によって負の値、0、正の値を返す

上記の関数は、文字列を題材とした問題だけでなく、
試験で使われる色々なプログラムにおいて高確率で登場する関数であるため、ある程度内容を把握しておくと、試験時間の節約になります。

 

他にも文字列を題材とした問題を勉強する際には、文字列がどころから始まるかといった位置に関する変数を把握することが重要です。

文字列の位置に関する情報は、文字列の出力や比較において重要な要素であり、
問題にもなりやすいといった特徴があります。

文字列の位置に関する変数や配列は、内容を理解できるまで時間が掛かる要素でもあるため、内容が理解できるまで粘り強くプログラムをトレースしてください。

 

ちなみに文字列を比較する処理で理解しづらい内容が出てきたら、比較する変数や配列に入っている内容をとりあえず書き出してみましょう。

すると比較する内容が明瞭になり、問題がスムーズに解けるようになります。

プログラムの内容が分からなくなった時にこそ、内容を書き出すというポイントが重要になるため、常日頃から意識して勉強しておくようにしてください。

 

チョコ
チョコ

C言語って文字列を題材とした問題がすごく多いんだな。結構びっくりした

シロ
シロ

確かにね。けど文字列を操作するという内容は、文字列を題材とした問題以外にもよく出現するから、慣れておいて損は無いと思うよ

チョコ
チョコ

なるほど。出題率から考えても、文字列に慣れておいた方が良いんだな

スポンサーリンク

・C言語にはアルゴリズムの要素が入る

C言語 アルゴリズムの要素が混じる

私はこの記事のPart1の冒頭で、C言語を選ぶ際の前提条件として、アルゴリズムが苦手でないこと、という条件を挙げました。

何故C言語を選ぶのに、アルゴリズムが絡んでくるのか?

それはC言語という問題にアルゴリズムの要素が入ってくるからです。

例えば、C言語のプログラムには、アルゴリズムの内容である、再帰や配列の入れ替え処理という要素が問題に含まれています。

そのため先にアルゴリズムの勉強をしてからC言語の勉強に入ると、ロジックを調べるといった手間が省けるようになるでしょう。

 

ちなみにC言語の問題には、配列の要素数や内容をこねくり回すような、プログラムの処理に着目した難しい問題が出題されます。

またC言語の文法に関しての問題は殆ど出題されないため、プログラム処理がきっちり考えられるか、といったポイントが重要になるでしょう。

他にもC言語におけるプログラムの記述方法とアルゴリズムで使う疑似言語は、内容が非常に似ているという注目すべき点があります。

 

例えば、C言語において欠かせないループ処理。

C言語ではfor文の場合、以下のような書き方をしますが、

  • C言語
    for(i = 0; i < 3; i++){
    }
  • 疑似言語
    ■i:0, i < 3, 1

アルゴリズムの疑似言語では、以下のような書き方をします。

両方を見比べてみると、非常に書き方が似ているのが分かるかと思います。

そのためC言語の勉強はアルゴリズムに、アルゴリズムの勉強はC言語に繋がると思って勉強を進めると、勉強のモチベーションアップに一役買ってくれるでしょう。

 

チョコ
チョコ

ちなみにC言語とアルゴリズム、どっちの勉強を先にしたら良いんだ?

シロ
シロ

正直言って、どっちでも良いかなといった感じだよ。ただC言語の勉強をスムーズにしたいなら、アルゴリズムを先に勉強しておいた方が良いかもね

C言語の勉強法について

・問題文とプログラムを結び付ける

問題文

基本情報技術者試験の午後試験では、問題文とプログラムを結び付けるという方法が重要です。

もちろんC言語においても、問題文とプログラムを結び付けるという行為は、
問題を解答するまでの時間短縮解答の確実性を上げるといったポイントに繋がるため、確実に押さえておきたい解答方法と言えるでしょう。

 

ちなみに問題文とプログラムを結び付けるという方法が、有効になった例として、以下の問題の空白「b」と「d」をご覧ください。

平成26年 秋期 午後試験 問9-8
平成26年 秋期 午後試験 問9-1
平成26年 秋期 午後試験 問9-9
平成26年 秋期 午後試験 問9-10
平成26年 秋期 午後試験 問9-2
平成26年 秋期 午後試験 問9-3
平成26年 秋期 午後試験 問9-6
平成26年 秋期 午後試験 問9-7

出典:平成26年 秋期 午後試験 問9より抜粋

今回は必要最小限の内容だけを抜粋していますが、パッと見るだけでプログラムの説明とプログラムがリンクしている、というポイントが分かると思います。

あとは、プログラムの説明を解答に当てはめるだけ。

かなり短い時間で問題が解けるようになります。

  • 空欄「b」の解説

    空白「b」は、空白「b」以下の処理によって、
    “特権S”の付加と解除を、加えて“特権O”の付加と解除を、条件を満たす場合に出力しているようです。
    つまり問題文の(3)の③に該当する処理が、問題「b」とリンクしていることが分かります。

    更に③の説明には、
    「NewFile 及び OldFile の両方にあり、特権Sと特権Oの少なくとも一方の付加状況が変わった利用者IDの場合」と書いてあるため、
    NewFileの内容とOldFile の内容を比較して、どちらか一方の内容でも違う場合という処理を選べば良い訳です。

    ※ちなみにNewAttrには、NewFileの内容(8ビット列)、OldAttrには、OldFile の内容(8ビット列)が入っています。
    またBitS(ビット列00001000)とBitO(ビット列00000100)には、特権Sと特権Oの付加条件が入っています。

    以上の点を踏まえると、
    NewAttrに入っているビット列が「01001000」だとして、4桁目の特権Sの情報と3桁目の特権Oの情報を抽出して比較するには、

    特権SのBitS(ビット列00001000)と特権OのBitO(ビット列00000100)を組み合わせた
    BitS+BitO「00001100」とNewAttrの「01001000」をand条件で抽出すれば00001000となりNewAttrが”特権S”を付与されているという情報が得られます。

    つまり答え「ウ」の前半であるNewAttr & (BitS + BitO)が該当するようになります。

    あとはOldAttrも同様に、OldAttr & (BitS + BitO)とすれば、
    答えは「ウ」の「NewAttr & (BitS + BitO) != OldAttr & (BitS + BitO)」になる訳です。

空欄「d」の解説

空白「d」もまずは、空白「b」と同じく、
空白「d」に続く処理を見てみましょう。
すると、空白「d」の後処理では、“特権S”の付加と”特権O”の付加を行っているようです。
つまり空白「d」の処理は、(3)の①の説明とリンクしているのが分かると思います。

また①の説明には、
「NewFile 中にあって OldFile 中にない利用者IDの場合」
と書いてあります。
要は新旧の利用者IDを比較している処理を考えればOKです。

次に図1の入力ファイルNewFile及びOldFileのデータ例をご覧ください。
図を見てみると、それぞれの利用者IDは昇順にソートされているのが分かると思います。
例えば、
NewFileにAP003  OldFileにAP004 
     AP004              AP005
というIDが入っているとして、それぞれを比較すると、
① AP003 < AP004 条件に合致する
② NewFileの内容を読み込む
③ AP004 = AP004 条件に合致しない
といった具合になり、
AP003のみが「NewFile 中にあって OldFile 中にない利用者IDの場合」に合致します。

そして(5)のライブラリ関数strcmpの仕様に照らし合わせると、
答えは「ウ」の「strcmp(NewID, OldID) < 0」が該当するようになります。

問題文とプログラムを結び付けるという方法は、C言語の問題を解くのに必要不可欠な方法です。

また問題を解くスピードも上げるため、是非ともマスタ―できるように勉強してください。

 

チョコ
チョコ

ちなみに問題文とプログラムを結び付けるという方法を身に付けるにはどうしたら良いんだ?

シロ
シロ

うーん。正直言って、問題文とプログラムを読み込むしかないかな。あとは問題を慎重に答えるというポイントも重要だね

チョコ
チョコ

サクッと身に付けられるものではなさそうだな

シロ
シロ

まあ仕方がないね。サクッと身に付けられるスキルなら、もっとC言語を選ぶ人も多いだろうし、合格率も高くなると思うよ

スポンサーリンク

・消去法ではなく処理をしっかり追う

ポイント

プログラムがよく分からないし、選択肢を見て、消去法で問題を答えるようにしよう!

基本情報技術者試験のプログラミング言語の問題においてよくある光景です。

しかし上記のような考え方は、問題の製作者に見抜かれているため、高確率で問題を間違える羽目になります。

だからこそ勉強時間の許す限りは、できるだけ問題の内容やプログラムを理解するようにして、プログラムの処理と解答が合致するまで粘り強く勉強をしてください。

 

ちなみに勉強時間や試験時間がほとんど無いといった状態でも、ある程度プログラムを読んで当たりをつけてから、消去法を使うようにしましょう。

できる限り問題を自力で考えて、
消去法で問題を答えるのは最終手段だとして覚えておいてください。

チョコ
チョコ

C言語はプログラムにおいて、変数やら配列やら読み取る内容が多いから、どうしても途中で集中力が途切れてしまうな・・・

シロ
シロ

まあどうしてもという場合には、諦めて解説と解答を見ることも重要だよ。ただ解答と解説を見る場合でも、問題の内容を理解できるようになるまで粘った方が良いけどね

・時間制限を決めて問題を解く

制限時間

C言語の勉強を進める際には、
時間制限を決めて問題を解くといった練習も重要です。

何故こんな基本的な話をするかというと、
C言語の問題は難しく、問題を解く時間が長くなりやすいからです。

そのため内容を理解する点に気を取られ過ぎると、いざ試験が始まって、

C言語の問題を解いていたら、試験時間がほとんど無い・・・

なんて状況に陥るため注意が必要と言えます。

 

だからこそC言語の問題を解いて、プログラムをトレースする行為に慣れたら、制限時間を決めて問題を解く練習をしてください。

基本情報技術者試験の午後試験においては、問題を正確に解くといった行為も重要ですが、
問題を素早く解くといった点も、試験の点数に直結するため注意しましょう。

 

チョコ
チョコ

ちなみにC言語の問題は、どのくらいの時間で解くのが目安になるんだ?

シロ
シロ

そうだね。大体30分ぐらいかな。ただ問題の難易度によってブレが発生しやすい内容だから、他の問題で試験時間を貯金しておいた方が良いよ

・ビット列を使った論理演算も復習

ビット列

C言語において、意外に出題率が高い内容。

それがビット列を使った論理演算です。

そのためC言語の勉強に完璧を期したい場合は、ビット列を使ったOR、AND、XORといった論理演算を練習しておきましょう。

また机上でビット演算をやるだけでなく、
C言語のプログラム上でもビット演算に慣れておく必要があります。

例えば「問題文とプログラムを結び付ける練習をする」の見出しでも解説した以下の選択肢。

平成26年 秋期 午後試験 問9-6
平成26年 秋期 午後試験 問9-7

出典:平成26年 秋期 午後試験 問9より抜粋

選択肢で使われているNewAttrやOldAttr、BitSやBitOといった変数には、ビット列が含まれています。

ビット列を単純に計算している、比較しているだけだと、上記のような問題に対応できないため、必ずC言語のプログラム上(過去問題でも構わない)でビット列に慣れておいてください。

 

チョコ
チョコ

C言語とビット列って何だか意外な組み合わせだな。もっと高度な内容を取り扱うのかと思った

シロ
シロ

うーん。むしろC言語という、プログラミング言語の用途の広さが分かる問題と言えるのかも知れないよ。

チョコ
チョコ

なるほど。C言語を勉強しておくと、他の言語に応用が利くという話は、そういった点からも来ているのかもな

スポンサーリンク

・保険としてアセンブラか表計算を勉強しておく

リスク管理

C言語というプログラミング言語は、
問題によって難易度に大きな差があるといった特徴があります。

例えば簡単な問題ならば、
「問題文とプログラムを結び付ける練習をする」の見出しでも紹介した通り、サクッと数分で問題を答えられます。

しかし難しい問題に当たると、
C言語の現役プログラマーでも答えるのに苦労するぐらい時間が掛かる問題もあるでしょう。

そのためC言語の勉強を進める際には、
保険としてアセンブラか表計算の勉強をしておくことをおススメします。

 

もちろん人によっては、

C言語の勉強だけでも手一杯なのに、
アセンブラの勉強なんか手が回らないよ

と考えを持つ人がいるかも知れません。

しかしアセンブラと表計算は、C言語の問題と学習量に比べたら、問題はかなり簡単で、学習量も少なくて済みます。

むしろC言語の勉強をキッチリ進めている人からすれば、

アセンブラってこんなに簡単なんだ!

と思える可能性もあるため、是非とも覚えておいてください。

 

ちなみにC言語から、アセンブラか表計算の勉強に移行する場合は、

  • アセンブラ
    ビット計算の復習
  • 表計算
    セルの移動や参照方法

といったポイントを重視して勉強を進めると良いでしょう。

それぞれプログラムにおいて特有のポイントを押さえてしまえば、勉強がスムーズに進むため、必ず覚えておくようにしてください。

 

チョコ
チョコ

言い方は悪いかも知れないが、逃げ道を作っておくことも本番の試験では重要なのかも知れないな

シロ
シロ

C言語の場合は、難しい問題が出題されるから特にね。そもそも試験合格が第一目標なんだから、別に悪い行為ではないと思うよ

まとめ

今回C言語の勉強法と勉強において注意すべきポイントについて解説しました。

C言語の注意すべきポイント

  • プログラムの処理を理解するならば、プログラムをトレースする
  • 配列の要素数に対して、常に注意しておく
  • i++や++iの演算子については、処理の順番を把握しておく

C言語の問題傾向

  • 文字列を題材とした問題は、出題率が高いため要注意
  • C言語にはアルゴリズムの要素が入る

C言語の勉強法について

  • 問題文とプログラムを結び付ける
  • 消去法ではなく処理をしっかり追う
  • 時間制限を決めて問題を解く
  • ビット列を使った論理演算も復習する
  • C言語を選ぶ際には、保険としてアセンブラか表計算を勉強しておく

かなり長くなってしまったため、読むのが辛かったと思いますが、C言語において重要なポイントは詰め込んだつもりです。

そのため是非とも今回読んだポイントを元に、C言語の勉強の糧にして頂ければと思います。

 

ちなみにC言語の勉強には、開発環境を利用すると、より効率的に勉強が進められます。

以下のページでは、C言語の開発環境について解説しているため、是非とも参考にしてください。

C言語の開発(テスト)環境について
C言語の開発(テスト)環境には、インターネット上で使えるソフト、本格的な開発を目的としたソフト、様々な種類があります。そのためご自分の環境や勉強の状態を加味して、開発環境を選ぶと、勉強が効率的に進められるようになります。

ここまでお読み頂き誠にありがとうございました。

それでは皆様の検討を祈っております。

C言語の勉強法と勉強において注意すべきポイント Part1
コチラでは基本情報技術者試験におけるC言語の勉強法、勉強において注意すべきポイントについて解説しています。C言語はアセンブラや表計算と比べて、問題の難易度が格段に高いため、スケジュールに余裕を持たせて勉強を始めましょう。

コメント