Зачетная система


В частности, я не доволен корпус 5 в классе управления. В принципе, в случае 5, я бы хотел пользователя, чтобы прикрепить студент из массива студентов на модуль из массива модулей без дублирования. Любые предложения/пример был бы очень полезен.

Класс Драйвера:

public class MyApplication {

public static void main(String[] args) {
    Control control = new Control();
    control.run();
}
}

Класса управления:

import java.util.Scanner;

public class Control {

// Integers represented as module codes 
private static final int UFCE1 = 0;
private static final int UFCE2 = 1;
private static final int UFCE3 = 2;
private static final int UFCE4 = 3;
private static final int UFCE5 = 4;
// Integers represented as students
private static final int STUDENT1 = 0;
private static final int STUDENT2 = 1;
private static final int STUDENT3 = 2;
private static final int STUDENT4 = 3;
private static final int STUDENT5 = 4;

public void run() {

    Student jane = new Student("jane");
    Student alex = new Student("alex");
    Student mike = new Student("mike");
    Student james = new Student("james");
    Student julia = new Student("julia");

    Student[] students = new Student[]{jane, alex, mike, james, julia};


    Module ufce1 = new Module("UFCE1");
    Module ufce2 = new Module("UFCE2");
    Module ufce3 = new Module("UFCE3");
    Module ufce4 = new Module("UFCE4");
    Module ufce5 = new Module("UFCE5");

    Module[] modules = new Module[]{ufce1, ufce2, ufce3, ufce4, ufce5};

    jane.addModule(ufce1.getName());
    jane.addModule(ufce3.getName());
    alex.addModule(ufce1.getName());
    alex.addModule(ufce2.getName());

    ufce1.addStudent(jane.getName());
    ufce3.addStudent(jane.getName());
    ufce1.addStudent(alex.getName());
    ufce2.addStudent(alex.getName());

    System.out.println("Welcome to Student Record System!");

    while (true) {
        Menu menu = new Menu();
        menu.getMainMenu();

        try {
            Scanner scan = new Scanner(System.in);

            int selection = scan.nextInt();
            switch (selection) {
                case 1:
                    for (Student student : students) {
                        System.out.print(student.getName() + " ");
                    }
                    break;
                case 2:
                    for (Module module : modules) {
                        System.out.print(module.getName() + " ");
                    }
                    break;
                case 3:
                    System.out.println("Search module code: ");
                    scan = new Scanner(System.in);
                    String searchModule = scan.nextLine().trim();

                    for (Module module : modules) {
                        if (searchModule.equalsIgnoreCase(module.getName())) {
                            for (int s = 0; s < module.getStudents().size(); s++) {
                                System.out.print(module.getStudents().get(s) + " ");
                            }
                        }
                    }
                    break;
                case 4:
                    System.out.println("Search students : ");
                    scan = new Scanner(System.in);
                    String searchStudent = scan.nextLine().trim();

                    for (Student student : students) {
                        if (searchStudent.equalsIgnoreCase(student.getName())) {
                            for (int s = 0; s < student.getModules().size(); s++) {
                                System.out.print(student.getModules().get(s) + " ");
                            }
                        }
                    }
                    break;
                case 5:
                    // Print out students 
                    System.out.println("select a student: ");
                    for (int i = 0; i < students.length; i++) {
                        System.out.println(i + " " + students[i]);
                    }

                    selection = scan.nextInt();
                    switch (selection) {

                        case STUDENT1:
                            System.out.println("select a module to enroll " + students[0].getName() + " on to:");
                            for (int i = 0; i < modules.length; i++) {
                                System.out.println(i + " " + modules[i]);
                            }

                            selection = scan.nextInt();
                            switch (selection) {
                                case UFCE1:
                                    System.out.println("You have enrolled " + students[0].getName() + " on to " + modules[0].getName());
                                    students[0].addModule(modules[0].getName());
                                    modules[0].addStudent(students[0].getName());
                                    break;
                                case UFCE2:
                                    System.out.println("You have enrolled " + students[0].getName() + " on to " + modules[1].getName());
                                    students[0].addModule(modules[1].getName());
                                    modules[1].addStudent(students[0].getName());
                                    break;
                                case UFCE3:
                                    System.out.println("You have enrolled " + students[0].getName() + " on to " + modules[2].getName());
                                    students[0].addModule(modules[2].getName());
                                    modules[2].addStudent(students[0].getName());
                                    break;
                                case UFCE4:
                                    System.out.println("You have enrolled " + students[0].getName() + " on to " + modules[3].getName());
                                    students[0].addModule(modules[3].getName());
                                    modules[3].addStudent(students[0].getName());
                                    break;
                                case UFCE5:
                                    System.out.println("You have enrolled " + students[0].getName() + " on to " + modules[4].getName());
                                    students[0].addModule(modules[4].getName());
                                    modules[4].addStudent(students[0].getName());
                                    break;
                                default:
                                    System.out.println("Invalid subject selected. Returning to main menu...");
                            }
                            break;

                        case STUDENT2:
                            System.out.println("select a module to enroll " + students[1].getName() + " on to:");
                            for (int i = 0; i < modules.length; i++) {
                                System.out.println(i + " " + modules[i]);
                            }

                            selection = scan.nextInt();
                            switch (selection) {
                                case UFCE1:
                                    System.out.println("You have enrolled " + students[1].getName() + " on to " + modules[0].getName());
                                    students[1].addModule(modules[0].getName());
                                    modules[0].addStudent(students[1].getName());
                                    break;
                                case UFCE2:
                                    System.out.println("You have enrolled " + students[1].getName() + " on to " + modules[1].getName());
                                    students[1].addModule(modules[1].getName());
                                    modules[1].addStudent(students[1].getName());
                                    break;
                                case UFCE3:
                                    System.out.println("You have enrolled " + students[1].getName() + " on to " + modules[2].getName());
                                    students[1].addModule(modules[2].getName());
                                    modules[2].addStudent(students[1].getName());
                                    break;
                                case UFCE4:
                                    System.out.println("You have enrolled " + students[1].getName() + " on to " + modules[3].getName());
                                    students[1].addModule(modules[3].getName());
                                    modules[3].addStudent(students[1].getName());
                                    break;
                                case UFCE5:
                                    System.out.println("You have enrolled " + students[1].getName() + " on to " + modules[4].getName());
                                    students[1].addModule(modules[4].getName());
                                    modules[4].addStudent(students[1].getName());
                                    break;
                                default:
                                    System.out.println("Invalid subject selected. Returning to main menu...");
                            }
                            break;

                        case STUDENT3:
                            System.out.println("select a module to enroll " + students[2].getName() + " on to:");
                            for (int i = 0; i < modules.length; i++) {
                                System.out.println(i + " " + modules[i]);
                            }

                            selection = scan.nextInt();
                            switch (selection) {
                                case UFCE1:
                                    System.out.println("You have enrolled " + students[2].getName() + " on to " + modules[0].getName());
                                    students[2].addModule(modules[0].getName());
                                    modules[0].addStudent(students[2].getName());
                                    break;
                                case UFCE2:
                                    System.out.println("You have enrolled " + students[2].getName() + " on to " + modules[1].getName());
                                    students[2].addModule(modules[1].getName());
                                    modules[1].addStudent(students[2].getName());
                                    break;
                                case UFCE3:
                                    System.out.println("You have enrolled " + students[2].getName() + " on to " + modules[2].getName());
                                    students[2].addModule(modules[2].getName());
                                    modules[2].addStudent(students[2].getName());
                                    break;
                                case UFCE4:
                                    System.out.println("You have enrolled " + students[2].getName() + " on to " + modules[3].getName());
                                    students[2].addModule(modules[3].getName());
                                    modules[3].addStudent(students[2].getName());
                                    break;
                                case UFCE5:
                                    System.out.println("You have enrolled " + students[2].getName() + " on to " + modules[4].getName());
                                    students[2].addModule(modules[4].getName());
                                    modules[4].addStudent(students[2].getName());
                                    break;
                                default:
                                    System.out.println("Invalid subject selected. Returning to main menu...");
                            }
                            break;
                        case STUDENT4:
                            System.out.println("select a module to enroll " + students[3].getName() + " on to:");
                            for (int i = 0; i < modules.length; i++) {
                                System.out.println(i + " " + modules[i]);
                            }

                            selection = scan.nextInt();
                            switch (selection) {
                                case UFCE1:
                                    System.out.println("You have enrolled " + students[3].getName() + " on to " + modules[0].getName());
                                    students[3].addModule(modules[0].getName());
                                    modules[0].addStudent(students[3].getName());
                                    break;
                                case UFCE2:
                                    System.out.println("You have enrolled " + students[3].getName() + " on to " + modules[1].getName());
                                    students[3].addModule(modules[1].getName());
                                    modules[1].addStudent(students[3].getName());
                                    break;
                                case UFCE3:
                                    System.out.println("You have enrolled " + students[3].getName() + " on to " + modules[2].getName());
                                    students[3].addModule(modules[2].getName());
                                    modules[2].addStudent(students[3].getName());
                                    break;
                                case UFCE4:
                                    System.out.println("You have enrolled " + students[3].getName() + " on to " + modules[3].getName());
                                    students[3].addModule(modules[3].getName());
                                    modules[3].addStudent(students[3].getName());
                                    break;
                                case UFCE5:
                                    System.out.println("You have enrolled " + students[3].getName() + " on to " + modules[4].getName());
                                    students[3].addModule(modules[4].getName());
                                    modules[4].addStudent(students[3].getName());
                                    break;
                                default:
                                    System.out.println("Invalid subject selected. Returning to main menu...");
                            }
                            break;
                        case STUDENT5:
                            System.out.println("select a module to enroll " + students[4].getName() + " on to:");
                            for (int i = 0; i < modules.length; i++) {
                                System.out.println(i + " " + modules[i]);
                            }

                            selection = scan.nextInt();
                            switch (selection) {
                                case UFCE1:
                                    System.out.println("You have enrolled " + students[4].getName() + " on to " + modules[0].getName());
                                    students[4].addModule(modules[0].getName());
                                    modules[0].addStudent(students[4].getName());
                                    break;
                                case UFCE2:
                                    System.out.println("You have enrolled " + students[4].getName() + " on to " + modules[1].getName());
                                    students[4].addModule(modules[1].getName());
                                    modules[1].addStudent(students[4].getName());
                                    break;
                                case UFCE3:
                                    System.out.println("You have enrolled " + students[4].getName() + " on to " + modules[2].getName());
                                    students[4].addModule(modules[2].getName());
                                    modules[2].addStudent(students[4].getName());
                                    break;
                                case UFCE4:
                                    System.out.println("You have enrolled " + students[4].getName() + " on to " + modules[3].getName());
                                    students[4].addModule(modules[3].getName());
                                    modules[3].addStudent(students[4].getName());
                                    break;
                                case UFCE5:
                                    System.out.println("You have enrolled " + students[4].getName() + " on to " + modules[4].getName());
                                    students[4].addModule(modules[4].getName());
                                    modules[4].addStudent(students[4].getName());
                                    break;
                                default:
                                    System.out.println("Invalid subject selected. Returning to main menu...");
                            }
                            break;
                        default:
                            System.out.println("Invalid student selected. Returning to main menu...");
                    }
                    break;
                case 6:
                    System.out.println("Goodbye!");
                    System.exit(0);
                    break;
                default:
                    System.out.println("Invalid option selected. You must enter a number between 1 & 6!");
            } // end switch

        } catch (Exception e) {
            System.out.println("Invalid entry. You must enter a number between 1 & 6");
        }
    } // end while

}
}

