Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -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함수를 간결하게 만들기 위해서 함수를 통해서 간결하게 만드는 것을 목표로 진행 할 예정
152 changes: 152 additions & 0 deletions src/main/java/gpacalc/Application.java
Original file line number Diff line number Diff line change
@@ -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<Major> majorsList = new ArrayList<>();
ArrayList<Refinement> 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<Major> m, ArrayList<Refinement> 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<Major> m, ArrayList<Refinement> 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<Major> 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("과목명은 공백만으로 구성될 수 없습니다.");
}
}
}


60 changes: 60 additions & 0 deletions src/main/java/gpacalc/Major.java
Original file line number Diff line number Diff line change
@@ -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;

}
}
58 changes: 58 additions & 0 deletions src/main/java/gpacalc/Refinement.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion src/test/java/ApplicationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class ApplicationTest extends NsTest {
assertThat(output()).contains(
"<과목 목록>",
"[전공] 데이타구조,3,A0",
"[전공] 자바프로그래밍언어,3,B+",
"[전공] 자바프로그래밍언어,3,B+"
"[전공] 컴퓨터구조,3,C0",
"[전공] 컴퓨터네트워크,3,D+",
"[교양] 미술의이해,3,P",
Expand Down