From 5eca15de189a50eb03cdbea2c85afadadc636f36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=AC=C2=BAzionkim?= <22100130@handong.ac.kr> Date: Wed, 25 Dec 2024 15:44:40 +0900 Subject: [PATCH 1/3] sionkim - example pass --- src/main/java/gpacalc/Application.java | 33 +++++++- src/main/java/gpacalc/Operations.java | 110 +++++++++++++++++++++++++ src/main/java/gpacalc/Subject.java | 83 +++++++++++++++++++ src/test/java/ApplicationTest.java | 108 ++++++++++++------------ 4 files changed, 279 insertions(+), 55 deletions(-) create mode 100644 src/main/java/gpacalc/Operations.java create mode 100644 src/main/java/gpacalc/Subject.java diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index 57e79e1..aeb5194 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -1,7 +1,38 @@ package gpacalc; +import static camp.nextstep.edu.missionutils.Console.readLine; +import camp.nextstep.edu.missionutils.Console; + +import java.util.ArrayList; public class Application { public static void main(String[] args) { - //TODO: 구현 + Operations op = new Operations(); + ArrayList major = new ArrayList<>(); // 전공과목 + ArrayList general = new ArrayList<>(); // 교양과목 + double gpa = 0; + double totalWeightSG = 0; + + //데이터 입력부분 + System.out.println("전공 과목명과 이수학점, 평점을 입력해주세요(예시: 프로그래밍언어론-3-A+,소프트웨어공학-3-B+):"); + String input = Console.readLine(); + major = op.MakeSubjects(input); + System.out.println("\n교양 과목명과 이수학점, 평점을 입력해주세요(예시: 선형대수학-3-C0,인간관계와자기성장-3-P):"); + input = Console.readLine(); + general = op.MakeSubjects(input); + + //프로그램 출력부분 + op.printSubjects(major, general); + + //취득학점 출력 + System.out.println("\n<취득학점>"); + System.out.println(op.CalTakenCredits(major, general)+"학점\n"); + + //평점평균(전공, 교양 과목 모두 포함) + System.out.println("<평점평균>"); + System.out.println(op.CalGPA(major, general)+" / 4.5\n"); + + //전공 평점평균(전공 과목만 포함) + System.out.println("<전공 평점평균>"); + System.out.println(op.CalGPA_M(major)+" / 4.5\n"); } } diff --git a/src/main/java/gpacalc/Operations.java b/src/main/java/gpacalc/Operations.java new file mode 100644 index 0000000..b4d6da4 --- /dev/null +++ b/src/main/java/gpacalc/Operations.java @@ -0,0 +1,110 @@ +package gpacalc; + +import java.util.ArrayList; + +public class Operations { + public Operations() { + } + + public ArrayList MakeSubjects(String input) { // 입력받은 과목 저장 + ArrayList result = new ArrayList<>(); + String[] subjects = input.split(","); + for(int i = 0; i < subjects.length; i++) { + String[] info = subjects[i].split("-"); + Subject s = new Subject(info[0], Integer.parseInt(info[1]), info[2]); + result.add(s); + } + return result; + } + + public void printSubjects(ArrayList major, ArrayList general) { // 과목 출력 + System.out.println("<과목 목록>"); + for(Subject s : major) { + System.out.println("[전공] "+s.toString()); + } + for(Subject s : general) { + System.out.println("[교양] "+s.toString()); + } + } + +// 평점평균 = 과목성적가중치의 총합 / 과목학점의 총합 +// 과목성적가중치 = 과목평점 * 과목학점 +// 평점평균은 소수점 셋째 자리에서 반올림하여 둘째 자리까지 표현한다. +// P/NP 과목은 평점평균 계산에서 제외한다. + public double CalTotalWeightSG_M(ArrayList major) { // 전공의 "과목성적가중치의 총합" + double totalWeightSG = 0; + for(Subject s : major) { + if(s.getGradeNumber() != -1){ + totalWeightSG += s.getCredit() * s.getGradeNumber(); + } + } + return totalWeightSG; + } + + public double CalGPA_M(ArrayList major) { // 전공의 "평점평균" + double gpa = 0; + int totalCredits = 0; + double totalWeightSG; + // 과목학점의 총합 + for(Subject s : major) { + if(s.getGradeNumber() != -1) {//P, NP는 해당 안 됨 + totalCredits += s.getCredit(); + } + } + // 과목성적가중치의 총합 + totalWeightSG = CalTotalWeightSG_M(major); + + //GPA 계산부분 + gpa = totalWeightSG / totalCredits; + return Math.round(gpa*100)/100.0 ; // 소수점 셋째 자리에서 반올림 + } + + public double CalTotalWeightSG(ArrayList major, ArrayList general) { // 전체의 "과목성적가중치의 총합" + double totalWeightSG_G = 0; + double totalWeightSG_M = CalTotalWeightSG_M(major); + for(Subject s : general) { + if(s.getGradeNumber() != -1){ + totalWeightSG_G += s.getCredit() * s.getGradeNumber(); + } + } + return totalWeightSG_G + totalWeightSG_M; + } + + public double CalGPA(ArrayList major, ArrayList general) { // 전체의 "평점평균" + double gpa = 0; + int totalCredits = 0; + double totalWeightSG; + // 과목학점의 총합 + for(Subject s : major) { + if(s.getGradeNumber() != -1) {//P, NP는 해당 안 됨 + totalCredits += s.getCredit(); + } + } + for(Subject s : general) { + if(s.getGradeNumber() != -1) { + totalCredits += s.getCredit(); + } + } + // 과목성적가중치의 총합 + totalWeightSG = CalTotalWeightSG(major, general); + + //GPA 계산부분 + gpa = totalWeightSG / totalCredits; + return Math.round(gpa*100)/100.0 ; // 소수점 셋째 자리에서 반올림 + } + + public int CalTakenCredits(ArrayList major, ArrayList general) { // 취득학점 계산 + int result = 0; + for(Subject s : major) { + if(s.getGradeNumber() != 0 && !s.getGrade().equals("NP")){ + result += s.getCredit(); + } + } + for(Subject s : general) { + if(s.getGradeNumber() != 0 && !s.getGrade().equals("NP")){ + result += s.getCredit(); + } + } + return result; + } +} diff --git a/src/main/java/gpacalc/Subject.java b/src/main/java/gpacalc/Subject.java new file mode 100644 index 0000000..044bea7 --- /dev/null +++ b/src/main/java/gpacalc/Subject.java @@ -0,0 +1,83 @@ +package gpacalc; + +public class Subject { + private final String[] grades = {"A+", "A0", "B+", "B0", "C+", "C0", "D+", "D0", "F", "P", "NP"}; + private final double[] gradeNumbers = {4.5, 4.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.0, 0.0, -1}; + private String title; + private int credit; + private String grade; + private double gradeNumber; + + public Subject(String title, int credit, String grade) { + try { + setTitle(title); + setCredit(credit); + setGrade(grade); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + System.exit(0); + } + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) throws IllegalArgumentException { + if (title.isEmpty()) { + throw new IllegalArgumentException("Title cannot be empty"); + } + if (title.length() > 10) { + throw new IllegalArgumentException("Title is too long"); + } + this.title = title; + } + + public int getCredit() { + return credit; + } + + public void setCredit(int credit) { + if (credit < 1 || credit > 4) { + throw new IllegalArgumentException("Credit must be between 1 and 4"); + } + this.credit = credit; + } + + public String getGrade() { + return grade; + } + + public void setGrade(String grade) { + for (int i = 0; i < 9; i++) { + if (grade.equals(grades[i])) { + this.grade = grades[i]; + setGradeNumber(i); + return; + } + } + if (grade.equals(grades[9])) { // P인 경우 + this.grade = grades[9]; + setGradeNumber(9); // P/NP인 경우 gradeNumber 에 -1을 넣어준다 + return; + } else if (grade.equals(grades[10])) { // NP인 경우 + this.grade = grades[10]; + setGradeNumber(9); // P/NP인 경우 gradeNumber 에 -1을 넣어준다 + return; + } + throw new IllegalStateException("Grade is not correct"); + } + + public double getGradeNumber() { + return gradeNumber; + } + + public void setGradeNumber(int index) { + this.gradeNumber = gradeNumbers[index]; + } + + @Override + public String toString() { + return getTitle() + "," + getCredit() + "," + getGrade(); + } +} diff --git a/src/test/java/ApplicationTest.java b/src/test/java/ApplicationTest.java index 38086f8..f27c73b 100644 --- a/src/test/java/ApplicationTest.java +++ b/src/test/java/ApplicationTest.java @@ -1,54 +1,54 @@ -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; - -import camp.nextstep.edu.missionutils.test.NsTest; -import gpacalc.Application; -import org.junit.jupiter.api.Test; - -public class ApplicationTest extends NsTest { - - @Test - void 평점평균_계산() { - run("데이타구조-3-A0,자바프로그래밍언어-3-B+,컴퓨터구조-3-C0,컴퓨터네트워크-3-D+", - "미술의이해-3-P,교양특론3-1-NP,기독교의이해-2-F"); - assertThat(output()).contains( - "<과목 목록>", - "[전공] 데이타구조,3,A0", - "[전공] 자바프로그래밍언어,3,B+", - "[전공] 컴퓨터구조,3,C0", - "[전공] 컴퓨터네트워크,3,D+", - "[교양] 미술의이해,3,P", - "[교양] 교양특론3,1,NP", - "[교양] 기독교의이해,2,F", - "<취득학점>", - "15학점", - "<평점평균>", - "2.36 / 4.5", - "<전공 평점평균>", - "2.75 / 4.5" - ); - } - - @Test - void 예외처리_잘못된_성적_입력() { - assertThatIllegalArgumentException() - .isThrownBy(() -> { - run("자바프로그래밍언어-3-E0", "한동인성교육-1-P"); - run("자바프로그래밍언어-3-A+", "한동인성교육-1-PD"); - }); - } - - @Test - void 예외처리_잘못된_학점_입력() { - assertThatIllegalArgumentException() - .isThrownBy(() -> { - run("프로그래밍언어론-5-A0", "한동인성교육-1-P"); - run("프로그래밍언어론-3-A0", "한동인성교육-0-P"); - }); - } - - @Override - protected void runMain() { - Application.main(new String[]{}); - } -} +//import static org.assertj.core.api.Assertions.assertThat; +//import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +// +//import camp.nextstep.edu.missionutils.test.NsTest; +//import gpacalc.Application; +//import org.junit.jupiter.api.Test; +// +//public class ApplicationTest extends NsTest { +// +// @Test +// void 평점평균_계산() { +// run("데이타구조-3-A0,자바프로그래밍언어-3-B+,컴퓨터구조-3-C0,컴퓨터네트워크-3-D+", +// "미술의이해-3-P,교양특론3-1-NP,기독교의이해-2-F"); +// assertThat(output()).contains( +// "<과목 목록>", +// "[전공] 데이타구조,3,A0", +// "[전공] 자바프로그래밍언어,3,B+", +// "[전공] 컴퓨터구조,3,C0", +// "[전공] 컴퓨터네트워크,3,D+", +// "[교양] 미술의이해,3,P", +// "[교양] 교양특론3,1,NP", +// "[교양] 기독교의이해,2,F", +// "<취득학점>", +// "15학점", +// "<평점평균>", +// "2.36 / 4.5", +// "<전공 평점평균>", +// "2.75 / 4.5" +// ); +// } +// +// @Test +// void 예외처리_잘못된_성적_입력() { +// assertThatIllegalArgumentException() +// .isThrownBy(() -> { +// run("자바프로그래밍언어-3-E0", "한동인성교육-1-P"); +// run("자바프로그래밍언어-3-A+", "한동인성교육-1-PD"); +// }); +// } +// +// @Test +// void 예외처리_잘못된_학점_입력() { +// assertThatIllegalArgumentException() +// .isThrownBy(() -> { +// run("프로그래밍언어론-5-A0", "한동인성교육-1-P"); +// run("프로그래밍언어론-3-A0", "한동인성교육-0-P"); +// }); +// } +// +// @Override +// protected void runMain() { +// Application.main(new String[]{}); +// } +//} From a8aadc28297c63e7f14961566c88a6c11f0cd1ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=AC=C2=BAzionkim?= <22100130@handong.ac.kr> Date: Wed, 25 Dec 2024 16:28:10 +0900 Subject: [PATCH 2/3] textCase pass --- src/main/java/gpacalc/Application.java | 12 +-- src/main/java/gpacalc/Operations.java | 9 ++- src/main/java/gpacalc/Subject.java | 5 +- src/test/java/ApplicationTest.java | 108 ++++++++++++------------- 4 files changed, 70 insertions(+), 64 deletions(-) diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index aeb5194..5237ace 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -14,13 +14,15 @@ public static void main(String[] args) { //데이터 입력부분 System.out.println("전공 과목명과 이수학점, 평점을 입력해주세요(예시: 프로그래밍언어론-3-A+,소프트웨어공학-3-B+):"); - String input = Console.readLine(); - major = op.MakeSubjects(input); + String input_m = Console.readLine(); System.out.println("\n교양 과목명과 이수학점, 평점을 입력해주세요(예시: 선형대수학-3-C0,인간관계와자기성장-3-P):"); - input = Console.readLine(); - general = op.MakeSubjects(input); + String input_g = Console.readLine(); - //프로그램 출력부분 + //!!주의!! 여기에서 아래 두 부분을 try-catch 로 묶어버리면 exception 이 발생을 안 해서 테스트 통과를 할 수 없게 된다 + major = op.MakeSubjects(input_m); + general = op.MakeSubjects(input_g); + + //목록 출력부분 op.printSubjects(major, general); //취득학점 출력 diff --git a/src/main/java/gpacalc/Operations.java b/src/main/java/gpacalc/Operations.java index b4d6da4..2fab2e4 100644 --- a/src/main/java/gpacalc/Operations.java +++ b/src/main/java/gpacalc/Operations.java @@ -6,12 +6,17 @@ public class Operations { public Operations() { } - public ArrayList MakeSubjects(String input) { // 입력받은 과목 저장 + public ArrayList MakeSubjects(String input){ // 입력받은 과목 저장 ArrayList result = new ArrayList<>(); String[] subjects = input.split(","); for(int i = 0; i < subjects.length; i++) { String[] info = subjects[i].split("-"); - Subject s = new Subject(info[0], Integer.parseInt(info[1]), info[2]); + Subject s = null; + try { + s = new Subject(info[0], Integer.parseInt(info[1]), info[2]); + } catch (NumberFormatException e) { + throw e; + } result.add(s); } return result; diff --git a/src/main/java/gpacalc/Subject.java b/src/main/java/gpacalc/Subject.java index 044bea7..f2babb2 100644 --- a/src/main/java/gpacalc/Subject.java +++ b/src/main/java/gpacalc/Subject.java @@ -14,8 +14,7 @@ public Subject(String title, int credit, String grade) { setCredit(credit); setGrade(grade); } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); - System.exit(0); + throw e; } } @@ -65,7 +64,7 @@ public void setGrade(String grade) { setGradeNumber(9); // P/NP인 경우 gradeNumber 에 -1을 넣어준다 return; } - throw new IllegalStateException("Grade is not correct"); + throw new IllegalArgumentException("Grade is not correct"); } public double getGradeNumber() { diff --git a/src/test/java/ApplicationTest.java b/src/test/java/ApplicationTest.java index f27c73b..38086f8 100644 --- a/src/test/java/ApplicationTest.java +++ b/src/test/java/ApplicationTest.java @@ -1,54 +1,54 @@ -//import static org.assertj.core.api.Assertions.assertThat; -//import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -// -//import camp.nextstep.edu.missionutils.test.NsTest; -//import gpacalc.Application; -//import org.junit.jupiter.api.Test; -// -//public class ApplicationTest extends NsTest { -// -// @Test -// void 평점평균_계산() { -// run("데이타구조-3-A0,자바프로그래밍언어-3-B+,컴퓨터구조-3-C0,컴퓨터네트워크-3-D+", -// "미술의이해-3-P,교양특론3-1-NP,기독교의이해-2-F"); -// assertThat(output()).contains( -// "<과목 목록>", -// "[전공] 데이타구조,3,A0", -// "[전공] 자바프로그래밍언어,3,B+", -// "[전공] 컴퓨터구조,3,C0", -// "[전공] 컴퓨터네트워크,3,D+", -// "[교양] 미술의이해,3,P", -// "[교양] 교양특론3,1,NP", -// "[교양] 기독교의이해,2,F", -// "<취득학점>", -// "15학점", -// "<평점평균>", -// "2.36 / 4.5", -// "<전공 평점평균>", -// "2.75 / 4.5" -// ); -// } -// -// @Test -// void 예외처리_잘못된_성적_입력() { -// assertThatIllegalArgumentException() -// .isThrownBy(() -> { -// run("자바프로그래밍언어-3-E0", "한동인성교육-1-P"); -// run("자바프로그래밍언어-3-A+", "한동인성교육-1-PD"); -// }); -// } -// -// @Test -// void 예외처리_잘못된_학점_입력() { -// assertThatIllegalArgumentException() -// .isThrownBy(() -> { -// run("프로그래밍언어론-5-A0", "한동인성교육-1-P"); -// run("프로그래밍언어론-3-A0", "한동인성교육-0-P"); -// }); -// } -// -// @Override -// protected void runMain() { -// Application.main(new String[]{}); -// } -//} +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +import camp.nextstep.edu.missionutils.test.NsTest; +import gpacalc.Application; +import org.junit.jupiter.api.Test; + +public class ApplicationTest extends NsTest { + + @Test + void 평점평균_계산() { + run("데이타구조-3-A0,자바프로그래밍언어-3-B+,컴퓨터구조-3-C0,컴퓨터네트워크-3-D+", + "미술의이해-3-P,교양특론3-1-NP,기독교의이해-2-F"); + assertThat(output()).contains( + "<과목 목록>", + "[전공] 데이타구조,3,A0", + "[전공] 자바프로그래밍언어,3,B+", + "[전공] 컴퓨터구조,3,C0", + "[전공] 컴퓨터네트워크,3,D+", + "[교양] 미술의이해,3,P", + "[교양] 교양특론3,1,NP", + "[교양] 기독교의이해,2,F", + "<취득학점>", + "15학점", + "<평점평균>", + "2.36 / 4.5", + "<전공 평점평균>", + "2.75 / 4.5" + ); + } + + @Test + void 예외처리_잘못된_성적_입력() { + assertThatIllegalArgumentException() + .isThrownBy(() -> { + run("자바프로그래밍언어-3-E0", "한동인성교육-1-P"); + run("자바프로그래밍언어-3-A+", "한동인성교육-1-PD"); + }); + } + + @Test + void 예외처리_잘못된_학점_입력() { + assertThatIllegalArgumentException() + .isThrownBy(() -> { + run("프로그래밍언어론-5-A0", "한동인성교육-1-P"); + run("프로그래밍언어론-3-A0", "한동인성교육-0-P"); + }); + } + + @Override + protected void runMain() { + Application.main(new String[]{}); + } +} From 7b248cf7b841182d400e2887c36b92f487832d5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=AC=C2=BAzionkim?= <22100130@handong.ac.kr> Date: Wed, 25 Dec 2024 16:30:24 +0900 Subject: [PATCH 3/3] delete unused variables --- src/main/java/gpacalc/Application.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index 5237ace..115e7f0 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -9,8 +9,6 @@ public static void main(String[] args) { Operations op = new Operations(); ArrayList major = new ArrayList<>(); // 전공과목 ArrayList general = new ArrayList<>(); // 교양과목 - double gpa = 0; - double totalWeightSG = 0; //데이터 입력부분 System.out.println("전공 과목명과 이수학점, 평점을 입력해주세요(예시: 프로그래밍언어론-3-A+,소프트웨어공학-3-B+):");