TopC++ 入門 › 演習 › プロジェクト制作

C++ プロジェクト制作 — 全 8 作

STL、RAII、スマートポインタ、テンプレート、並行処理 — 学んできた全要素を使って完成させるプロジェクトを 8 つ用意しました。小→大で難易度順。ポートフォリオの種として GitHub にアップする前提で書かれています。

Project 1単語頻度カウンタ

所要時間: 2–3 時間 / 200 行前後
file I/Ostd::mapstd::stringsort

テキストファイルを読み込み、単語ごとの出現回数を上位 N 個表示する CLI ツール。C で書くと辞書の自作が大変だった部分が、std::map 一撃で解決します。

最小仕様

  • ./wordcount file.txt -n 10 で上位 10 件表示
  • 大文字小文字区別しない、記号除去
  • 降順(同値なら辞書順)

発展

  • 複数ファイル対応(ディレクトリ再帰 = std::filesystem::recursive_directory_iterator)
  • ストップワード除外、形態素解析連携
  • 並列化(第 60 回 map-reduce)

Project 2TODO CLI(JSON 永続化)

所要時間: 4–6 時間 / 300 行前後
クラスvectoroptionalファイル I/O

タスク追加・完了・削除できるターミナル TODO。JSON(外部ライブラリ nlohmann/json 推奨)で ~/.todo.json に保存。

最小仕様

  • todo add "買い物", todo done 3, todo list
  • ID / タイトル / 完了フラグ / 作成日
  • 空 optional 期限を std::optional で

発展

  • タグ・締切・優先度
  • 色付き出力(rang)
  • 同期バックエンド(REST API)

Project 3簡易電卓(AST パーサ)

所要時間: 1–2 日 / 400 行前後
variantunique_ptr再帰下降enum class

"1+2*(3-4)" のような式を構文木にパースして評価する電卓。variant で Token、unique_ptr で AST ノードを表現。

最小仕様

  • 四則演算 + 括弧 + 単項マイナス
  • float / double の扱い
  • エラー時は例外を投げて main で catch

発展

  • 変数代入、if 式、関数定義
  • REPL(continuous evaluation)
  • JIT(llvm / asmjit)

Project 4ファイル重複検出ツール

所要時間: 1 日 / 350 行前後
filesystemSHA-256threadunordered_map

指定ディレクトリ以下を走査し、内容が同じファイルをハッシュ値でグループ化。大きい順に表示。

最小仕様

  • std::filesystem::recursive_directory_iterator で走査
  • SHA-256(OpenSSL / picosha2)でハッシュ
  • unordered_map<hash, vector<path>> に集約

発展

  • std::thread + queue でハッシュ計算を並列化
  • 削除提案モード(safe delete)
  • GUI ラッパ(Qt)

Project 52D ゲーム: 15 パズル

所要時間: 2–3 日 / 500 行前後
SDL2 / SFMLarrayクラス設計random

4×4 の 15 パズルを SDL2SFML で。マウス・キーボード対応、シャッフル、ゴール判定。C++ のクラス設計とゲームループの理解に。

最小仕様

  • Board, Tile, Renderer クラス
  • std::array<std::array<int,4>,4> で盤面
  • シャッフルは std::shuffle + mt19937

発展

  • 最短経路(IDA*)でソルバ表示
  • 画像タイル / 音
  • 別パズル(数独、テトリス)へ横展開

Project 6自作ベクトル(完全版)

所要時間: 2–3 日 / 600 行前後
templateRule of 5iteratorallocator

std::vector 相当をゼロから実装。Rule of 5、iterator、reserve/resize、strong exception guarantee 全て。std ライブラリ中身の理解に最強の練習。

最小仕様

  • push_back / pop_back / at / operator[]
  • Random-access iterator(pointer alias で OK)
  • copy / move / dtor を正しく
  • ASan / UBSan でバグ 0

発展

  • カスタム allocator
  • SBO(short buffer optimization)
  • GoogleTest で 100 テスト書く

Project 7TCP エコーサーバ

所要時間: 3–5 日 / 700 行前後
socket APIthread / asyncmutexqueue

クライアント複数接続を受け、1 本のスレッドで処理するソケットサーバ。select/epoll を使わない版は thread + queue で。Boost.Asio を使う版と両方経験できると大きい。

最小仕様

  • listen / accept ループ(main スレッド)
  • クライアントごとにスレッド or ワーカースレッドプール
  • 受信内容を同名で返す

発展

  • epoll / kqueue による 1 万接続対応
  • プロトコル拡張(チャットルーム)
  • TLS(OpenSSL)

Project 8ミニコンパイラ(C のサブセット → x86)

所要時間: 1–2 週間 / 1500 行前後
lexer / parserASTcodegenvariant

C のサブセット(int / if / while / 関数)をx86-64 アセンブリに翻訳する。低レイヤを知りたい人のための C コンパイラ作成入門(日本語)を C++ で書き直すと、モダン C++ の良さが分かる。

最小仕様

  • Token / AST / IR / asm の 4 層
  • variant でノード種別
  • return / 算術 / 代入 / 制御構造

発展

  • ポインタ / 配列 / 構造体
  • LLVM IR を吐く版
  • ブラウザで動く WebAssembly 出力