반응형
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 | package homework; import java.util.Scanner; public class GradeManagementSystem { // 필드 private Name myName; private Subject kor; private Subject eng; private Subject math; private int total; private float avg; private static int count; // 객체 배열의 카운트 변수 private static int pos; // 검색 시 탐색하기 위한 카운트 변수 private static int tempGrade; // 수정할 점수를 잠시 저장하는 변수 GradeManagementSystem[] gm; Scanner sc = new Scanner(System.in); // 생성자 GradeManagementSystem() { myName = new Name(); kor = new Subject(); eng = new Subject(); math = new Subject(); total = 0; avg = 0; count = 0; pos = 0; // 객체 배열 생성 gm = new GradeManagementSystem[50]; } GradeManagementSystem(String name, int kor, int eng, int math, int total, float avg) { myName = new Name(name); this.kor = new Subject(kor); this.eng = new Subject(eng); this.math = new Subject(math); this.total = total; this.avg = avg; } // 연산 : 국영수 점수를 주면 총점, 평균을 계산해준다 public void takeCareOf(int kor, int eng, int math) { total = kor + eng + math; avg = total / 3.f; } // 이름, 국영수 성적을 입력하면 총점과 평균을 자동 계산하고 총점순으로 정렬해서 한명씩 입력 public void input() { System.out.println("──────────────────"); System.out.println("학생 정보를 입력합니다."); System.out.println("이름을 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); myName.setName(sc.next()); // myName.setName(sc.nextLine()); System.out.println("──────────────────"); System.out.println("국어 성적을 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); kor.setSubj(sc.nextInt()); System.out.println("──────────────────"); System.out.println("영어 성적을 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); eng.setSubj(sc.nextInt()); System.out.println("──────────────────"); System.out.println("수학 성적을 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); math.setSubj(sc.nextInt()); // 총점, 평균 계산 메소드 호출 takeCareOf(kor.getSubj(), eng.getSubj(), math.getSubj()); // 국영수, 총점, 평균까지 담긴 데이터를 불러 객체 주입 gm[count++] = new GradeManagementSystem(myName.getName(), kor.getSubj(), eng.getSubj(), math.getSubj(), total, avg); System.out.println("──────────────────"); System.out.println("학생 정보 등록 완료!"); // 입력할 때마다 정렬하는 게 편하다; 삽입 정렬으로! if(count > 0) { insertionSort(gm, count); } } // 삽입 정렬(첫 메소드를 호출할 때 count는 2를 받아온다. public void insertionSort(GradeManagementSystem[] gm, int cnt) { int i, j, totalKey; GradeManagementSystem temp; try { for (i = 1; i < cnt; i++) { totalKey = gm[i].total; // 두번째 위치의 총합을 받아온다. for (j = i - 1; j >= 0 && gm[j].total < totalKey; j--) { temp = gm[j]; gm[j] = gm[j + 1]; // 앞으로 이동 gm[j + 1] = temp; // 뒤에 붙여 } } } catch(NullPointerException ne) { } } // 이름을 통한 검색을 했을 때 데이터에 이름이 있으면 true, 아니면 false를 반환 public boolean isCorrespond(String wantToName) { // 처음부터 탐색하기 위해 0으로 초기화 pos = 0; while(true) { try { if(gm[pos].myName.getName().equals(wantToName)) { return true; } } catch(NullPointerException ne) { // 찾는 이름이 없다면 null pointer가 발생하므로 예외처리! System.out.println("──────────────────"); System.out.println("찾고자 하는 이름이 없습니다."); return false; } pos++; continue; } } // 한 사람에 대한 국영수, 총점, 평균을 출력하는 함수 public void showTargetInfo(String wantToName) { if (isCorrespond(wantToName)) { System.out.println("──────────────────"); System.out.println("NAME / KOR / ENG / MATH / TOTAL / AVERAGE"); System.out.println(gm[pos].myName.getName() + "\t" + gm[pos].kor.getSubj() + "\t" + gm[pos].eng.getSubj() + "\t" + gm[pos].math.getSubj() + "\t" + gm[pos].total + "\t" + gm[pos].avg); } } // 2번 기능 - 학생 전체 출력만을 위한 메소드 public void showAllInfo() { if(count == 0) { System.out.println("──────────────────"); System.out.println("현재 등록된 학생이 1도 없습니다."); System.out.println("메인 화면으로 돌아갑니다."); return; } System.out.println("NAME / KOR / ENG / MATH / TOTAL / AVERAGE"); for(int i = 0; i < gm.length; i++) { try { System.out.println(gm[i].myName.getName() + "\t" + gm[i].kor.getSubj() + "\t" + gm[i].eng.getSubj() + "\t" + gm[i].math.getSubj() + "\t" + gm[i].total + "\t" + gm[i].avg); } catch(NullPointerException ne) { break; } //if(gm[i].myName.getName() == "X") } } // 3번 기능 - 검색 public void search() { if(count == 0) { System.out.println("──────────────────"); System.out.println("현재 등록된 학생이 1도 없습니다."); System.out.println("메인 화면으로 돌아갑니다."); return; } System.out.println("──────────────────"); System.out.println("학생을 검색합니다."); System.out.println("어떤 방법으로 검색하시겠습니까?"); System.out.println("1. 이름" + "\t" + "2. 성적"); System.out.println("──────────────────"); System.out.print(" ──> "); int button = sc.nextInt(); switch(button) { case 1: System.out.println("──────────────────"); System.out.println("학생 이름으로 검색합니다."); System.out.println("찾고자 하는 이름을 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); String wantToName = sc.next(); // 찾는 이름이 있으면 그 학생에 대한 정보를 출력한다. if(isCorrespond(wantToName)) { showTargetInfo(wantToName); } break; case 2: System.out.println("──────────────────"); System.out.println("학생 총점으로 검색합니다."); System.out.println("찾고자 하는 총점을 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); int tempTotal = sc.nextInt(); // 총점이 같은 애들을 다 표시해줘야 함 break; default: System.out.println("──────────────────"); System.out.println("잘못된 번호를 입력하였습니다."); System.out.println("다시 시도해주세요."); break; } } // 4) 삭제하는 경우 - 학생 객체가 마지막인 경우와 그렇지 않은 경우 크게 2가지로 나뉜다. public void deleteInfo() { if(count == 0) { System.out.println("──────────────────"); System.out.println("현재 등록된 학생이 1도 없습니다."); System.out.println("메인 화면으로 돌아갑니다."); return; } System.out.println("──────────────────"); System.out.println("학생 정보를 삭제합니다."); System.out.println("지우고자 하는 이름을 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); String wantToName = sc.next(); if(isCorrespond(wantToName)) { showTargetInfo(wantToName); } else { return; } System.out.println("──────────────────"); System.out.println("현재 " + wantToName + "의 데이터가 존재합니다."); System.out.println("정말 삭제하시겠습니까?"); System.out.println("1. 네" + "\t" + "2. 아니오"); System.out.println("──────────────────"); System.out.print(" ──> "); int button = sc.nextInt(); switch(button) { case 1: // 만약 지울 데이터가 맨 끝에 있다면 if(pos == count) { gm[pos] = null; } else { // 지울 데이터가 끝에 없다면 while (pos < count - 1) { gm[pos] = gm[pos + 1]; pos++; continue; } // 마지막은 NULL 처리 해준다. gm[pos] = null; } count--; System.out.println("──────────────────"); System.out.println("학생 정보가 삭제되었습니다!"); break; case 2: System.out.println("──────────────────"); System.out.println("메인 화면으로 돌아갑니다."); return; default: break; } } // end of deleteInfo() // 학생 성적 수정 public void correctGrade() { if(count == 0) { System.out.println("──────────────────"); System.out.println("현재 등록된 학생이 1도 없습니다."); System.out.println("메인 화면으로 돌아갑니다."); return; } System.out.println("──────────────────"); System.out.println("학생 이름으로 검색합니다."); System.out.println("찾고자 하는 이름을 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); String wantToName = sc.next(); if(isCorrespond(wantToName)) { showTargetInfo(wantToName); } else { return; } System.out.println("──────────────────"); System.out.println("현재 " + wantToName + "의 데이터가 다음과 같습니다."); System.out.println("어떤 과목의 성적을 수정하시겠습니까?"); System.out.println("1. 국어" + "\t" + "2. 영어" + "\t" + "3. 수학"); System.out.println("──────────────────"); System.out.print(" ──> "); int button = sc.nextInt(); switch(button) { case 1: System.out.println("──────────────────"); System.out.println("국어 성적을 수정합니다."); System.out.println("수정할 점수를 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); tempGrade = sc.nextInt(); // 국어 성적을 수정 gm[pos].kor.setSubj(tempGrade); // 입력받은 점수를 반영하여 총점과 평균을 다시 산출 takeCareOf(gm[pos].kor.getSubj(), gm[pos].eng.getSubj(), gm[pos].math.getSubj()); // 해당 객체에 다시 산출한 총점과 평균을 setting 한다 gm[pos].total = gm[pos].kor.getSubj() + gm[pos].eng.getSubj() + gm[pos].math.getSubj(); gm[pos].avg = gm[pos].total / 3.f; // 다시 삽입 정렬 insertionSort(gm, count); System.out.println("──────────────────"); System.out.println("수정이 완료되었습니다!"); System.out.println("확인해보삼ㅎㅎ"); break; case 2: System.out.println("──────────────────"); System.out.println("영어 성적을 수정합니다."); System.out.println("수정할 점수를 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); tempGrade = sc.nextInt(); // 영어 성적을 수정 gm[pos].eng.setSubj(tempGrade); // 입력받은 점수를 반영하여 총점과 평균을 다시 산출 takeCareOf(gm[pos].kor.getSubj(), gm[pos].eng.getSubj(), gm[pos].math.getSubj()); gm[pos].total = gm[pos].kor.getSubj() + gm[pos].eng.getSubj() + gm[pos].math.getSubj(); gm[pos].avg = gm[pos].total / 3.f; insertionSort(gm, count); System.out.println("──────────────────"); System.out.println("수정이 완료되었습니다!"); System.out.println("확인해보삼ㅎㅎ"); break; case 3: System.out.println("──────────────────"); System.out.println("수학 성적을 수정합니다."); System.out.println("수정할 점수를 입력하세요."); System.out.println("──────────────────"); System.out.print(" ──> "); tempGrade = sc.nextInt(); // 국어 성적을 수정 gm[pos].math.setSubj(tempGrade); // 입력받은 점수를 반영하여 총점과 평균을 다시 산출 takeCareOf(gm[pos].kor.getSubj(), gm[pos].eng.getSubj(), gm[pos].math.getSubj()); gm[pos].total = gm[pos].kor.getSubj() + gm[pos].eng.getSubj() + gm[pos].math.getSubj(); gm[pos].avg = gm[pos].total / 3.f; insertionSort(gm, count); System.out.println("──────────────────"); System.out.println("수정이 완료되었습니다!"); System.out.println("확인해보삼ㅎㅎ"); break; default: System.out.println("──────────────────"); System.out.println("잘못된 번호를 입력하였습니다."); System.out.println("다시 시도해주세요."); break; } } } | cs |
반응형