コンソールベースの学生管理システムの実装

基本機能の実装

シンプルなコンソールアプリケーションとして動作する学生管理システムを実装します。このシステムでは、学生データの追加・削除・更新・検索が可能です。

メインメニュー構成

===========学生管理システム===========
1: 学生追加
2: 学生削除
3: 学生情報更新
4: 学生情報検索
5: 終了
操作を選択してください:

学生クラスの定義

学生情報を保持するためのクラスを定義します。

public class Student {
    private String studentId;
    private String name;
    private int age;
    private String address;

    // コンストラクタ、ゲッター、セッターは省略
}

システム全体の構造

import java.util.ArrayList;
import java.util.Scanner;

public class StudentManagementSystem {
    public static void main(String[] args) {
        ArrayList<Student> studentList = new ArrayList<>();
        
        Scanner scanner = new Scanner(System.in);
        
        while (true) {
            System.out.println("===========学生管理システム===========");
            System.out.println("1: 学生追加");
            System.out.println("2: 学生削除");
            System.out.println("3: 学生情報更新");
            System.out.println("4: 学生情報検索");
            System.out.println("5: 終了");
            System.out.print("操作を選択してください: ");
            
            int choice = scanner.nextInt();
            
            switch (choice) {
                case 1:
                    addStudent(studentList, scanner);
                    break;
                case 2:
                    deleteStudent(studentList, scanner);
                    break;
                case 3:
                    updateStudent(studentList, scanner);
                    break;
                case 4:
                    displayStudents(studentList);
                    break;
                case 5:
                    System.out.println("システムを終了します。");
                    return;
                default:
                    System.out.println("無効な選択です。");
            }
        }
    }

個別機能の実装

学生追加機能

private static void addStudent(ArrayList<Student> studentList, Scanner scanner) {
    System.out.print("学生IDを入力してください: ");
    String id = scanner.next();
    
    // IDの重複チェック
    for (Student student : studentList) {
        if (student.getStudentId().equals(id)) {
            System.out.println("このIDは既に存在しています。");
            return;
        }
    }
    
    System.out.print("氏名を入力してください: ");
    String name = scanner.next();
    
    System.out.print("年齢を入力してください: ");
    int age = scanner.nextInt();
    
    System.out.print("住所を入力してください: ");
    String address = scanner.next();
    
    studentList.add(new Student(id, name, age, address));
    System.out.println("学生情報が追加されました。");
}

学生削除機能

private static void deleteStudent(ArrayList<Student> studentList, Scanner scanner) {
    System.out.print("削除する学生のIDを入力してください: ");
    String id = scanner.next();
    
    for (int i = 0; i < studentList.size(); i++) {
        if (studentList.get(i).getStudentId().equals(id)) {
            studentList.remove(i);
            System.out.println("ID: " + id + " の学生情報を削除しました。");
            return;
        }
    }
    
    System.out.println("指定されたIDの学生は存在しません。");
}

学生情報更新機能

private static void updateStudent(ArrayList<Student> studentList, Scanner scanner) {
    System.out.print("更新する学生のIDを入力してください: ");
    String id = scanner.next();
    
    for (Student student : studentList) {
        if (student.getStudentId().equals(id)) {
            System.out.print("新しい氏名を入力してください: ");
            student.setName(scanner.next());
            
            System.out.print("新しい年齢を入力してください: ");
            student.setAge(scanner.nextInt());
            
            System.out.print("新しい住所を入力してください: ");
            student.setAddress(scanner.next());
            
            System.out.println("情報が更新されました。");
            return;
        }
    }
    
    System.out.println("指定されたIDの学生は存在しません。");
}

学生情報表示機能

private static void displayStudents(ArrayList<Student> studentList) {
    if (studentList.isEmpty()) {
        System.out.println("登録されている学生情報はありません。");
        return;
    }
    
    System.out.println("ID\t\t氏名\t\t年齢\t\t住所");
    for (Student student : studentList) {
        System.out.println(student.getStudentId() + "\t" + student.getName() + "\t" + student.getAge() + "\t" + student.getAddress());
    }
}

セキュリティ機能の追加

ログイン機能を追加して、認証後にのみシステム利用を可能にします。

ユーザークラスの定義

public class User {
    private String username;
    private String password;
    private String idNumber;
    private String phoneNumber;
    
    // コンストラクタ、ゲッター、セッターは省略
}

ログイン画面の構成

System.out.println("学生管理システムへようこそ");
System.out.println("操作を選択してください 1:ログイン 2:新規登録 3:パスワード再設定");

新規登録機能の検証ルール

  • ユーザー名は3~15文字の英数字で、英字が少なくとも1文字含まれる
  • パスワードは2回入力して一致すること
  • 身分証明書番号は18桁で、アルファベットX/xが末尾に許容される
  • 電話番号は11桁で数字のみ

ログイン機能の実装

private static void login(ArrayList<User> userList, Scanner scanner) {
    System.out.print("ユーザー名を入力してください: ");
    String username = scanner.next();
    
    // ユーザー存在チェック
    boolean userExists = false;
    for (User user : userList) {
        if (user.getUsername().equals(username)) {
            userExists = true;
            break;
        }
    }
    
    if (!userExists) {
        System.out.println("このユーザー名は登録されていません。");
        return;
    }
    
    // 認証コード生成と検証
    String authCode = generateAuthCode();
    System.out.println("認証コード: " + authCode);
    
    System.out.print("表示された認証コードを入力してください: ");
    String inputCode = scanner.next();
    
    if (!inputCode.equalsIgnoreCase(authCode)) {
        System.out.println("認証コードが一致しません。");
        return;
    }
    
    // パスワード検証(最大3回)
    for (int i = 0; i < 3; i++) {
        System.out.print("パスワードを入力してください: ");
        String password = scanner.next();
        
        for (User user : userList) {
            if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
                System.out.println("ログイン成功しました。");
                return;
            }
        }
        
        System.out.println("パスワードが間違っています。");
        if (i == 2) {
            System.out.println("ログイン試行回数が上限に達しました。");
        } else {
            System.out.println("残り試行回数: " + (2 - i));
        }
    }
}

認証コード生成ロジック

private static String generateAuthCode() {
    StringBuilder code = new StringBuilder();
    Random random = new Random();
    
    // 大文字・小文字アルファベットと数字の配列
    char[] characters = new char[62];
    for (int i = 0; i < 26; i++) {
        characters[i] = (char)('A' + i);
        characters[i + 26] = (char)('a' + i);
    }
    for (int i = 0; i < 10; i++) {
        characters[i + 52] = (char)('0' + i);
    }
    
    // 4文字のアルファベットを追加
    for (int i = 0; i < 4; i++) {
        code.append(characters[random.nextInt(52)]);
    }
    
    // 最後に1つの数字を追加
    code.append(random.nextInt(10));
    
    // 文字列をランダムにシャッフル
    char[] codeArray = code.toString().toCharArray();
    for (int i = 0; i < codeArray.length; i++) {
        int swapIndex = random.nextInt(codeArray.length);
        char temp = codeArray[i];
        codeArray[i] = codeArray[swapIndex];
        codeArray[swapIndex] = temp;
    }
    
    return new String(codeArray);
}

タグ: Java コンソールアプリケーション オブジェクト指向設計 ユーザー認証 データ検証

5月15日 12:26 投稿