국비수업/수업정리
성적관리 함수화 (객체 안에 배열과 인덱스 넣기)
밀김
2023. 3. 11. 01:23
728x90
< ExamList 클래스를 만들고 그 안에 int index, Exam[] exams 를 넣어서 매개인자를 깔끔하게 받을수 있게 했다>
package newlec;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;
public class FunProgram {
public static int inputMenu(int menu) {
System.out.println("┌────────────────────────┐");
System.out.println("│ 성적 관리 │");
System.out.println("└────────────────────────┘");
Scanner sc = new Scanner(System.in);
System.out.println("번호를 입력해 주세요");
System.out.println("1. 성적 입력");
System.out.println("2. 성적 출력");
System.out.println("3. 성적 저장");
System.out.println("4. 성적 로드");
System.out.println("5. 종료");
System.out.println();
System.out.print("번호를 입력해 주세요 > ");
menu = sc.nextInt();
return menu;
}
static void inputExams(ExamList list) {
System.out.println("┌──────────────┐");
System.out.println("│ 성적 입력 │");
System.out.println("└──────────────┘");
Scanner sc = new Scanner(System.in);
while (true) {
if (list.index == list.exams.length) {
Exam[] temp = new Exam[list.exams.length + 3];
for (int i = 0; i < list.exams.length; i++)
temp[i] = list.exams[i];
list.exams = temp;
}
Exam exam = new Exam();
System.out.print("국어 성적을 입력하세요 : ");
exam.kor = sc.nextInt();
System.out.print("영어 성적을 입력하세요 : ");
exam.eng = sc.nextInt();
System.out.print("수학 성적을 입력하세요 : ");
exam.math = sc.nextInt();
list.exams[list.index] = exam;
list.index++;
System.out.println();
System.out.println("계속하시겠습니까? 1. 예 2. 아니오");
int subMenu = sc.nextInt();
if (subMenu == 2)
break;
}
}
static void printExams(ExamList list) {
for (int i = 0; i < list.index; i++) {
Exam exam = list.exams[i];
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
System.out.printf("국어 %d: %3d 점 \n", i + 1, kor);
System.out.printf("영어 %d: %3d 점 \n", i + 1, eng);
System.out.printf("수학 %d: %3d 점 \n", i + 1, math);
System.out.println("----------------");
}
}
private static void saveExams(ExamList list, String fileName) throws IOException {
FileOutputStream fos = new FileOutputStream(fileName);
PrintStream fout = new PrintStream(fos);
for (int i = 0; i < list.index; i++) {
Exam exam = list.exams[i];
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
fout.printf("%d %d %d\n", kor, eng, math);
}
fout.close();
fos.close();
}
static void loadExams(ExamList list, String fileName) throws IOException {
FileInputStream fis = new FileInputStream(fileName);
Scanner fscan = new Scanner(fis);
for (int i = 0; i < list.index; i++) {
String scoreLine = fscan.nextLine();
String[] scoreTokens = scoreLine.split(" ");
list.exams[i].kor = Integer.parseInt(scoreTokens[0]);
list.exams[i].eng = Integer.parseInt(scoreTokens[1]);
list.exams[i].math = Integer.parseInt(scoreTokens[2]);
}
printExams(list);
fscan.close();
fis.close();
}
public static void main(String[] args) throws IOException {
ExamList list = new ExamList();
list.exams = new Exam[5];
String fileName = "res/exam.txt";
END: while (true) {
int menu = 0;
menu = inputMenu(menu);
switch (menu) {
case 1:
inputExams(list);
break;
case 2:
System.out.println("┌──────────────┐");
System.out.println("│ 성적 출력 │");
System.out.println("└──────────────┘");
printExams(list);
break;
case 3:
saveExams(list, fileName);
break;
case 4:
loadExams(list, fileName);
break;
case 5:
System.out.println("성적 입력 프로그램을 종료합니다. 안녕~");
break END;
}
}
}
}
<수정할때 오류났었던 성적 로드 부분>
private static void loadExams(ExamList list) throws IOException {
String fileName = "save/grade07.txt";
FileInputStream fis = new FileInputStream(fileName);
Scanner fscan = new Scanner(fis);
// 파일의 배열만큼 읽어야 해 , 내가 기존에 저장했던 값까지= 데이터가 없을때까지 , 반복while문
// 스캐너가 읽을게 없을 때까지(=데이터가 있을때까지)
//while문 true면 일단 시작, 데이터가 없으면 false니까 while문 탈출
while(fscan.hasNextLine()) { //라인이 있냐 없냐
if (list.index == list.exams.length) { // 공간이 충분한지, 또는 여유공간이 있는지
Exam[] temp = new Exam[list.exams.length + 3];
for (int i = 0; i < list.exams.length; i++)
temp[i] = list.exams[i];
list.exams = temp;// 공간을 늘리는 코드를 작성
} // 얘를 기능으로 빼줘야 합니다.이게 핵심
String scoreLine = fscan.nextLine();
String[] scoreTokens = scoreLine.split(" ");
Exam exam = new Exam();
exam.kor = Integer.parseInt(scoreTokens[0]);
exam.eng = Integer.parseInt(scoreTokens[1]);
exam.math = Integer.parseInt(scoreTokens[2]);
list.exams[list.index] = exam;
list.index++;
}
printExams(list);
fscan.close();
fis.close();
}
728x90