Contents
全体像と学習スケジュール
| Day | 主なテーマ | 推定学習時間 | チェックリスト例 |
|---|---|---|---|
| 1 | 開発環境構築・Hello, World | 1‑2 h | IDE 起動、コンパイル成功 |
| 2 | 基本データ型・標準入出力 | 1‑2 h | 入力 → 出力 が期待通りに動作 |
| 3 | 条件分岐・繰返し構文 | 1‑2 h | メニューが正しくループ |
| 4 | 関数化・ヘッダーファイル | 1‑2 h | 自作関数が呼び出せる |
| 5 | 配列・文字列・標準ライブラリ | 1‑2 h | 境界チェックでエラーなし |
| 6 | ポインタと動的メモリ管理 | 1‑2 h | malloc / free が正常に完了 |
| 7 | ミニプロジェクト(電卓/ファイル I/O) | 1‑2 h | ビルド・実行・結果検証 |
学習のコツ
- 毎日同じ時間帯に学習することで、コンテキストスイッチを減らす。
- コードを書いたら必ず ビルド → 実行 → 動作確認 のサイクルを回す。
- エラーが出たときは公式ドキュメントやスタックオーバーフローで検索し、解決策をメモしておく。
Day 1 – 開発環境の構築
1‑1. 必要ツールとバージョン情報
| ツール | 推奨バージョン(2026 年 4 月時点) | ダウンロード URL |
|---|---|---|
| Visual Studio 2022 (Community) | 17.9.5 | https://visualstudio.microsoft.com/vs/ |
| Visual Studio Code | 1.88.0 | https://code.visualstudio.com/ |
| C/C++ 拡張(Microsoft) | 1.16.5 | VS Code → Extensions → “C/C++” |
| Windows 用コンパイラ (MSVC) | 19.40 (Visual Studio に同梱) | 同上 |
| macOS 用コンパイラ (clang) | 17.0.3 (Xcode Command Line Tools) | xcode-select --install |
注: Visual Studio 2026 は執筆時点で正式にリリースされていません。代わりに現在安定版の Visual Studio 2022 を使用します。
1‑2. インストール手順
Windows
- Visual Studio Installer を起動し、
Desktop development with C++ワークロードを選択してインストール。 - 同時に Git for Windows(https://git-scm.com/)も導入すると、ターミナルで
gitが使えるようになります。
macOS
- ターミナルで
xcode-select --installを実行し、Command Line Tools (clang) をインストール。 - VS Code を公式サイトからダウンロードして展開。
共通(VS Code 設定)
- 拡張機能: 「C/C++」(Microsoft) と「Code Runner」(バージョン 0.13.1)をインストールすると、エディタ上で
Ctrl+Alt+Nだけでコンパイル&実行が可能。 - 設定ファイル (
c_cpp_properties.json):
json
{
"configurations": [
{
"name": "Mac",
"includePath": ["${workspaceFolder}/**"],
"macFrameworkPath": ["/Library/Developer/CommandLineTools/usr/lib"],
"compilerPath": "/usr/bin/clang",
"cStandard": "c17",
"cppStandard": "c++20"
},
{
"name": "Win32",
"includePath": ["${workspaceFolder}/**"],
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.40.33807/bin/Hostx64/x64/cl.exe",
"cStandard": "c17",
"cppStandard": "c++20"
}
],
"version": 4
}
1‑3. 環境動作確認
|
1 2 3 4 5 6 7 8 |
/* hello.c */ #include <stdio.h> int main(void) { printf("Hello, C language!\n"); return 0; } |
- VS Code →
Ctrl+Alt+N(またはターミナルでgcc hello.c -o hello && ./hello) - Visual Studio → 「新しいプロジェクト」→「空の C++ プロジェクト」→
hello.cを追加し、デバッグ実行。
チェックリスト
1. IDE がエラーなく起動できるか。
2. 上記コードがコンパイル・実行され、「Hello, C language!」と表示されるか。
Day 2 – 基本データ型と標準入出力
学習目標
| 項目 | 内容 |
|---|---|
| データ型 | int, float, double, char, bool(stdbool.h) |
| 入出力関数 | printf, scanf, puts, gets_s(Windows) |
| フォーマット指定子 | %d, %f, %lf, %c, %s など |
実践コード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/* datatype_io.c */ #include <stdio.h> #include <stdbool.h> int main(void) { int i = 42; float f = 3.14f; double d = 2.71828; char c = 'A'; bool b = true; printf("整数: %d\n", i); printf("単精度浮動小数点: %.2f\n", f); printf("倍精度浮動小数点: %.5lf\n", d); printf("文字: %c\n", c); printf("真偽値: %s\n", b ? "true" : "false"); /* 標準入力例 */ char name[30]; printf("名前を入力してください> "); scanf("%29s", name); // バッファオーバーフロー防止 printf("こんにちは、%s さん!\n", name); return 0; } |
確認ポイント
- コンパイル:
gcc datatype_io.c -Wall -Wextra -o dtype - 実行結果が期待通りか(数値・文字・真偽値の表示、入力後に挨拶が出る)。
Day 3 – 条件分岐・ループ構文
主な構文と使用例
| 構文 | 用途 | 代表的サンプル |
|---|---|---|
if / else if / else |
単一条件分岐 | 入力値が正か負かの判定 |
switch |
整数・文字列(C17 の _Generic で代替) |
メニュー選択 |
for |
カウンタ制御ループ | 配列走査 |
while / do‑while |
条件が変化するまでの繰り返し | ユーザーからの「終了」指示待ち |
演習課題(メニュー形式)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/* menu.c */ #include <stdio.h> #include <stdbool.h> int main(void) { int choice; bool running = true; while (running) { printf("\n=== メニュー ===\n"); printf("1: 数当てゲーム\n"); printf("2: 素数判定\n"); printf("0: 終了\n"); printf("> "); scanf("%d", &choice); switch (choice) { case 1: { int secret = 7, guess; printf("1〜10 の数字を当ててください> "); scanf("%d", &guess); if (guess == secret) puts("正解!"); else printf("残念、答えは %d\n", secret); break; } case 2: { int n, i, isPrime = 1; printf("素数か判定したい整数> "); scanf("%d", &n); if (n < 2) isPrime = 0; for (i = 2; i * i <= n && isPrime; ++i) if (n % i == 0) isPrime = 0; printf("%d は %s 素数です。\n", n, isPrime ? "素" : "非"); break; } case 0: running = false; break; default: puts("無効な選択です。"); } } return 0; } |
チェックリスト
switchの default が機能するか。forで配列の走査や素数判定が正しく行えるか。- 無限ループに陥らないこと(
running = false;が確実に呼ばれる)。
Day 4 – 関数とヘッダーファイル
ベストプラクティスまとめ
| 項目 | 推奨手法 |
|---|---|
| 関数の宣言 | ヘッダー (.h) にプロトタイプだけを書き、実装は .c に分離する。 |
| インクルードガード | #ifndef … #define … #endif で多重インクルードを防止。 |
| 静的リンク | 同一ディレクトリに置く場合は相対パスで #include "utils.h" と記述。 |
| ビルドコマンド例 | gcc main.c utils.c -o app(Windows でも同様) |
サンプルプロジェクト構成
|
1 2 3 4 5 6 7 8 |
c_basics/ │─ src/ │ ├─ main.c │ └─ math_utils.c │─ include/ │ └─ math_utils.h │─ Makefile |
math_utils.h
|
1 2 3 4 5 6 7 8 9 10 |
#ifndef MATH_UTILS_H #define MATH_UTILS_H int add(int a, int b); int sub(int a, int b); int mul(int a, int b); double div_double(double a, double b); // ゼロ除算は呼び出し側でチェック #endif /* MATH_UTILS_H */ |
math_utils.c
|
1 2 3 4 5 6 7 8 9 10 |
#include "math_utils.h" int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } double div_double(double a, double b) { return a / b; // 呼び出し側で b != 0 を保証 } |
main.c
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> #include "math_utils.h" int main(void) { int x = 10, y = 3; printf("%d + %d = %d\n", x, y, add(x, y)); printf("%d / %.2f = %.2f\n", x, (double)y, div_double((double)x, (double)y)); return 0; } |
ビルド手順(Makefile の例)
|
1 2 3 4 5 6 7 8 9 10 11 |
CC := gcc CFLAGS := -Wall -Wextra -Iinclude SRCS := src/main.c src/math_utils.c TARGET := c_basics_app $(TARGET): $(SRCS) $(CC) $(CFLAGS) $^ -o $@ clean: rm -f $(TARGET) |
ポイント:
makeコマンドでmake→ ビルド、make clean→ 削除。
Day 5 – 配列・文字列・標準ライブラリ
配列の基本と注意点
| 項目 | 説明 |
|---|---|
| 静的配列 | コンパイル時にサイズが決まる(例: int a[10];)。 |
| 可変長配列 (VLA) | C99 以降、実行時にサイズを決定できるが、スタック使用量に注意。 |
| 境界チェック | 手動でインデックス範囲を確認するか、assert() を活用。 |
配列走査例
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <stdio.h> #define LEN 5 int main(void) { int nums[LEN] = {10, 20, 30, 40, 50}; for (size_t i = 0; i < LEN; ++i) printf("nums[%zu] = %d\n", i, nums[i]); return 0; } |
文字列操作(string.h)
| 関数 | 主な用途 |
|---|---|
strcpy(dest, src) |
コピー(バッファサイズ確認が必須) |
strlen(s) |
長さ取得(ヌル終端まで走査) |
strcmp(a,b) |
比較(0 が等しい) |
strncmp(a,b,n) |
部分比較 |
strncpy(dest, src, n) |
安全コピー(ただし末尾に必ず \0 を入れる必要あり) |
文字列サンプル
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> #include <string.h> int main(void) { char buf[32]; const char *msg = "C言語学習"; /* 安全コピー */ strncpy(buf, msg, sizeof(buf) - 1); buf[sizeof(buf) - 1] = '\0'; // 確実に終端 printf("文字列: %s (長さ=%zu)\n", buf, strlen(buf)); return 0; } |
標準ライブラリ活用例(乱数生成)
|
1 2 3 4 5 6 7 8 9 10 11 |
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { srand((unsigned)time(NULL)); // シード設定 int dice = rand() % 6 + 1; // 1〜6 の乱数 printf("サイコロの出目: %d\n", dice); return 0; } |
チェックリスト
配列要素が期待通りに格納・取得できるか。
strncpy後に必ずヌル文字が入っているか。
*rand()の結果が毎回変わることを確認(シード設定)。
Day 6 – ポインタ入門とメモリ管理
ポインタ基礎概念
| 用語 | 説明 |
|---|---|
アドレス取得 & |
変数のメモリアドレスを取得(例: int *p = &x;) |
間接参照 * |
ポインタが指す先の値にアクセス(例: printf("%d", *p);) |
| 配列とポインタの関係 | 配列名は先頭要素へのポインタとして暗黙的に変換される。 |
デモコード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <stdio.h> int main(void) { int a = 123; int *pa = &a; // アドレス取得 printf("a の値: %d, ポインタ経由の値: %d\n", a, *pa); /* 配列とポインタ */ int arr[3] = {10, 20, 30}; int *p = arr; // arr は &arr[0] と同等 for (int i = 0; i < 3; ++i) printf("arr[%d] = %d ( *(p+i) = %d )\n", i, arr[i], *(p + i)); return 0; } |
動的メモリ確保と解放
| 関数 | 用途 |
|---|---|
malloc(size) |
ヒープ領域の確保(失敗時は NULL) |
calloc(n, size) |
ゼロ初期化付き確保 |
realloc(ptr, newSize) |
サイズ変更 |
free(ptr) |
解放 |
実践例:整数配列の動的確保
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <stdio.h> #include <stdlib.h> int main(void) { const size_t N = 5; int *vec = malloc(N * sizeof(int)); if (!vec) { perror("malloc"); return 1; } for (size_t i = 0; i < N; ++i) vec[i] = (int)(i * 2); // 初期化 printf("動的配列の内容: "); for (size_t i = 0; i < N; ++i) printf("%d ", vec[i]); puts(""); free(vec); // 必ず解放 return 0; } |
重要:
free後にポインタをNULLに設定すると、二重解放やダングリング参照のリスクが減ります。
Day 7 – ミニプロジェクトで総復習
プロジェクト概要
| 項目 | 内容 |
|---|---|
| 名前 | calc_io(簡易電卓+結果ファイル保存) |
| 使用技術 | 変数・入出力・条件分岐・関数・ポインタ・動的メモリ |
| 成果物 | 実行可能バイナリと result.txt(計算履歴) |
ディレクトリ構成
|
1 2 3 4 5 6 7 8 9 |
calc_io/ │─ src/ │ ├─ main.c │ └─ utils.c │─ include/ │ └─ utils.h │─ Makefile │─ README.md |
utils.h(バージョン情報付き)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#ifndef UTILS_H #define UTILS_H /* プロジェクトバージョン (2026.04) */ #define PROJECT_VERSION "1.0.0-20260421" void print_banner(void); double evaluate(double a, double b, char op); int save_result(const char *path, const char *expr, double result); #endif /* UTILS_H */ |
utils.c
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include "utils.h" #include <stdio.h> #include <stdlib.h> void print_banner(void) { printf("=== 簡易電卓 (ver %s) ===\n", PROJECT_VERSION); } double evaluate(double a, double b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return (b != 0.0) ? a / b : NAN; default: return NAN; } } /* 計算結果をテキストファイルに追記 */ int save_result(const char *path, const char *expr, double result) { FILE *fp = fopen(path, "a"); if (!fp) return -1; fprintf(fp, "%s = %.6f\n", expr, result); fclose(fp); return 0; } |
main.c
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include "utils.h" int main(void) { print_banner(); while (1) { double a, b, res; char op[4]; // 演算子 + 余白用 printf("\n式を入力 (例: 3.5 * 2) または q で終了 > "); if (scanf("%lf %3s %lf", &a, op, &b) != 3) { /* 入力が不正、または q が入力されたとき */ char term; scanf("%c", &term); // 改行文字を消費 break; } res = evaluate(a, b, op[0]); if (isnan(res)) { puts("エラー: 無効な演算子またはゼロ除算です。"); continue; } printf("結果: %.6f\n", res); /* 結果をファイルに保存 */ char expr[64]; snprintf(expr, sizeof(expr), "%.2f %c %.2f", a, op[0], b); if (save_result("result.txt", expr, res) == 0) puts("結果を result.txt に保存しました。"); else perror("ファイル書き込み失敗"); } puts("\nプログラムを終了します。お疲れ様でした!"); return 0; } |
ビルド手順(Makefile)
|
1 2 3 4 5 6 7 8 9 10 11 |
CC := gcc CFLAGS := -Wall -Wextra -Iinclude -std=c17 SRCS := src/main.c src/utils.c TARGET := calc_io $(TARGET): $(SRCS) $(CC) $(CFLAGS) $^ -o $@ clean: rm -f $(TARGET) result.txt |
実行例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ ./calc_io === 簡易電卓 (ver 1.0.0-20260421) === 式を入力 (例: 3.5 * 2) または q で終了 > 12 / 4 結果: 3.000000 結果を result.txt に保存しました。 式を入力 (例: 3.5 * 2) または q で終了 > q プログラムを終了します。お疲れ様でした! $ cat result.txt 12 / 4 = 3.000000 |
総合チェックリスト
| 項目 | 判定基準 |
|---|---|
| コンパイル | make がエラーなく完了し、実行ファイルが生成される。 |
| 電卓機能 | 四則演算すべてが正しい結果を出力する(除算でゼロ割りは NaN)。 |
| ファイル I/O | result.txt が作成・追記され、期待通りのフォーマットで保存される。 |
| コード品質 | -Wall -Wextra で警告が出ないこと。 |
| ポインタ使用 | utils.c の save_result が FILE * を正しく扱っている。 |
教材リンクの正当性・有効期限情報
| 番号 | 書籍/教材名 | ISBN / DOI | 発行元(出版社) | URL(公式ページ) | 最終確認日 | コメント |
|---|---|---|---|---|---|---|
| 1 | 「1週間でC言語の基礎が学べる本 第2版」 | ISBN: 978-4297117956 | インプレス | https://book.impress.co.jp/books/1125101129 | 2026‑04‑15 | 現在販売中。紙書籍と Kindle 両方利用可。 |
| 2 | Microsoft Docs – C/C++ 開発環境 | - | Microsoft | https://learn.microsoft.com/ja-jp/cpp/ | 同上 | 無料の公式ドキュメント。定期的に更新されるのでリンク切れは起きにくい。 |
| 3 | Visual Studio Code – C/C++ 拡張 | - | Microsoft | https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools | 同上 | バージョン番号は拡張機能ページで確認可能(2026‑04‑15 時点で 1.16.5)。 |
| 4 | GNU Compiler Collection (GCC) – ダウンロード | - | GNU Project | https://gcc.gnu.org/ | 同上 | Windows/macOS/Linux 向けビルドが提供されている。 |
リンクの有効期限: 上記 URL は公式サイト・マーケットプレイスへの直接リンクですので、2028 年以降も基本的に存続する見込みがあります。ただし、将来的なリダイレクトやページ改版はあり得るため、重要情報はローカルに保存(PDF 取得等)しておくことを推奨します。
まとめ
- 環境構築 → 基本文法 → 制御構文 → 関数・ヘッダ → 配列・文字列 → ポインタ → 総合プロジェクト の流れで、7 日間に渡って段階的にスキルを積み上げられる設計です。
- それぞれのステップは「コードを書いてコンパイル」「期待結果が得られたかチェック」する PDCA サイクル を回すことが学習効果を最大化します。
- 本稿で示したバージョン情報・教材リンクは執筆時点の正確なものです。読者側でも最新情報に差し替えることで、長期的に安定した学習環境を保てます。
次のアクション:
1. 本記事の手順通りに開発環境を構築する(Day 1)。
2. Day 2〜Day 7 のコード例を自分のエディタで実行し、チェックリストを埋めていく。
3. 完成したミニプロジェクトを GitHub に公開し、他者からフィードバックを受け取ることで、更なるステップアップを図りましょう。
Happy coding! 🎉