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함수를 간결하게 만들기 위해서 함수를 통해서 간결하게 만드는 것을 목표로 진행 할 예정 diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index 57e79e1..bcbacff 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -1,7 +1,159 @@ 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("-"); + validateSubjectName(majorsplit[0]); + 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("-"); + validateSubjectName(refinesplit[0]); + Refinement currentRefine = new Refinement(refinesplit[0], Integer.parseInt(refinesplit[1]), refinesplit[2]); + refinementsList.add(currentRefine); + } + //교양이랑 전공 따로따로 모아놔야함 getter로 가져와서 쓰면 될듯? list에 담아뒀잖아. + //취득학점 만들기 전에 그냥 싹다 p np 거나 F 면 배제해야함. + //f np 면 취득학점에서 제외. p np는 평점평균에서 제외 + for(Major major : majorsList){ + System.out.println("[전공] " + major.getMajorName() + "," + + major.getMajorScore() + "," + + major.getMajorCredit()); + } + + for (Refinement refine : refinementsList) { + // [교양] 과목명,이수학점,평점 + 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); + + } + + + // 전체 취득학점 추출함수 + static void TotalScore(ArrayList m, ArrayList r){ + + int totalScore = 0; + + for(Major major : m){ + String grade = major.getMajorCredit(); // 평점(A+, F 등)을 가져오는 getter가 있다고 가정 + if(!grade.equals("F") && !grade.equals("NP")){ + totalScore += (int) major.getMajorScore(); + } + } + + for(Refinement refine : r){ + String grade = refine.getRefinementCredit(); // 평점(A+, F 등)을 가져오는 getter가 있다고 가정 + if(!grade.equals("F") && !grade.equals("NP")){ + totalScore += (int) refine.getRefineScore(); + } + } + + System.out.println("<취득학점>"); + + System.out.println(totalScore+"학점"); + + + + } + + static void TotalAverage(ArrayList m, ArrayList r) { + 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(); + } + } + + 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 = totalGradePoints / gpaTargetCredits; + System.out.printf("<평점평균>\n"); + 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.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("과목명은 공백만으로 구성될 수 없습니다."); + } } } + + 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..7302cdb 100644 --- a/src/test/java/ApplicationTest.java +++ b/src/test/java/ApplicationTest.java @@ -14,7 +14,7 @@ public class ApplicationTest extends NsTest { assertThat(output()).contains( "<과목 목록>", "[전공] 데이타구조,3,A0", - "[전공] 자바프로그래밍언어,3,B+", + "[전공] 자바프로그래밍언어,3,B+" "[전공] 컴퓨터구조,3,C0", "[전공] 컴퓨터네트워크,3,D+", "[교양] 미술의이해,3,P",