Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[13기] 김시온 과제 제출합니다. #28

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
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
33 changes: 32 additions & 1 deletion src/main/java/gpacalc/Application.java
Original file line number Diff line number Diff line change
@@ -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<Subject> major = new ArrayList<>(); // 전공과목
ArrayList<Subject> general = new ArrayList<>(); // 교양과목

//데이터 입력부분
System.out.println("전공 과목명과 이수학점, 평점을 입력해주세요(예시: 프로그래밍언어론-3-A+,소프트웨어공학-3-B+):");
String input_m = Console.readLine();
System.out.println("\n교양 과목명과 이수학점, 평점을 입력해주세요(예시: 선형대수학-3-C0,인간관계와자기성장-3-P):");
String input_g = Console.readLine();

//!!주의!! 여기에서 아래 두 부분을 try-catch 로 묶어버리면 exception 이 발생을 안 해서 테스트 통과를 할 수 없게 된다
major = op.MakeSubjects(input_m);
general = op.MakeSubjects(input_g);

//목록 출력부분
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");
}
}
115 changes: 115 additions & 0 deletions src/main/java/gpacalc/Operations.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package gpacalc;

import java.util.ArrayList;

public class Operations {
public Operations() {
}

public ArrayList<Subject> MakeSubjects(String input){ // 입력받은 과목 저장
ArrayList<Subject> result = new ArrayList<>();
String[] subjects = input.split(",");
for(int i = 0; i < subjects.length; i++) {
String[] info = subjects[i].split("-");
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;
}

public void printSubjects(ArrayList<Subject> major, ArrayList<Subject> 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<Subject> major) { // 전공의 "과목성적가중치의 총합"
double totalWeightSG = 0;
for(Subject s : major) {
if(s.getGradeNumber() != -1){
totalWeightSG += s.getCredit() * s.getGradeNumber();
}
}
return totalWeightSG;
}

public double CalGPA_M(ArrayList<Subject> 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<Subject> major, ArrayList<Subject> 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<Subject> major, ArrayList<Subject> 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<Subject> major, ArrayList<Subject> 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;
}
}
82 changes: 82 additions & 0 deletions src/main/java/gpacalc/Subject.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
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) {
throw e;
}
}

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 IllegalArgumentException("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();
}
}