この記事は、組込みエンジニアを目指してC言語を学び始める人のための練習問題シリーズ(全8テーマ)の目次となる記事です。

分厚い入門書を最初から全部やるのは大変ですし、すぐに転職したい方からするともっと手軽に勉強したいなと思う方も多いかと思います。
本記事では、転職するにあたり必要最低限のC言語の知識を講義形式の解説と自作の練習問題・回答例を用意しました。

<自己紹介>
筆者は現役の車載組込みソフトエンジニアです。機械系出身でゼロ知識からこの世界に入り、自分がC言語(特にポインタ)でつまずいた経験をもとに、「組込みで結局使うのに、習っていないから詰まる」要素だけを必須として選びました。このシリーズで最低限の言語知識を理解し、最終的にArduinoでマイコンプログラムを自作できるようになるのをゴールにしています。

学修記事の読み方について

C言語は、数あるプログラムの中でも特に細かくルール決めがされており、いざ自分でコードを書くと、変数の宣言のしかたやfor文の書き方が思い出せず、手が止まることが多々あります。これは知識が「読む」止まりで、「書ける」に変わっていないからです。

そこでこのシリーズは、各テーマを講義形式の解説+練習問題と回答例で身につける形にして実際に手を動かしながら学べる形式の記事を作成しています。

  • 上から順に解く(後のテーマは前のテーマで学習した内容を使用するため)
  • まず自分で書いてみて、回答例と照らし合わせる(回答は各問題の「+」で開きます)
  • 各記事の「例:実務で実際に書くコード」で、その文法が実際の開発のどこで使用されるかを確認する

本記事の読者対象は「C言語はほぼ初めて」「組込みやマイコンの学習を始める前に基礎を最低限得たい」人です。なぜ組込みでそもそもC言語なのかが気になる人は、先に組込みでC言語が使われる理由を読むと、良いかもしれませんね

練習問題の実行環境について

学習前に一つだけ。C言語は、テキストで書いても動かないのでコンパイル⇒実行の手順が必要です。「コンパイル」とは、人間が書いたC言語のコードを、コンピューター(マイコン)が実行できる形に翻訳する作業のことです。プログラムは「書く → コンパイルする → 実行する」の順で動きます。とはいえ身構えなくて大丈夫で、下で紹介する環境なら「実行」を押すだけで、裏でコンパイルまで自動でやってくれます。

問題を解き始める前に、書いたコードを実際に動かす場所を決めておきましょう。ここでつまずくと肝心の練習に進めません。だから最初は「インストール不要」で始めるのがおすすめです。目的別に3つ挙げます。

タイプ 使うもの こんな人に
①今すぐ始めたい オンライン実行環境(paiza.IO など) まず手を動かしたい人。インストール不要で、ブラウザだけでCを書いて実行できる
②ローカル環境で実行したい VS Code + gcc(Windowsは MSYS2 で導入) ローカル環境でいろいろ試したい方。VSコードでコードを書きたい方。

迷ったら①でOKです。paiza.IOなら、サイトを開いて言語で「C」を選び、コードを書いて実行ボタンを押すだけ。環境構築で消耗せず、すぐに1問目へ取りかかれます。数をこなして「ちゃんとした環境が欲しい」と感じてから、②のローカル環境(VS Code+gcc)へ上がれば十分です。gccのインストールは初心者がつまずきやすいので、基礎を掴んでからで構いません。

VS Codeのターミナルにprintfの実行結果「合計 = 360 円」が表示されている画面
筆者の環境(VS Code+gcc)での実行例。printf の結果がこのようにターミナルへ表示される

なお、このドリルの問題はすべて、結果を printf で画面に出す素のC言語で解きます。マイコン実機ではプログラムの入口や表示のしかたが少し変わりますが、変数・if・ループ・関数といった文法そのものはまったく同じです。まず①②で文法を固めるその後に少し難易度の高いプログラムを書きましょう。

組込みCの必須8テーマ一覧

これが本シリーズの全体像です。以下8テーマはすべて学んでいただきたく。というのも実際に私が未経験転職した際に実際に就職試験で求められた言語知識だからですまたここを飛ばすと、マイコンのコードの学習記事を読むときに「習っていない文法がいきなり出てくる」といった状態になってしまい。困るかと思います。
ですので最低限以下のテーマは理解していただき。その後のマイコン学習に以降していただきたいと思います。

# テーマ 学べること 組込みでどこで使う(必須の理由) 練習記事
1 変数・型・演算子
===
型と入る値の範囲、定数、四則・比較・論理、printf センサー値・設定値の管理。===の取り違えは鉄板バグ 記事を読む
2 if / else 条件分岐 if・else if・switch・三項演算子 センサー値で「暗ければ点灯」など動作を分ける。モードの切り替え 記事を読む
3 for / while ループ 繰り返し、do-while、break / continue、前置と後置 LEDの点滅、データの一括処理。メインループ(無限ループ) 記事を読む
4 配列 宣言・添字・走査・2次元配列 センサー値の履歴保存、通信データの中身 記事を読む
5 関数
(引数・戻り値)
定義・引数・戻り値・プロトタイプ宣言・スコープ 処理の部品化。実務のコードは関数の集まりでできている 記事を読む
6 ポインタ(最小限) &*、なぜ必要か レジスタ操作、文字列・配列を関数に渡す 記事を読む
7 構造体(最小限) 複数のデータを1つに束ねる、typedef センサー1個ぶんの情報や通信フレームをまとめて管理 記事を読む
8 ビット演算 & | ^ ~ << >>、マスク・シフト ピン・レジスタをビット単位で操作=組込みの日常 記事を読む