Класс Меню:

public class Menu {
private String Menu;

public String getMainMenu() {
    System.out.println("\n\nSelect an option:");
        System.out.println(
                "1 List all student names"
                + "\n2 List all module details"
                + "\n3 List all students on a module"
                + "\n4 List all modules attached to a student"
                + "\n5 Attach a valid student to a valid module"
                + "\n6 Exit\n");
    return Menu;
}

}

Учащийся:

import java.util.ArrayList;

public class Student {
private String name;
private ArrayList<String> modules;

public Student(String name) {
    this.name = name;
    modules = new ArrayList<String>();
}

public String getName() {
    return name;
}

public ArrayList<String> getModules() {
    return modules;
}

public void addModule(String module){
    modules.add(module);
}

@Override
public String toString() {
    return name;
}

}

Класс Модуля:

import java.util.ArrayList;


public class Module {
private String name;
private ArrayList<String> students;

public Module(String name) {
    this.name = name;
    students = new ArrayList<String>();
}

public String getName() {
    return name;
}

public ArrayList<String> getStudents() {
    return students;
}

public void addStudent(String student){
    students.add(student);
}

@Override
public String toString() {
    return name; 
}

}


4299
6
задан 1 декабря 2011 в 05:12 Источник Поделиться
Комментарии
4 ответа


  1. Там, кажется, не быть любой повод для того, где вы разбить свое меню и классы контроллеров. Большая часть логики меню все еще находится в регулятор.

  2. Если вы когда-нибудь окажетесь определения переменных или констант с порядковыми номерами, как: оператор student1, STUDENT2, STUDENT3, вы делаете это неправильно.

  3. Ваш метод run-это слишком долго. Переместить код для каждого пункта меню свои собственные функции и вызывать их.

  4. У тебя одна попытка/catch блок вокруг всего функции. Это плохая идея, поскольку он будет ловить неправильные исключения. Вы должны иметь реальный вызов, который может провалится внутрь блока try

  5. Ваш попробовать блок catch ловит любые исключения. Это плохая идея, так как это может скрыть ошибки, когда что-то другое, то ожидается, что функция терпит неудачу.

  6. Я не понимаю, почему вы написали пример 5 Как вы это делали. Каждый чехол внутри вашего переключателей такой же, за исключением используемого для индексирования. И у вас уже есть это число в переменную. Просто использовать эту переменную в качестве индекса и бросить переключатель/случае.

