From 24f5290435596855135a56fc94e74052776ad6e5 Mon Sep 17 00:00:00 2001 From: uojin29 Date: Tue, 9 Jan 2024 20:59:45 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat=20:=20=ED=95=99=EC=A0=90=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EA=B8=B0=201=EC=B0=A8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 13 ++++ src/main/java/gpacalc/Application.java | 35 ++++++++++- src/main/java/gpacalc/Subjects.java | 82 ++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gpacalc/Subjects.java diff --git a/docs/README.md b/docs/README.md index e69de29..c64331b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,13 @@ +순서 +1. 전공 과목 입력 +2. 교양 과목 입력 +3. 과목 목록 출력 +4. 취득 학점 출력 +5. 평점 평균 출력 +6. 전공 평점 평균 출력 + +구현할 기능 +1. 입력받은 정보 split 후 저장 +2. grade , P/NP 구분하기 +3. 학점 계산하기 +4. 평점 평균, 전공 평점 평균 계산하기 \ No newline at end of file diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index 57e79e1..9fe36d2 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -1,7 +1,40 @@ package gpacalc; +import static camp.nextstep.edu.missionutils.Console.readLine; + +import camp.nextstep.edu.missionutils.Console; public class Application { public static void main(String[] args) { - //TODO: 구현 +// Scanner scanner = new Scanner(System.in); + Subjects subjects = new Subjects(); + + System.out.println("전공 과목명과 이수학점, 평점을 입력해주세요(예시: 프로그래밍언어론-3-A+,소프트웨어공학-3-B+):"); + String major = Console.readLine(); + + subjects.input(major, "전공"); + + System.out.println("교양 과목명과 이수학점, 평점을 입력해주세요(예시: 선형대수학-3-C0,인간관계와자기성장-3-P):"); + String GE = Console.readLine(); + + subjects.input(GE, "교양"); + System.out.println(); + + System.out.println("<과목 목록>"); + subjects.print(); + System.out.println(); + + System.out.println("<취득학점>"); + int credit = subjects.calculateCredit(); + System.out.println(credit + "학점"); + System.out.println(); + + System.out.println("<평점평균>"); + String average = subjects.calculateAverage(); + System.out.println(average + " / 4.5"); + System.out.println(); + + System.out.println("<전공 평점평균>"); + String majorAverage = subjects.calculateAverage("전공"); + System.out.println(majorAverage + " / 4.5"); } } diff --git a/src/main/java/gpacalc/Subjects.java b/src/main/java/gpacalc/Subjects.java new file mode 100644 index 0000000..242921c --- /dev/null +++ b/src/main/java/gpacalc/Subjects.java @@ -0,0 +1,82 @@ +package gpacalc; + +import java.util.Stack; + +public class Subjects { + Stack stack = new Stack<>(); + private String[] subjects; + public void input(String subject, String type){ + String subjects[] = subject.split(","); + this.subjects = subjects; + for(int i = 0; i < subjects.length; i++){ + subjects[i] = subjects[i].replace("-", ","); + stack.push("[" + type + "] " + subjects[i]); + } + } + public void print(){ + for(int i = 0; i < stack.size(); i++){ + System.out.println(stack.get(i)); + } + } + public int calculateCredit(){ + int result = 0; + for(int i = 0; i < stack.size(); i++){ + String info[] = stack.get(i).split(","); + int credit = Integer.parseInt(info[1]); + String grade = info[2]; + if(credit < 1 || credit > 4){ + throw new IllegalArgumentException("학점은 1~4 사이의 숫자만 가능합니다."); + } + if(grade.equals("F") == false && grade.equals("NP") == false){ + result += credit; + } + } + return result; + } + + public String calculateAverage() { + return calculateAverage(null); + } + public String calculateAverage(String type) { + double result = 0; + int credit = 0; + for(int i = 0; i < stack.size(); i++){ + String info[] = stack.get(i).split(","); + int subjectCredit = Integer.parseInt(info[1]); + String subjectGrade = info[2]; + + if(type == null || info[0].contains(type)){ + if(!subjectGrade.equals("P") && !subjectGrade.equals("NP")) { + if (subjectGrade.equals("A+")) { + result += 4.5 * subjectCredit; + } else if (subjectGrade.equals("A0")) { + result += 4.0 * subjectCredit; + } else if (subjectGrade.equals("B+")) { + result += 3.5 * subjectCredit; + } else if (subjectGrade.equals("B0")) { + result += 3.0 * subjectCredit; + } else if (subjectGrade.equals("C+")) { + result += 2.5 * subjectCredit; + } else if (subjectGrade.equals("C0")) { + result += 2.0 * subjectCredit; + } else if (subjectGrade.equals("D+")) { + result += 1.5 * subjectCredit; + } else if (subjectGrade.equals("D0")) { + result += 1.0 * subjectCredit; + } + else if(subjectGrade.equals("F")){ + result += 0.0 * subjectCredit; + } + else{ + throw new IllegalArgumentException("학점은 A+, A0, B+, B0, C+, C0, D+, D0, F, P, NP만 가능합니다."); + } + credit += subjectCredit; + } + } + } + System.out.println("result: " + result + ", credit: " + credit); + result = result / credit; + return String.format("%.2f", result); + + } +} From 06fbcb67d5f322ed2c3de026ec0b4e50c07b91c4 Mon Sep 17 00:00:00 2001 From: uojin29 Date: Tue, 16 Jan 2024 21:35:52 +0900 Subject: [PATCH 2/2] feat: make a test code --- src/main/java/gpacalc/Application.java | 4 +- src/main/java/gpacalc/Grade.java | 40 +++++++++++++++++ src/main/java/gpacalc/Subjects.java | 38 +++++++++++----- src/test/java/gpacalc/SubjectsTest.java | 60 +++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 13 deletions(-) create mode 100644 src/main/java/gpacalc/Grade.java create mode 100644 src/test/java/gpacalc/SubjectsTest.java diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index 9fe36d2..7f83d14 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -29,12 +29,12 @@ public static void main(String[] args) { System.out.println(); System.out.println("<평점평균>"); - String average = subjects.calculateAverage(); + String average = subjects.calculateGPA(null); System.out.println(average + " / 4.5"); System.out.println(); System.out.println("<전공 평점평균>"); - String majorAverage = subjects.calculateAverage("전공"); + String majorAverage = subjects.calculateGPA("전공"); System.out.println(majorAverage + " / 4.5"); } } diff --git a/src/main/java/gpacalc/Grade.java b/src/main/java/gpacalc/Grade.java new file mode 100644 index 0000000..98ff7f8 --- /dev/null +++ b/src/main/java/gpacalc/Grade.java @@ -0,0 +1,40 @@ +package gpacalc; + +public enum Grade { + A_PLUS(4.5, "A+"), + A_ZERO(4.0, "A0"), + B_PLUS(3.5, "B+"), + B_ZERO(3.0, "B0"), + C_PLUS(2.5, "C+"), + C_ZERO(2.0, "C0"), + D_PLUS(1.5, "D+"), + D_ZERO(1.0, "D0"), + P(0.0, "P"), + NP(0.0, "NP"), + F(0.0, "F"); + + private final double score; + private final String grade; + + Grade(double score, String grade) { + this.score = score; + this.grade = grade; + } + + public double getScore() { + return score; + } + + public String getGrade() { + return grade; + } + + public static Grade of(String grade) { + for (Grade value : values()) { + if (value.grade.equals(grade)) { + return value; + } + } + throw new IllegalArgumentException("해당하는 등급이 없습니다."); + } +} diff --git a/src/main/java/gpacalc/Subjects.java b/src/main/java/gpacalc/Subjects.java index 242921c..5bf2c85 100644 --- a/src/main/java/gpacalc/Subjects.java +++ b/src/main/java/gpacalc/Subjects.java @@ -2,16 +2,32 @@ import java.util.Stack; +import static org.junit.platform.commons.util.StringUtils.isBlank; + public class Subjects { Stack stack = new Stack<>(); - private String[] subjects; + public void input(String subject, String type){ String subjects[] = subject.split(","); - this.subjects = subjects; for(int i = 0; i < subjects.length; i++){ subjects[i] = subjects[i].replace("-", ","); - stack.push("[" + type + "] " + subjects[i]); + String subjectName = subjects[i].split(",")[0]; + System.out.println("subjectName: " + subjectName); + if(isBlank(subjectName) && isValid(subjectName)) + stack.push("[" + type + "] " + subjects[i]); + } + } + public boolean isBlank(String subjectName){ + if(subjectName.isBlank()){ + throw new IllegalArgumentException("과목명은 공백이 될 수 없습니다."); + } + return true; + } + public boolean isValid(String subjectName){ + if(subjectName.length() > 10){ + throw new IllegalArgumentException("과목명은 10글자 이내로 입력되어야 합니다."); } + return true; } public void print(){ for(int i = 0; i < stack.size(); i++){ @@ -24,9 +40,7 @@ public int calculateCredit(){ String info[] = stack.get(i).split(","); int credit = Integer.parseInt(info[1]); String grade = info[2]; - if(credit < 1 || credit > 4){ - throw new IllegalArgumentException("학점은 1~4 사이의 숫자만 가능합니다."); - } + isValidCredit(credit); if(grade.equals("F") == false && grade.equals("NP") == false){ result += credit; } @@ -34,10 +48,13 @@ public int calculateCredit(){ return result; } - public String calculateAverage() { - return calculateAverage(null); + public void isValidCredit(int credit){ + if(credit < 1 || credit > 4){ + throw new IllegalArgumentException("학점은 1~4 사이의 숫자만 가능합니다."); + } } - public String calculateAverage(String type) { + + public String calculateGPA(String type) { double result = 0; int credit = 0; for(int i = 0; i < stack.size(); i++){ @@ -68,7 +85,7 @@ else if(subjectGrade.equals("F")){ result += 0.0 * subjectCredit; } else{ - throw new IllegalArgumentException("학점은 A+, A0, B+, B0, C+, C0, D+, D0, F, P, NP만 가능합니다."); + throw new IllegalArgumentException("성적은 A+, A0, B+, B0, C+, C0, D+, D0, F, P, NP만 가능합니다."); } credit += subjectCredit; } @@ -77,6 +94,5 @@ else if(subjectGrade.equals("F")){ System.out.println("result: " + result + ", credit: " + credit); result = result / credit; return String.format("%.2f", result); - } } diff --git a/src/test/java/gpacalc/SubjectsTest.java b/src/test/java/gpacalc/SubjectsTest.java new file mode 100644 index 0000000..ad79dbd --- /dev/null +++ b/src/test/java/gpacalc/SubjectsTest.java @@ -0,0 +1,60 @@ +package gpacalc; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class SubjectsTest { + Subjects subjects; + + @BeforeEach + void setUp() { + subjects = new Subjects(); + } + + @AfterEach + void tearDown() { + subjects = null; + } + + @Test + void isBlankTest() { + assertThatThrownBy(() -> subjects.isBlank("")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("과목명은 공백이 될 수 없습니다."); + } + @Test + void 학점이_잘못된_경우() { + //when + subjects.input("프로그래밍언어-5-A0", "전공"); + + //then + assertThatThrownBy(() -> subjects.calculateCredit()) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("학점은 1~4 사이의 숫자만 가능합니다."); + } + + @Test + void 성적이_잘못된_경우() { + //when + subjects.input("프로그래밍언어-3-S", "전공"); + + //then + assertThatThrownBy(() -> subjects.calculateGPA(null)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("성적은 A+, A0, B+, B0, C+, C0, D+, D0, F, P, NP만 가능합니다."); + } + @Test + void calculateGPATest() { + //given + subjects.input("데이타구조-3-A0,자바프로그래밍언어-3-B+,컴퓨터구조-3-C0,컴퓨터네트워크-3-D+,미술의이해-3-P,교양특론3-1-NP,기독교의이해-2-F", null); + + //when + String result = subjects.calculateGPA(null); + //then + assertEquals("2.36", result); + } +} \ No newline at end of file