본문 바로가기
Back-End/Java

Java 과제 - 성적표 파일 입출력

by newny 2023. 3. 23.
반응형

성적 입력 자료(sungjuk.txt)를 가져와서, 아래의 포멧으로 성적 결과 파일(result.txt) 완성하기

평균 : 소수점 없이 출력
등수 : 평균을 기준으로 출력
결과 : 평균기준 60점 이상일 시 "합격", 평균기준 60점 미만일 시 "불합격
(단, 한과목이라도 40점 이하라면 "재시험")
별 : 평균점수 10점당 1개씩 출력
장학생 : 평균기준 90점 이상일 시 "장학생" 출력

 
[sungjuk.txt 파일]
이름, 국어점수, 영어점수, 수학점수

[포멧]
      성 / 적 / 결 /과
---------------------------------------------------------------
    이름     국어    영어   수학   평균  등수    결과
---------------------------------------------------------------
   라일락   100     100    100    100      1       합격   **********  장학생
   진달래     50       55      60      55      4    불합격         *****
   개나리     95       95      35      75      3    재시험      *******
   무궁화     80       85      90      85      2       합격       *******
 
[결과]

[코드]

import java.util.List;

public class Test06_sungjuk {
    public static void main(String[] args) {
        // 문제) 성적프로그램
        // 성적 입력 자료(sungjuk.txt)를 가져와서, 성적 결과 파일 완성하기(result.txt)

        String fileIn = "d:/java202301/sungjuk.txt";
        String fileOut = "d:/java202301/result1.txt";
        
        Sungjuk sungjuk = new Sungjuk();
        List<Sungjuk> list1 = sungjuk.getGrades(fileIn);
        sungjuk.makeRank(list1);
        sungjuk.display(list1, fileOut);
    }
}

 

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Sungjuk {
    private String name; //이름
    private int kor; //국어점수
    private int eng; //영어점수
    private int mat; //수학점수
    private int aver; //평균
    
    private int rankNum; //등수
    private String result; //결과
    private String star = ""; //별 출력
    private String scholar = ""; //장학생

    public Sungjuk() {}

    public Sungjuk(String name, int kor, int eng, int mat) { //초기값으로  aver 값 계산하여 초기화
        this.name = name;
        this.kor = kor;
        this.eng = eng;
        this.mat = mat;
        this.aver = (kor+eng+mat)/3;
    }

    public List<Sungjuk> getGrades (String a) {
        FileReader fr = null;
        BufferedReader br = null;
        List<Sungjuk> list1 = new ArrayList();
        try {
            fr = new FileReader(a);
            br = new BufferedReader(fr);

            List<String[]> list = new ArrayList<>(); //한줄의 이름, 국어, 영어, 수학 저장배열

            while (true) { //파일의 읽을 라인이 없을때까지 루프
                String line = br.readLine();
                if (line != null) {
                    String[] stu = line.split(","); //","로 분리하여 stu 배열에 저장
                    list.add(stu); //stu 배열을 list배열에 저장
                } else {
                    break;
                }
            }

            for (int i = 0; i < list.size(); i++) { //list 배열 안의 stu배열들의 값을이용해 Sungjuk 객체생성
                list1.add(new Sungjuk(list.get(i)[0], Integer.parseInt(list.get(i)[1]), Integer.parseInt(list.get(i)[2]), Integer.parseInt(list.get(i)[3])));
            }


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {br.close();}
            } catch (Exception e) {}
            try {
                if (fr != null) {fr.close();}
            } catch (Exception e) {}
        }
        return list1; //객체들이 담긴 list1 리턴
    }



    public void makeRank(List<Sungjuk> a) {


        for (int i = 0; i < a.size() - 1; i++) { //등수대로 정렬하기 : aver 값으로 객체 배열 내림차순 정렬
            for (int j = i + 1; j < a.size(); j++) {
                if (a.get(i).aver < a.get(j).aver) {
                    Sungjuk b = a.get(i);
                    a.set(i, a.get(j));
                    a.set(j, b);
                }
            }
        }

        for (int i = 0; i < a.size(); i++) {
            Sungjuk stu = a.get(i);

            stu.rankNum = i + 1; //등수 적용 : 정렬된 객체 배열의 인덱스번호+1 을 해당객체 rankNum에 넣음

            if(stu.aver<60) { //합격여부
                stu.result = "불합격";
            } else if (stu.kor > 40 && stu.eng > 40 && stu.mat > 40) {
                stu.result = "    합격";
                if (stu.aver > 90) { //장학생 추출
                    stu.scholar = "장학생";
                }
            } else {
                stu.result = "재시험";
            }

            for(int j=0; j<stu.aver/10; j++) { //별찍기
                a.get(i).star += "*";
            }

        }



    }

    public void display(List<Sungjuk> b, String c){
            FileWriter fw = null;
            PrintWriter out = null;
        try {
            fw = new FileWriter(c, false);
            out = new PrintWriter(fw, true);

            out.println("  성 / 적 / 결 / 과");
            out.println("---------------------------------------------------------");
            out.println(" 이름  국어 영어 수학 평균 등수    결과");
            out.println("---------------------------------------------------------");
            for (int i = 0; i < b.size(); i++) {
                Sungjuk a = b.get(i);
                out.printf("%3s %4d %4d %4d %4d %3d %5s %10s %3s\n", a.name, a.kor, a.eng, a.mat, a.aver, a.rankNum, a.result, a.star, a.scholar);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {out.close();}
            } catch (Exception e) {}
            try {
                if (fw != null) {fw.close();}
            } catch (Exception e) {}
        }
    }

}
반응형

'Back-End > Java' 카테고리의 다른 글

Java 복습, 예습  (0) 2023.03.26
Java(9)  (0) 2023.03.23
Java(8)  (0) 2023.03.22

댓글