From 48b6ce844a66b63c401dcf9257676758e2ad751c Mon Sep 17 00:00:00 2001 From: "CHO, NAEUN" Date: Thu, 25 Dec 2025 21:13:29 +0900 Subject: [PATCH 1/4] version1 --- src/main/java/gpacalc/Application.java | 93 ++++++++++++++++++++++++++ src/main/java/gpacalc/Major.java | 60 +++++++++++++++++ src/main/java/gpacalc/Refinement.java | 58 ++++++++++++++++ src/test/java/ApplicationTest.java | 2 +- 4 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gpacalc/Major.java create mode 100644 src/main/java/gpacalc/Refinement.java diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index 57e79e1..927eaff 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -1,7 +1,100 @@ package gpacalc; +/* +먼저 class를 만들면 안돼 +name 은 강의명 +credit은 이수학점 +score는 평점 (a, b, c등) 이다. + + */ + +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: 구현 + ArrayList majorsList = new ArrayList<>(); + ArrayList refinementsList = new ArrayList<>(); + + System.out.println("전공 과목명과 이수학점, 평점을 입력해주세요(예시: 프로그래밍언어론-3-A+,소프트웨어공학-3-B+):"); + + String inputMajor = readLine(); + String[] majorInput = inputMajor.split(","); + + for(String repet : majorInput){ + String[] majorsplit = repet.split("-"); + Major currentMajor = new Major(majorsplit[0], Integer.parseInt(majorsplit[1]), majorsplit[2]); + majorsList.add(currentMajor); + } + + System.out.println("교양 과목명과 이수학점, 평점을 입력해주세요(예시: 선형대수학-3-C0,인간관계와자기성장-3-P):"); + String inputRefine = readLine(); + String[] refineInput = inputRefine.split(","); + + for(String repet : refineInput){ + String[] refinesplit = repet.split("-"); + Refinement currentRefine = new Refinement(refinesplit[0], Integer.parseInt(refinesplit[1]), refinesplit[2]); + refinementsList.add(currentRefine); + } + //교양이랑 전공 따로따로 모아놔야함 getter로 가져와서 쓰면 될듯? list에 담아뒀잖아. + //취득학점 만들기 전에 그냥 싹다 p np 거나 F 면 배제해야함. + //f np 면 취득학점에서 제외. p np는 평점평균에서 제외 + double totalScore = 0; + totalScore = TotalScore(majorsList, refinementsList);// 전체 취득학점 추출함수 + TotalAverage(majorsList, refinementsList, totalScore); + + } + + + // 전체 취득학점 추출함수 + static double TotalScore(ArrayList m, ArrayList r){ + + double totalScore = 0; + + for(Major major : m){ + String grade = major.getMajorCredit(); // 평점(A+, F 등)을 가져오는 getter가 있다고 가정 + if(!grade.equals("F") && !grade.equals("NP")){ + totalScore += major.getMajorScore(); + } + } + + for(Refinement refine : r){ + String grade = refine.getRefinementCredit(); // 평점(A+, F 등)을 가져오는 getter가 있다고 가정 + if(!grade.equals("F") && !grade.equals("NP")){ + totalScore += refine.getRefineScore(); + } + } + + System.out.println("<취득학점>"); + + System.out.println(totalScore+"학점"); + + return totalScore; + } + + static void TotalAverage(ArrayList m, ArrayList r, double totalScore){ + + double subjectGradeWeighting = 0; + double totalGrade = 0; + + for(Major major : m){ + subjectGradeWeighting = major.MajorCreditToPoint(); + totalGrade += subjectGradeWeighting * major.majorScore ; + } + + for(Refinement refine : r){ + subjectGradeWeighting = refine.RefineCreditToPoint(); + totalGrade += subjectGradeWeighting * refine.refineScore; + } + + double totalAverage = totalGrade / totalScore; + System.out.println(totalAverage); + } + + } + + diff --git a/src/main/java/gpacalc/Major.java b/src/main/java/gpacalc/Major.java new file mode 100644 index 0000000..79da614 --- /dev/null +++ b/src/main/java/gpacalc/Major.java @@ -0,0 +1,60 @@ +package gpacalc; + +public class Major { + + String majorName; + String majorCredit; + double majorScore; + + public String getMajorName() { + return majorName; + } + + public void setMajorName(String majorName) { + this.majorName = majorName; + } + + public String getMajorCredit() { + return majorCredit; + } + + public void setMajorCredit(String majorCredit) { + this.majorCredit = majorCredit; + } + + public double getMajorScore() { + return majorScore; + } + + public void setMajorScore(double majorScore) { + this.majorScore = majorScore; + } + + public Major(String majorName, double majorScore, String majorCredit){ + this.majorName =majorName; + this.majorCredit = majorCredit; + this.majorScore = majorScore; + } + + @Override + public String toString() { + return "Major{" + + "majorName='" + majorName + '\'' + + ", majorCredit='" + majorCredit + '\'' + + ", majorScore=" + majorScore + + '}'; + } + + public double MajorCreditToPoint(){ + if(this.majorCredit.equals("A+")) return 4.5; + else if(this.majorCredit.equals("A0")) return 4.0; + else if(this.majorCredit.equals("B+")) return 3.5; + else if(this.majorCredit.equals("B0")) return 3.0; + else if(this.majorCredit.equals("C+")) return 2.5; + else if(this.majorCredit.equals("C0")) return 2.0; + else if(this.majorCredit.equals("D+")) return 1.5; + else if(this.majorCredit.equals("D0")) return 1.0; + else return 0; + + } +} diff --git a/src/main/java/gpacalc/Refinement.java b/src/main/java/gpacalc/Refinement.java new file mode 100644 index 0000000..21ce9ed --- /dev/null +++ b/src/main/java/gpacalc/Refinement.java @@ -0,0 +1,58 @@ +package gpacalc; + +public class Refinement { + String refinementName; + String refinementCredit; + double refineScore; + + public String getRefinementName() { + return refinementName; + } + + public void setRefinementName(String refinementName) { + this.refinementName = refinementName; + } + + public String getRefinementCredit() { + return refinementCredit; + } + + public void setRefinementCredit(String refinementCredit) { + this.refinementCredit = refinementCredit; + } + + public double getRefineScore() { + return refineScore; + } + + public void setRefineScore(double refineScore) { + this.refineScore = refineScore; + } + + public Refinement(String refinementName, double refineScore, String refinementCredit){ + this.refinementName = refinementName; + this.refinementCredit = refinementCredit; + this.refineScore = refineScore; + } + + @Override + public String toString() { + return "Refinement{" + + "refinementName='" + refinementName + '\'' + + ", refinementCredit='" + refinementCredit + '\'' + + ", refineScore=" + refineScore + + '}'; + } + + public double RefineCreditToPoint(){ + if(this.refinementCredit.equals("A+")) return 4.5; + else if(this.refinementCredit.equals("A0")) return 4.0; + else if(this.refinementCredit.equals("B+")) return 3.5; + else if(this.refinementCredit.equals("B0")) return 3.0; + else if(this.refinementCredit.equals("C+")) return 2.5; + else if(this.refinementCredit.equals("C0")) return 2.0; + else if(this.refinementCredit.equals("D+")) return 1.5; + else if(this.refinementCredit.equals("D0")) return 1.0; + else return 0; + } +} diff --git a/src/test/java/ApplicationTest.java b/src/test/java/ApplicationTest.java index 38086f8..7c66d2e 100644 --- a/src/test/java/ApplicationTest.java +++ b/src/test/java/ApplicationTest.java @@ -3,7 +3,7 @@ import camp.nextstep.edu.missionutils.test.NsTest; import gpacalc.Application; -import org.junit.jupiter.api.Test; +import org.junit. public class ApplicationTest extends NsTest { From 0be2043a9ddbca10c62d10795af4f38601f2cd2b Mon Sep 17 00:00:00 2001 From: "CHO, NAEUN" Date: Thu, 25 Dec 2025 22:03:09 +0900 Subject: [PATCH 2/4] final --- src/main/java/gpacalc/Application.java | 69 ++++++++++++++++++++------ src/test/java/ApplicationTest.java | 4 +- 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index 927eaff..3fc0daa 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -41,16 +41,28 @@ public static void main(String[] args) { //교양이랑 전공 따로따로 모아놔야함 getter로 가져와서 쓰면 될듯? list에 담아뒀잖아. //취득학점 만들기 전에 그냥 싹다 p np 거나 F 면 배제해야함. //f np 면 취득학점에서 제외. p np는 평점평균에서 제외 - double totalScore = 0; - totalScore = TotalScore(majorsList, refinementsList);// 전체 취득학점 추출함수 - TotalAverage(majorsList, refinementsList, totalScore); + for(Major major : majorsList){ + System.out.println("[전공] " + major.getMajorName() + "," + + major.getMajorScore() + "," + + major.getMajorCredit()); + } + for (Refinement refine : refinementsList) { + // [교양] 과목명,이수학점,평점 + System.out.println("[교양] " + refine.getRefineScore() + "," + + refine.getRefineScore() + "," + + refine.getRefinementCredit()); + } + + TotalScore(majorsList, refinementsList);// 전체 취득학점 추출함수 + TotalAverage(majorsList, refinementsList); + MajorAverage(majorsList); } // 전체 취득학점 추출함수 - static double TotalScore(ArrayList m, ArrayList r){ + static void TotalScore(ArrayList m, ArrayList r){ double totalScore = 0; @@ -72,26 +84,51 @@ static double TotalScore(ArrayList m, ArrayList r){ System.out.println(totalScore+"학점"); - return totalScore; + + } - static void TotalAverage(ArrayList m, ArrayList r, double totalScore){ + static void TotalAverage(ArrayList m, ArrayList r) { + double totalGradePoints = 0; - double subjectGradeWeighting = 0; - double totalGrade = 0; + int gpaTargetCredits = 0; - for(Major major : m){ - subjectGradeWeighting = major.MajorCreditToPoint(); - totalGrade += subjectGradeWeighting * major.majorScore ; + for (Major major : m) { + String grade = major.getMajorCredit(); // A+, P, F 등 + + if (!grade.equals("P") && !grade.equals("NP")) { + totalGradePoints += major.getMajorScore() * major.MajorCreditToPoint(); + gpaTargetCredits += major.getMajorScore(); + } } - for(Refinement refine : r){ - subjectGradeWeighting = refine.RefineCreditToPoint(); - totalGrade += subjectGradeWeighting * refine.refineScore; + for (Refinement refine : r) { + String grade = refine.getRefinementCredit(); + if (!grade.equals("P") && !grade.equals("NP")) { + totalGradePoints += refine.getRefineScore() * refine.RefineCreditToPoint(); + gpaTargetCredits += refine.getRefineScore(); + } } - double totalAverage = totalGrade / totalScore; - System.out.println(totalAverage); + double totalAverage = totalGradePoints / gpaTargetCredits; + System.out.printf("평균 평점: %.2f / 4.5\n", totalAverage); + + } + static void MajorAverage(ArrayList m){ + double totalGradePoints = 0; + + int gpaTargetCredits = 0; + + for (Major major : m) { + String grade = major.getMajorCredit(); // A+, P, F 등 + + if (!grade.equals("P") && !grade.equals("NP")) { + totalGradePoints += major.getMajorScore() * major.MajorCreditToPoint(); + gpaTargetCredits += major.getMajorScore(); + } + } + double totalAverage = totalGradePoints / gpaTargetCredits; + System.out.printf("평균 평점: %.2f / 4.5\n", totalAverage); } diff --git a/src/test/java/ApplicationTest.java b/src/test/java/ApplicationTest.java index 7c66d2e..7302cdb 100644 --- a/src/test/java/ApplicationTest.java +++ b/src/test/java/ApplicationTest.java @@ -3,7 +3,7 @@ import camp.nextstep.edu.missionutils.test.NsTest; import gpacalc.Application; -import org.junit. +import org.junit.jupiter.api.Test; public class ApplicationTest extends NsTest { @@ -14,7 +14,7 @@ public class ApplicationTest extends NsTest { assertThat(output()).contains( "<과목 목록>", "[전공] 데이타구조,3,A0", - "[전공] 자바프로그래밍언어,3,B+", + "[전공] 자바프로그래밍언어,3,B+" "[전공] 컴퓨터구조,3,C0", "[전공] 컴퓨터네트워크,3,D+", "[교양] 미술의이해,3,P", From 0c302f6a3652cc9c2b6a9175e7be7d9e49459c1e Mon Sep 17 00:00:00 2001 From: "CHO, NAEUN" Date: Thu, 25 Dec 2025 23:23:58 +0900 Subject: [PATCH 3/4] final report --- src/main/java/gpacalc/Application.java | 36 +++++++++++++++++++++----- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index 3fc0daa..bcbacff 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -25,6 +25,7 @@ public static void main(String[] args) { for(String repet : majorInput){ String[] majorsplit = repet.split("-"); + validateSubjectName(majorsplit[0]); Major currentMajor = new Major(majorsplit[0], Integer.parseInt(majorsplit[1]), majorsplit[2]); majorsList.add(currentMajor); } @@ -35,6 +36,7 @@ public static void main(String[] args) { for(String repet : refineInput){ String[] refinesplit = repet.split("-"); + validateSubjectName(refinesplit[0]); Refinement currentRefine = new Refinement(refinesplit[0], Integer.parseInt(refinesplit[1]), refinesplit[2]); refinementsList.add(currentRefine); } @@ -49,13 +51,16 @@ public static void main(String[] args) { for (Refinement refine : refinementsList) { // [교양] 과목명,이수학점,평점 - System.out.println("[교양] " + refine.getRefineScore() + "," - + refine.getRefineScore() + "," - + refine.getRefinementCredit()); - } + System.out.println("[교양] " + refine.getRefinementName() + "," + + refine.getRefineScore() + "," + + refine.getRefinementCredit()); + } + System.out.printf("\n"); TotalScore(majorsList, refinementsList);// 전체 취득학점 추출함수 + System.out.printf("\n"); TotalAverage(majorsList, refinementsList); + System.out.printf("\n"); MajorAverage(majorsList); } @@ -64,19 +69,19 @@ public static void main(String[] args) { // 전체 취득학점 추출함수 static void TotalScore(ArrayList m, ArrayList r){ - double totalScore = 0; + int totalScore = 0; for(Major major : m){ String grade = major.getMajorCredit(); // 평점(A+, F 등)을 가져오는 getter가 있다고 가정 if(!grade.equals("F") && !grade.equals("NP")){ - totalScore += major.getMajorScore(); + totalScore += (int) major.getMajorScore(); } } for(Refinement refine : r){ String grade = refine.getRefinementCredit(); // 평점(A+, F 등)을 가져오는 getter가 있다고 가정 if(!grade.equals("F") && !grade.equals("NP")){ - totalScore += refine.getRefineScore(); + totalScore += (int) refine.getRefineScore(); } } @@ -111,6 +116,7 @@ static void TotalAverage(ArrayList m, ArrayList r) { } double totalAverage = totalGradePoints / gpaTargetCredits; + System.out.printf("<평점평균>\n"); System.out.printf("평균 평점: %.2f / 4.5\n", totalAverage); } @@ -128,10 +134,26 @@ static void MajorAverage(ArrayList m){ } } double totalAverage = totalGradePoints / gpaTargetCredits; + System.out.println("<전공 평점평균>"); System.out.printf("평균 평점: %.2f / 4.5\n", totalAverage); } + public static void validateSubjectName(String name) { + if (name == null) { + throw new IllegalArgumentException("과목명은 null일 수 없습니다."); + } + + // 공백 포함 길이 10자 이내 + if (name.length() > 10) { + throw new IllegalArgumentException("과목명은 공백 포함 10자 이내여야 합니다."); + } + + // 공백만으로 구성되면 안 됨 (trim() 결과가 빈 문자열이면 전부 공백/탭/개행) + if (name.trim().isEmpty()) { + throw new IllegalArgumentException("과목명은 공백만으로 구성될 수 없습니다."); + } + } } From 888502d9884507f85cba6120fafeb8605237edbc Mon Sep 17 00:00:00 2001 From: "CHO, NAEUN" Date: Thu, 25 Dec 2025 23:35:31 +0900 Subject: [PATCH 4/4] Update README.md --- docs/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29..bca7542 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,16 @@ +# 학점 계산기 만들기 + +## 구현 class +- class는 총 3가지로 main Major Refinement로 구성 + -- mian 에 구성되어 있는 함수는 TotalScore TotalAverage MajorAverage validateSubjectName로 구성 +### Major class와 Refinement는 전공과 교양으로 나눠져 있음 두 class는 동일한 행동을 진행함 + - Name(과목명) + - Credit(학점) + - Score(성적) + > 이루어져 있음 각각 입력값을 받게 준비되어 있음 + >> 각각 class 안에 MajorCreditToPoint 함수가 존재. 이 함수는 Credit을 숫자로 변환하기 위한 함수로 사용되었음 +## main함수 구현 +> 메인 함수는 처음 안내를 출력 후 입력을 받고 이후 .spilt을 통해서 나눠서 진행됨 +>> 전공과 교양을 나누어서 따로 담아서 ArrayList에 담겨 있고 이를 통해서 전체 학점 전체 평점 전공 평점을 구함 +>>> 마지막으로 validateSubjectName를 통해서 처음 입력값에 대한 error를 조절함 +####클래스에 대해서 아직 완벽하게 이해하지 못하고 main함수를 깔끔하게 만들지 못한 것에 대한 아쉬움이 남음 이후 구현하는 과제에서는 main함수를 간결하게 만들기 위해서 함수를 통해서 간결하게 만드는 것을 목표로 진행 할 예정