12
ответ дан 1 декабря 2011 в 07:12 Источник Поделиться

(Это домашнее задание? Если это так, пожалуйста, пометьте его как таковой)

Это не плохое начало, но есть ряд возможных улучшений.

Во-первых, ваш студент и модуль класса только нужна (идентичные) мелкие недочеты. Они функционально идентичны, поэтому я не буду подробно изменения в студенческий класс.
Изменения:

`private ArrayList<String> modules;` 

К:

`private List<Module> modules;`  

Это позволит вам хранить ссылки на точный объект, а не только его название. Также, вы должны, как правило, код для использования интерфейс, а не класс, как это делают некоторые реализации изменений проще.
Обернуть все возвращает модуля список (в данном случае, getModules(), поэтому он не может быть изменен (это позволит предотвратить некоторые inadverdant изменения):

public List<Module> getModules() {
return Collections.unmodifiableList(modules);
}

(Посмотрите на неизменяемые объекты, хотя я не обязательно рекомендую это для вас просто - это требует немного другого подхода).
Добавить в Equals() метод (и, возможно, хэш-код() как хорошо). Затмение (или любой другой хороший IDE) должны быть в состоянии создать его для вас, хотя только использовать имя для сравнения (игнорируйте модули в этот раз).

Вы собираетесь хотите небольшой служебный метод для добавления модулей для учеников и студентов на модули (в место всех тех случаях, когда они вручную писали). Интерфейс:

public static void crossPopulate(Student student, Module module);

Фактическая реализация остается для читателя. Вы можете хотеть проверить, чтобы убедиться, что они не имеют перекрестные ссылки уже...

Ваш getMainMenu() на самом деле не получая ничего (возвращает null) - изменения возвращаемого типа в пустоту, и переименовать его в printMainMenu().

Вы должны избегать использования 'магия чисел' как от чумы. В только цифры, которые должны быть использованы, не создавая константы (и даже это от контекста) являются -1, 0, 1, 2 (а иногда 10).

В нескольких местах в коде, вы смешиваете нормальные для петли с помощью foreach петли. Я не видел ничего, что бы требовать нормального цикла. Если у вас нет особой необходимости в индекс сам, вы должны по умолчанию с помощью оператора foreach петли.

Насколько это возможно, попытка инициализировать переменные вне цикла, особенно если он остается постоянным, или только обеспечивает (статическом) поведении. Инициализировать переменные в цикле, если они хотят изменить.

Ваши статические заключительные инт переменные не нужны, устранить их.
Вместо массивов для студентов и модули, сделать их карты.

Вот (переделанная) версия управления. Есть также некоторые проблемы безопасности с вашего основного цикла (фиксированные). Есть гораздо лучшие способы сделать это, но они занимают больше времени, чем у меня сейчас на дизайне (и я все собираюсь сделать на основе текста систему меню, тоже...).

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Control {

public void run() {

Map<String, Student> students = new HashMap<String, Student>();
students.put("jane", new Student("jane"));
students.put("alex", new Student("alex"));
students.put("mike", new Student("mike"));
students.put("james", new Student("james"));
students.put("julia", new Student("julia"));

Map<String, Module> modules = new HashMap<String, Module>();
modules.put("UFCE1", new Module("UFCE1"));
modules.put("UFCE2", new Module("UFCE2"));
modules.put("UFCE3", new Module("UFCE3"));
modules.put("UFCE4", new Module("UFCE4"));
modules.put("UFCE5", new Module("UFCE5"));

Util.crossPopulate(students.get("jane"), modules.get("UFCE1"));
Util.crossPopulate(students.get("jane"), modules.get("UFCE3"));
Util.crossPopulate(students.get("alex"), modules.get("UFCE1"));
Util.crossPopulate(students.get("alex"), modules.get("UFCE2"));

System.out.println("Welcome to Student Record System!");

Menu menu = new Menu();

Scanner scan = new Scanner(System.in);

while (true) {
menu.getMainMenu();

try {
String selection = scan.next();
int sel = Integer.valueOf(selection);
switch (sel) {
case 1:
for (Student student : students.values()) {
System.out.print(student.getName() + " ");
}
break;
case 2:
for (Module module : modules.values()) {
System.out.print(module.getName() + " ");
}
break;
case 3:
System.out.println("Search module code: ");
for (Module module : modules.values()) {
System.out.print(module.getName() + " ");
}
String searchModule = scan.next().trim();

for (Module module : modules.values()) {
if (searchModule.equalsIgnoreCase(module.getName())) {
for (Student student : module.getStudents()) {
System.out.print(student.getName() + " ");
}
}
}
break;
case 4:
System.out.println("Search students : ");
for (Student student : students.values()) {
System.out.print(student.getName() + " ");
}
String searchStudent = scan.next().trim();

for (Student student : students.values()) {
if (searchStudent.equalsIgnoreCase(student.getName())) {
for (Module module : student.getModules()) {
System.out.print(module.getName() + " ");
}
}
}
break;
case 5:
// Print out students
System.out.println("select a student: ");
for (String key : students.keySet()) {
System.out.println(key);
}

String studentSelection = scan.next();
Student selectedStudent = students.get(studentSelection.trim());
if (selectedStudent == null) {
System.out.println("Invalid student selected, returning to main menu.");
break;
}

System.out.println("select a module to enroll " + selectedStudent.getName() + " on to:");

for (String key : modules.keySet()) {
System.out.println(key);
}

String moduleSelection = scan.next();
Module selectedModule = modules.get(moduleSelection.trim());

if (selectedModule == null) {
System.out.println("Invalid module selected, returning to main menu.");
break;
}

Util.crossPopulate(selectedStudent, selectedModule);

System.out.println("You have enrolled "
+ selectedStudent.getName() + " on to "
+ selectedModule.getName());
break;
case 6:
System.out.println("Goodbye!");
System.exit(0);
break;
default:
System.out.println("Invalid option selected. You must enter a number between 1 & 6!");
} // end switch

} catch (Exception e) {
System.out
.println("Invalid entry. You must enter a number between 1 & 6");
}
} // end while

}
}

6
ответ дан 1 декабря 2011 в 11:12 Источник Поделиться

Для случая 5, Ваш psuedocode является:

1. Display all students.
2. Ask user to select a student. error if invalid student.
3. For the student selected:
- Display all modules
- Ask user to select a module.
- Add selected student to module.
- Add selected module to student.

Так что ваш код становится:

int studentIndex = scan.nextInt();
Student tempStudent = students[studentIndex];

int moduleIndex = scan.nextInt();
Module tempModule = modules[moduleIndex];

tempStudent.addModule(tempModule.getName());
tempModule.addStudent(tempStudent.getName());

Вам не нужны временные переменные, но я использовал их, чтобы быть более явными.

Следующий рефакторинг следует обернуть логику (и включать любого входа вам нужно) в методе, т. е. 'enrollStudent'.

3
ответ дан 2 декабря 2011 в 10:12 Источник Поделиться

private static final int UFCE1 = 0;
private static final int UFCE2 = 1;
private static final int UFCE3 = 2;
private static final int UFCE4 = 3;
private static final int UFCE5 = 4;
// Integers represented as students
private static final int STUDENT1 = 0;
private static final int STUDENT2 = 1;
private static final int STUDENT3 = 2;
private static final int STUDENT4 = 3;
private static final int STUDENT5 = 4;

Может быть

private int UFC[5];
private int Student[5];

Также вы должны использовать списки, а не массивы

 Student[] students = new Student[]{jane, alex, mike, james, julia};

Должен быть список

 List<String> students = new ArrayList<String>();

Плюс, я не понял. что ваш код должен делать?

2
ответ дан 8 декабря 2011 в 07:12 Источник Поделиться