국비수업/수업정리

성적관리 함수화 (객체 안에 배열과 인덱스 넣기)

밀김 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