Как я могу запретить пользователю вводить один и тот же текст дважды

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

Я создал два метода. Один для проверки того, что код уже зарегистрирован, а другой для расчета gpa, первый метод, который проверяет ввод пользователя, я не уверен в этом. Потому что, если я дважды введу код курса, он покажет только сообщение и позволит мне рассчитать остальные

public static boolean checkCourse(String[] courseList, String code){
    boolean check = false;
    for(int i=0 ; i < courseList.length; i++){
        if (code.equals(courseList[i])) 
            check = true;
        else
            check = false;
     }
     return check;
}


public static double gradeValue(double marks){
     double grade = 1.0;
     if (marks >=95){ grade = 5.0;}
     else if (marks >= 90) { grade = 4.75;}
     else if (marks>=85) { grade = 4.5;}
     else if (marks >= 80) { grade = 4.0;}
     else if (marks >= 75) { grade = 3.5; }
     else if (marks >= 70) { grade = 3.0;}
     else if (marks >= 65) {grade = 2.5 ;}
     else if (marks >= 60) { grade = 2;}
     else if (marks < 60) { grade =1 ;}
      return grade;
}

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print("Enter number of courses: ");
    int n = input.nextInt();
    String[] Courses = new String[n];
    int sumOfcreadit=0;
    int sumOfmarks =0;

    for(int i =0; i<Courses.length;i++){
        System.out.print("Enter a course code: ");
        Courses[i] = input.next();
        if (checkCourse(Courses,Courses[i])){
            System.out.println("the course already registered");
            i--;

        }

        System.out.print("Enter a credit: ");
        int credit = input.nextInt();
        System.out.print(" Enter a marks: ");
        int marks = input.nextInt();

        sumOfcreadit += credit;
        sumOfmarks +=marks * credit;


    } 
    double TotalMarks;
    TotalMarks = sumOfmarks /sumOfcreadit;

    System.out.println("The GPA is: "+gradeValue(TotalMarks));
}

вы сравниваете объекты их - используйте это для сравнения двух строк - если (code.equals (курс List [i]))

Onkar Musale 08.04.2019 12:50

Пожалуйста, не меняйте тип вашего вопроса, удаляя == и заменяя его .equals(), если только вы не допустили ошибку в вопросе, которой не было в вашем коде. Вы делаете несколько ответов ниже недействительными.

Draken 08.04.2019 13:10

извините за то, что это мой первый раз, когда я публикую вопрос

Abdulrahem Aljahdali 08.04.2019 14:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
455
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте заданную структуру для хранения всего посещенного кода курса. Это позволит избежать ненужных итераций в вашем массиве курсов.

этот метод может быть расширен до

public static boolean checkCourse(HashSet<String> courses, String code){
     boolean check = false;
     if (courses.contains(code)){
         check = true;
     else
         check = false;
     }
     return check;
}

Инициализируйте курсы с набором хэшей и, если метод checkCourses возвращает false, добавьте код курса в курсы.

Инициализировать перед циклом, как это

 HashSet<String> courseSet = new HashSet<String>();

ваше условие if внутри цикла

 if (checkCourse(courseSet,courses[i])){ // check for variable name , name should always start with lower case letter
    System.out.println("the course already regestered ");
    i--;
    // You can use continue if you don't want processing for it
    // it will skip the loop iteration and it will go next iteration
}else{
    courseSet.add(courses[i]);
}

Обратите внимание, что ваш метод checkCourse не компилируется, так как фигурные скобки неуместны. Вы также можете заменить тело метода одним оператором: return courses.contains(code);

MC Emperor 08.04.2019 13:27

да на самом деле отредактировал код здесь, только это могло вызвать это

Ravi 08.04.2019 14:24
Ответ принят как подходящий

Я внес некоторые изменения в ваш код, и теперь он работает. Изменения описаны в приведенном ниже коде. Произошло 3 важных изменения. Я пытался внести как можно меньше изменений, чтобы ваш код работал как положено.

public static boolean checkCourse(String[] courseList, String code) {
    boolean check = false;
    for (int i = 0; i < courseList.length; i++) {
        if (code.equals(courseList[i])) {  // equals instead of == to compare strings
            check = true;
            break; // you have to break loop if it is true because else statement before returned false even if there was the same course code due to null values in next array elements which was not filled yet
        }

    }
    return check;
}

public static double gradeValue(double marks) {
    double grade = 1.0;
    if (marks >= 95) {
        grade = 5.0;
    } else if (marks >= 90) {
        grade = 4.75;
    } else if (marks >= 85) {
        grade = 4.5;
    } else if (marks >= 80) {
        grade = 4.0;
    } else if (marks >= 75) {
        grade = 3.5;
    } else if (marks >= 70) {
        grade = 3.0;
    } else if (marks >= 65) {
        grade = 2.5;
    } else if (marks >= 60) {
        grade = 2;
    } else if (marks < 60) {
        grade = 1;
    }
    return grade;
}

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print("Enter number of courses: ");
    int n = input.nextInt();
    String[] Courses = new String[n];
    int sumOfcreadit = 0;
    int sumOfmarks = 0;

    for (int i = 0; i < Courses.length; i++) {
        System.out.print("Enter a course code: ");
        String code = input.next();
        if (checkCourse(Courses, code)){
            System.out.println("the course already regestered ");
            i--;
            continue; // continue is neccessary to let user write value again if it already exists
        }
        Courses[i] = code;
        System.out.print("Enter a credit: ");
        int credit = input.nextInt();
        System.out.print(" Enter a marks: ");
        int marks = input.nextInt();

        sumOfcreadit += credit;
        sumOfmarks += marks * credit;

    }
    double TotalMarks;
    TotalMarks = sumOfmarks / sumOfcreadit;

    System.out.println("The GPA is: " + gradeValue(TotalMarks));

}

Я протестировал код с двумя разными кодами курсов, и он показывает зарегистрированный курс.

Abdulrahem Aljahdali 08.04.2019 13:11

@AbdulrahemAljahdali проверьте сейчас, потому что я исправил одну ошибку

Rafał Sokalski 08.04.2019 13:20

Этот вид чрезмерных каскадов «если-тогда-иначе» многими считается антипаттерном.

Amadán 08.04.2019 13:48

Другие вопросы по теме