Эта программа в основном рассчитывает средний балл, позволяя пользователю ввести количество курсов и код курса с соответствующими кредитами и оценками. Если код курса введен дважды, появится сообщение (курс уже зарегистрирован), и он будет повторяться до тех пор, пока пользователь не введет все курсы с другим кодом курса.
Я создал два метода. Один для проверки того, что код уже зарегистрирован, а другой для расчета 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));
}
Пожалуйста, не меняйте тип вашего вопроса, удаляя ==
и заменяя его .equals()
, если только вы не допустили ошибку в вопросе, которой не было в вашем коде. Вы делаете несколько ответов ниже недействительными.
извините за то, что это мой первый раз, когда я публикую вопрос
Используйте заданную структуру для хранения всего посещенного кода курса. Это позволит избежать ненужных итераций в вашем массиве курсов.
этот метод может быть расширен до
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);
да на самом деле отредактировал код здесь, только это могло вызвать это
Я внес некоторые изменения в ваш код, и теперь он работает. Изменения описаны в приведенном ниже коде. Произошло 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));
}
Я протестировал код с двумя разными кодами курсов, и он показывает зарегистрированный курс.
@AbdulrahemAljahdali проверьте сейчас, потому что я исправил одну ошибку
Этот вид чрезмерных каскадов «если-тогда-иначе» многими считается антипаттерном.
вы сравниваете объекты их - используйте это для сравнения двух строк - если (code.equals (курс List [i]))