1〜5はどんなプログラムでも使う「超基本の知識」、6〜8は組込みで使用されることが多い「マイコン向けの3つ」です。とくに8のビット演算は、WebやアプリのC学習ではあまり強調されませんが、マイコンのピンやレジスタをいじる組込みでは日常的に使います

学習の順番について

迷ったら、次の順番で進めてください。後ろのテーマは前のテーマの内容をそのまま使うので、順番に積み上げるのが最短です。

📚 おすすめの学習順

1 変数=と==
2 if分岐
3 ループfor/while
4 配列複数データ
5 関数部品化

= ここまでが基本の知識 =

6 ポインタ最大の山場
7 構造体データのまとめ
8 ビット演算レジスタ操作
図:5テーマで基礎を作り、組込み色の3テーマを終盤で学ぶ

コツは「1テーマずつ、必ず自分の手でコードを書く」こと。読んで分かった気になるのが一番のダメです。1〜5まで進めば、マイコンの入門記事(Lチカなど)は8割がた読めるようになります。6〜8は、より組込みらしいコードを読み書きする際に必須となります。そして8テーマをすべて解き終えたら、総合実力テスト(エアコン模擬プログラム)で総仕上げです。要件定義書と設計書をもとに、8テーマ全部を1本のプログラムとして組み上げます。

未経験がつまずく2大ポイント

8テーマの中でも、未経験者が特につまづきやすいポイントがありますので学習開始前に記載しておきます。

①「=」と「==」の取り違え

C言語では、=(代入)と==(等しいか比較)はまったくの別物です。ところが見た目が似ているため、if (x = 5) のように書いてしまう間違いが定番です。これはエラーにならずに動いてしまうことがあるので、原因に気づきにくい厄介なバグになります。テーマ1で、ここを最初に固めます。

②ポインタの壁

もう一つの山場がポインタ(テーマ6)です。多くの人が入門書のポインタの章で挫折します。ただ、組込みではポインタを避けて通れません。レジスタ操作も、関数にデータを渡す場面も、ポインタを使うからです。

<一言メモ>
ポインタを理解するにはメモリを理解する必要があるのですが、これが最もつまづきき易いポイントになるかと思います。
そのため、ポインタ関連の記事は特に手厚く初学者でも理解しやすい記事を作成していますのでご安心ください。

だからこのシリーズでも、ポインタは座学だけで悩まず、実際のマイコンで動かしながら覚えることをおすすめします。ポインタがなぜ組込みでそこまで重要なのかは、テーマ6のポインタが組込み開発で重要になる理由で、練習問題とあわせて掘り下げます。

さらに演習したい人へ(参考)

本シリーズの問題は、組込み向けにすべて自作したものです。「もっと数をこなしたい」「大学の演習レベルで腕試ししたい」という人は、外部の問題集にあたるのも良い方法です。たとえば京都産業大学が公開している基礎プログラミング演習I「100本ノック」は、C言語の基礎を段階的に練習できる問題集として参考になります(本シリーズはこの問題を転載・流用していません)。

次に読む

この問題集で基礎を固めたら、次のステップに進みましょう。

まとめ|8テーマだけ手を動かせばいい

最後に要点を整理します。

  • 組込みの入口で必要なC言語は、必須8テーマ(変数・if・ループ・配列・関数・ポインタ・構造体・ビット演算)で足りる
  • 1〜5が絶対コア、6〜8が組込み色の3つ
  • つまずきやすいのは「=と==」「ポインタ」の2か所
  • 読むだけにせず、各テーマの練習問題で「書ける」状態にするのが近道

分厚い入門書を1冊やりきる必要はありません。この8テーマだけ手を動かせば、組込みの学習でC言語に足を引っぱられなくなります。まずはテーマ1の変数・型・演算子から始めてみてください。

よくある質問(FAQ)

どのテーマから始めればいい?

テーマ1の「変数・型・演算子」からで大丈夫です。後のテーマは前のテーマを使うので、番号順に進めるのが一番スムーズです。完全な初心者ほど、順番を飛ばさないことをおすすめします。

8テーマ全部やらないとダメ?

組込みの学習を快適に進めたいなら、8テーマすべてが必須です。どれも実際のコードで登場するため、飛ばすと「習っていない文法が出てきて詰まる」ことになります。まずは1〜5のコアだけでも、マイコンの入門記事はかなり読めるようになります。

どれくらいで一周できる?

人によりますが、1テーマあたり30分〜1時間、全8テーマで合計10時間前後が目安です。完璧を目指すより、まず一周して、実際にマイコンを動かしながら理解を深めるのが現実的です。

問題はどこかの転載?

いいえ。本シリーズの問題はすべて、筆者が組込み向けに自作したものです。外部サイトの問題を転載・流用していません。さらに数をこなしたい人向けに、参考として外部の問題集を紹介しています。