# 【課題仕様書】「CUIタスク管理システム」 ## 1. 概要 本課題では、プログラミングの基本文法(変数、条件分岐、繰り返し、配列・リスト、クラスとオブジェクト指向、ファイルI/O処理)を活用して、コマンドライン(ターミナル)で動作する「タスク管理(To-Do)アプリ」を作成します。 データの追加・更新・削除に加えて、テキストファイル(CSV形式)への保存・読み込みを行うことで、アプリ終了後もデータが保持される本格的なデータの永続化の仕組みを学びます。 ## 2. 画面レイアウト・表示イメージ アプリ起動時、および各操作の完了後には、最新のタスク一覧と操作メニューが表示されるようにしてください。(以下は標準出力のイメージです) ```text ================================================== Task Manager ================================================== ID | 状態 | 優先度 | 期限 | タスク名 -------------------------------------------------- 1 | [ ] 未完了 | 高 | 2026/09/20 | 仕様書を作成する 2 | [〇] 完了 | 中 | 2026/09/18 | 開発環境のセットアップ -------------------------------------------------- [1] タスク追加 [2] 完了/未完了の切り替え [3] 削除 [4] 終了 番号を入力してください > ``` ## 3. 必要機能要件 ### ① タスクの一覧表示 * 登録されている全タスクの「ID」「状態(完了/未完了)」「優先度(低/中/高)」「期限」「タスク名」を見やすく整列して表示すること。 * タスクが1件もない場合は「`登録されているタスクはありません。`」と表示すること。 ### ② タスクの追加 * ユーザーから「タスク名」「期限(日付)」「優先度(1:低, 2:中, 3:高)」を標準入力から受け取り新規登録すること。 * **自動採番:** IDは重複しないように1から順に自動で割り振ること。 * **入力チェック:** 日付や優先度の入力で不正な値(または空入力)が入った場合は、デフォルト値(今日の日付 / 優先度2:中)を設定すること。 ### ③ 完了/未完了の切り替え * 指定したIDのタスクのステータスを、「未完了 ➔ 完了」または「完了 ➔ 未完了」に切り替えること。 * 存在しないIDが入力された場合は、「`そのIDのタスクは見つかりませんでした`」と警告を表示すること。 ### ④ タスクの削除 * 指定したIDのタスクを一覧から削除すること。 ### ⑤ データのファイル保存・自動読み込み(必須要件) * **自動保存:** タスクの追加・変更・削除を行った際、CSV形式のテキストファイル(例: `tasks.csv`)に上書き保存すること。 * **自動復元:** アプリ起動時に保存ファイルが存在する場合は自動でデータを読み込み、前回の状態から再開できるようにすること。 ## 4. クラス設計指定 プログラムの保守性や見通しを良くするため、最低でも以下の**3つのクラス(またはモジュール・ファイル)**に明確に役割を分割して作成してください。 | **役割の名称** | **主な処理・責務** | | **`TaskItem` (データモデル)** | タスク1件分のデータ(ID、タイトル、完了フラグ、期限、優先度)の保持。
優先度の数値から文字列への変換処理や、CSV文字列へのフォーマット変換メソッドなど。 | | **`TaskManager` (ロジック)** | タスクのリスト・配列の管理(追加・検索・変更・削除)。
CSVファイルへの保存(書き出し)および読み込み処理。 | | **`Main / App / View` (UI・エントリーポイント)** | 画面の表示(標準出力)やユーザーからの入力受付(標準入力)。
メインループ処理とメニューの分岐制御。 | ## 5. プログラミング上の制約(注意事項) 初心者向けの基礎文法やアルゴリズム構築力をしっかり定着させるため、**以下の記法・機能の使用は禁止**とします。 1. **三項演算子(`条件 ? 真 : 偽` など)の使用禁止** * 条件分岐はすべて通常の `if` / `else` などの基本構文を使用してください。 2. **列挙型(`enum` 等)の使用禁止** * 優先度や状態は、単純な整数型(`int`等)や真偽値(`boolean`等)で管理してください。 3. **高度なコレクション操作・配列関数の使用禁止** * リストの検索や要素の抽出に、言語特有の便利なコレクション操作機能(例:C#のLINQ、JavaのStream API、PHPの `array_filter` や `array_map`、Pythonのリスト内包表記など)は使わないこと。 * 全て基本的な `for` や `while` (または `foreach` 相当) のループ構文と `if` 文の組み合わせで実装してください。 4. **JSON解析ライブラリや高度なCSV解析ライブラリの使用禁止** * データの保存・読み込みは、標準的なファイル入出力機能(File I/O)のみを使用し、文字列の連結や分割(`split` 等)による自力でのカンマ区切り(CSV)処理を実装してください。 ## 6. 提出物および評価項目 ### 提出物 * ソースコードファイル一式(使用言語の標準的な構成・拡張子に従うこと) ### 評価のポイント * **機能性:** 要件通りに動作し、アプリを再起動してもデータが正常に復元されるか。 * **堅牢性:** 数値入力が求められる箇所で文字入力などを行っても、プログラムが即座にクラッシュ・異常終了しないか(例外処理や入力チェック)。 * **制約順守:** 禁止事項(便利な抽出関数やライブラリに頼る処理)を守って、基礎的なアルゴリズムで書かれているか。 * **可読性:** インデントや変数名・クラス名、メソッドの切り分けが適切に行われ、整理されているか。