1400
No
Student
package com.gradebook; public class Student { private int studentId; //학번 private int score; //성적 private int week; //주차 private double average; //평균 private double sum; //합계 private int count;// 과목 수 public int getStudentId() { return studentId; } public void setStudentId(int studentId) { this.studentId = studentId; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int getWeek() { return week; } public void setWeek(int week) { this.week = week; } public double getAverage() { return average; } public void setAverage(double average) { this.average = average; } public double getSum() { return sum; } public void setSum(double sum) { this.sum = sum; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + studentId; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (studentId != other.studentId) return false; return true; } @Override public String toString() { return "Student [studentId=" + studentId + ", score=" + score + ", week=" + week + ", average=" + average + ", sum=" + sum + ", count=" + count + "]"; } }
GradeBook
package com.gradebook; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class GradeBook { //List 학생을 담을 객체 생성 List<Student> studentList; Scanner scanner; private void gradeBook(){ //List<Student> 객체를 생성한다. studentList=new ArrayList<>(); scanner=new Scanner(System.in); StringBuffer sb=new StringBuffer(); sb.append("성적 입력 / 수정 : u 학번(int) 성적(int) 주차(int)\n"); sb.append("총 인원 출력 : n \n"); sb.append("평균 / 표준 편찬 출력 : s 주차(int) \n"); sb.append("1등 학생 출력 : t \n"); sb.append("꼴등 학생 출력 : l \n"); sb.append("종료 : q \n"); System.out.println(sb.toString()); while(true){ String str =scanner.next(); while(true){ System.out.print("command > "); String firstInput =scanner.next(); //첫번째 입력이 u 이면 성적 입력 및 수정 if(firstInput.equals("u")){ try { uInput(); } catch (Exception e) { System.out.println("잘못 입력 하였습니다. 다시 선택하세요."); break; } } //첫번째 문자가 n 이면 총 인원을 구한다. if(firstInput.equals("n")){ System.out.println(nInput().size()); } //첫번째 문자가 s 이면 해당 주차의 점수의 평균과 표준편차를 출력한다. //해당 주차에 점수가 없는 학생은 무시한다. if(firstInput.equals("s")){ try { sInput(); } catch (Exception e) { System.out.println("잘못 입력 하였습니다. 다시 선택하세요."); break; } } //성적의 평균이 가장 높은 학생의 학번을 출력한다 if(firstInput.equals("t")){ tInput(); } //성적의 평균이 가장 낮은 학생의 학번을 출력한다 if(firstInput.equals("l")){ lInput(); } //첫번째 문자가 q 이면 종료된다. if(firstInput.equals("q")){ break; } //첫번째 문자가 a 전체 데이터를 출력한다. if(firstInput.equals("a")){ System.out.println("전체 출력"); for(Student st : studentList){ System.out.println(st.toString()); } } } System.out.println("계속하려면 아무키나 누르십시오..."); } } //첫번째 입력이u 경우 - 성적 입력 및 수정 하는 메소드 private void uInput() throws Exception{ String id =scanner.next(); String score =scanner.next(); String week =scanner.next(); // isNew 는 새롭게 넣을지 또는 수정할지 결정한다. boolean isUpdate=false; //기존 데이터를 수정 할 경우 해당 List 의 번호를 가져온다. int getListId=0; //기존의 데이터가 존재하면 if 문으로 들어간다. if(studentList.size()>0){ for(int i=0; i<studentList.size(); i++){ //동일한 학번이 존재하는지 찾는다. //System.out.println("studentList.get(i).getStudentId()" +studentList.get(i).getStudentId()); if(Integer.parseInt(id)==studentList.get(i).getStudentId()){ //System.out.println("같은 학번이다."); // 해당 주차가 존재하는지 확인한다. if(Integer.parseInt(week)==studentList.get(i).getWeek()){ //System.out.println("동일한 주차이다"); //동일한 학번에 동일한 해당 주차인 경우 수정을 한다. //해당 학번을 가진 학생의 해당 주차 점수를 해당 점수로 갱신한다 isUpdate=true; getListId=i; // System.out.println(" 1 isUpdate :" +isUpdate + " 번호 :"+ getListId); break; }else{ //동일한 학번이지만 주차가 다른 경우는 Student 객체생성 후 새로 추가한다. // System.out.println("2 isUpdate :" +isUpdate); } }else{ //동일한 학번이 아닌경우에는 Student 객체생성 후 새로 추가한다. //System.out.println("3 isUpdate :" +isUpdate); } } } if(isUpdate){ //해당 학번을 가진 학생의 해당 주차 점수를 해당 점수로 갱신한다. //System.out.println("업데이트 "); for(int i=0; i<studentList.size(); i++){ //List 의 수정할 해당 객체를 찾는다. if(i==getListId){ //점수를 갱신한다. studentList.get(i).setScore(Integer.parseInt(score)); break; } } }else{ //System.out.println("student 생성"); gradeInput(id, score, week); } isUpdate=false; } //성적 입력 메소드 private void gradeInput(String id, String score, String week) { //학번 , 점수, 주차 를 저장할 DTO Student 개체를 생성한다. Student student=new Student(); student.setStudentId(Integer.parseInt(id)); student.setScore(Integer.parseInt(score)); student.setWeek(Integer.parseInt(week)); studentList.add(student); } //n 키 입력시 - 총 인원을 구하는 메소드 //반환 값은 중복이 제거된 학번 목록이다. private List<Student> nInput(){ //학번을 기준으로 중복 제거를 위한 List 객체를 생성한다. List<Student> resultList=new ArrayList<>(); List<Integer> id=new ArrayList<>(); //List<Student> 객체에 담긴 객체를 반복문을 돌린다. for(Student st : studentList){ //만약에 resultList 객체에 동일한 학번이 존재하지 않으면 if(!id.contains(st.getStudentId())){ // resultList 에 학번을 추가한다. Student student=new Student(); student.setStudentId(st.getStudentId()); id.add(st.getStudentId()); resultList.add(student); } } //중복이 제거 된 resultList 사이즈는 곧 학생수가 된다. return resultList; } // s 키 입력시 - 해당 주차의 점수의 평균과 표준편차를 출력하는 메소드 private void sInput() throws Exception{ //주차 입력 String week =scanner.next(); //평균 double sum=0.0; double diff; double average=0.0; //표준편차를 구하기 위한 list List<Double> doubleScore= new ArrayList<>(); for(int i=0; i<studentList.size(); i++){ //주차가 같을 경우 if(Integer.parseInt(week)==studentList.get(i).getWeek()){ //합산한다. sum +=studentList.get(i).getScore(); doubleScore.add((double)studentList.get(i).getScore()); } } //평균 sum / 학생수 average = sum/doubleScore.size(); //소수점 5째자리 이하 반올림 System.out.println(week +"주차 평균 : " + (int)(average* 100000 + 0.5)/100000.0); //표준 편차 구하기 - 공식 적용 String sqrtString=""; sum=0.0; if (doubleScore.size() < 2) sqrtString="NaN"; for (int i = 0; i < doubleScore.size(); i++) { diff = doubleScore.get(i) - average; sum += diff * diff; } double sqrt = Math.sqrt(sum / (doubleScore.size() - 0)); //소수점 5째자리 이하 반올림 sqrtString=String.valueOf( (int)(sqrt* 100000 + 0.5)/100000.0 ); System.out.println("표준편차 : " +sqrtString); } // t 키 입력시 - 성적의 평균이 가장 높은 학생의 학번을 출력한다. private void tInput(){ List<Student> stL= averAgeList(); //성적의 평균이 가장 높은 학생의 학번을 출력 if(stL.size()==0){ System.out.println("데이터를 입력하세요"); }else{ List<Double> d =new ArrayList<>(); for(int i=0; i<stL.size(); i++){ d.add(stL.get(i).getAverage()); } double max=Collections.max(d); Integer studentId=null; for(int i=0; i<stL.size(); i++){ //평균이 최대값이 같으면 해당 학번을 가져온다. if(stL.get(i).getAverage()==max){ studentId =stL.get(i).getStudentId(); break; } } System.out.println(studentId); } } // l 키 입력시 - 성적의 평균이 가장 낮은 학생의 학번을 출력한다. private void lInput(){ List<Student> stL= averAgeList(); if(stL.size()==0){ System.out.println("데이터를 입력하세요"); }else{ List<Double> d =new ArrayList<>(); for(int i=0; i<stL.size(); i++){ d.add(stL.get(i).getAverage()); } double min=Collections.min(d); Integer studentId=null; for(int i=0; i<stL.size(); i++){ //평균이 최소값인 같으면 해당 학번을 가져온다. if(stL.get(i).getAverage()==min){ studentId =stL.get(i).getStudentId(); break; } } System.out.println(studentId); } } //학생의 평균과 합계 계산 private List<Student> averAgeList(){ //1.학생의 합계구하기 //nInput() 중복이 제거된 학번 sum List<Student> stL=nInput(); for(int i=0; i<stL.size(); i++){ for(int j=0; j<studentList.size(); j++){ //만약 nInput 의 i 번째 학번과 같으면 sum 누적시킨다. if(stL.get(i).getStudentId()==studentList.get(j).getStudentId()){ //합계 stL.get(i).setSum( stL.get(i).getSum()+ studentList.get(j).getScore()); //과목수 누적 stL.get(i).setCount(stL.get(i).getCount()+ 1); } } } //2.평균 구하기 for(Student s: stL){ s.setAverage(s.getSum()/s.getCount()); //System.out.println(s.toString()); } return stL; } public static void main(String[] args) { GradeBook gradeBook=new GradeBook(); gradeBook.gradeBook(); } }
test.txt
u 22162012 10 1 u 22162012 9 2 u 22162012 8 3 u 22162012 7 4 u 22162012 6 5 u 20101587 1 1 u 20101587 2 2 u 20101587 3 3 u 20101587 4 4 u 20101587 5 5 u 20101587 6 6 u 11111111 1 1 u 11111111 1 1 u 11111111 3 3 u 11111111 3 3
콘솔
댓글 ( 4)
댓글 남기기