基本機能の実装
シンプルなコンソールアプリケーションとして動作する学生管理システムを実装します。このシステムでは、学生データの追加・削除・更新・検索が可能です。
メインメニュー構成
===========学生管理システム===========
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);
}