웹개발 교육/Java
[39일] Java (52) - 성적 프로그램(파일 입출력)
ewok
2022. 9. 21. 11:06
성적 입력 자료를 가져와서 성적 결과 파일을 완성해보자
내 풀이
package oop0920;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Vector;
public class Test05_sungjuk {
public static void main(String[] args) {
// 문제) 성적 프로그램
// 성적입력자료(sungjuk.txt)를 가져와서, 성적 결과 파일 완성하기(result.txt)
/*
1) 입력 데이터 파일 : sungjuk.txt
2) 결과 파일 : result.txt
성 / 적 / 결 /과
-------------------------------------------------------
이름 국어 영어 수학 평균 등수 결과
-------------------------------------------------------
라일락 100 100 100 100 1 합격 ********** 장학생
진달래 50 55 60 55 4 불합격 *****
개나리 95 95 35 75 3 재시험 *******
무궁화 80 85 90 85 2 합격 ********
홍길동 60 40 30 43 5 불합격 ****
------------------------------------------------------
*/
String inName = "I:/java202207/sungjuk.txt";
String outName = "I:/java202207/result.txt";
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
PrintWriter out = null;
try {
fr = new FileReader(inName);
br = new BufferedReader(fr);
fw = new FileWriter(outName, false);
out = new PrintWriter(fw, true);
Vector<String> vec = new Vector<>();
while(true) {
String line = br.readLine();
vec.add(line);
if(line==null) {
break;
}//if end
}//while end
//System.out.println(vec.get(0)); //무궁화,95,90,100 홍길동,100,100,100 라일락,90,95,35 개나리,85,70,75 진달래,35,40,60 null
Vector<String[]> vect = new Vector<>();
for (int i=0; i<vec.size()-1; i++) {
String a = (String) vec.get(i);
String[] sarr = a.split(",");
vect.add(sarr);;
}//for end
Vector<String> name = new Vector<>();
Vector<String> kor = new Vector<>();
Vector<String> eng = new Vector<>();
Vector<String> mat = new Vector<>();
String[] b = {};
for (int i=0; i<vect.size(); i++) {
b = (String[]) vect.get(i); //무궁화, 95, 90, 100
name.add(b[0]); //무궁화, 홍길동, 라일락, 개나리, 진달래
kor.add(b[1]); //95, 100, 90, 85, 35
eng.add(b[2]); //90 100 95 70 40
mat.add(b[3]); //100 100 35 75 60
}
//System.out.println(name.get(1));
//평균
Vector<Integer> avg = new Vector<>();
for (int i=0; i<kor.size(); i++) {
int a = (Integer.parseInt((String) kor.get(i)) + Integer.parseInt((String) eng.get(i)) + Integer.parseInt((String) mat.get(i)))/3;
avg.add(a);
}
//System.out.println(avg.get(4)); //95, 100, 73, 76, 45
//등수
int rank = 1;
Vector<Integer> vrank = new Vector<>();
for (int i=0; i<avg.size(); i++) {
for (int j=0; j<avg.size(); j++) {
if ((int)avg.get(i)<(int)avg.get(j)) {
rank += 1;
}//if end
}//for end
vrank.add(rank);
rank = 1;
}//for end
//System.out.println(vrank.get(4)); //2 1 4 3 5
//결과
//합불
Vector<String> pass = new Vector<>();
for (int i=0; i<name.size(); i++) {
if ((int)avg.get(i)>=70) {
if (Integer.parseInt((String) kor.get(i))<40 || Integer.parseInt((String) eng.get(i)) <40 ||Integer.parseInt((String) mat.get(i)) <40) {
pass.add("재시험");
} else {
pass.add("합격");
}//if end
} else {
pass.add("불합격");
}//if end
}//for end
//System.out.println(pass.get(4)); //합격 합격 재시험 합격 불합격
//별표
Vector<String> vstar = new Vector<>();
String star = "";
for (int i=0; i<avg.size(); i++) {
for (int j=0; j<(int)avg.get(i)/10; j++) {
star = star + "*";
}//for end
vstar.add(star);
star = "";
}//for end
//System.out.println(vstar.get(0));
//장학생 여부
Vector<String> scholar = new Vector<>();
for (int i=0; i<avg.size(); i++) {
if (avg.get(i)>=95) {
scholar.add("장학생");
} else {
scholar.add("");
}//if end
}//for end
//System.out.println(scholar.get(2)); //장학생 장학생 "" "" ""
//출력
out.println(" 성 / 적 / 결 / 과");
out.println("--------------------------------------------------------------------------------------------");
out.println("이름 국어 영어 수학 평균 등수 결과");
out.println("--------------------------------------------------------------------------------------------");
for (int i=0; i<name.size(); i++) {
out.printf("%s\t %3s\t %3s\t %3s\t %3s\t %s\t %-3s\t %-10s %s", name.get(i), kor.get(i), eng.get(i), mat.get(i), avg.get(i), vrank.get(i), pass.get(i), vstar.get(i), scholar.get(i));
out.println();
}//for end
System.out.println("result.txt 데이터 파일 완성!!");
} catch (Exception e) {
System.out.println("성적 프로그램 읽고, 쓰기 실패 : " + e);
} finally {
try {
if(br!=null) { br.close(); }
} catch (Exception e) {}
try {
if(fr!=null) { fr.close(); }
} catch (Exception e) {}
try {
if(out!=null) { out.close(); }
} catch (Exception e) {}
try {
if(fw!=null) { fw.close(); }
} catch (Exception e) {}
}//end
}//main() end
}//class end
다른 풀이
package oop0920;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.StreamCorruptedException;
import java.util.Vector;
public class Test05_sungjuk2 {
public static void main(String[] args) {
String inName = "I:/java202207/sungjuk.txt";
String outName = "I:/java202207/result.txt";
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
PrintWriter out = null;
try {
//1)단계 : 데이터 저장 변수 선언
String[] name = new String[5];
int[] kor = new int[5];
int[] eng = new int[5];
int[] mat = new int[5];
int[] aver = new int[5];
int[] rank = {1, 1, 1, 1, 1};
int size = name.length; //5
int i = 0;
//2)단계 : 데이터 입력 파일(sungjuk.txt) 가져와서 내용을 읽기
fr = new FileReader(inName);
br = new BufferedReader(fr);
while(true) {
String line = br.readLine(); //무궁화,95,90,100
if(line==null) {
break;
}//if end
//System.out.println(line);
// , 기준으로 문자열 분리한 후 1)단계에서 선언한 변수에 저장하기
String[] word = line.split(",");
name[i] = word[0].trim();
kor[i] = Integer.parseInt(word[1].trim());
eng[i] = Integer.parseInt(word[2].trim());
mat[i] = Integer.parseInt(word[3].trim());
i++; //다음사람
}//while end
//3)단계 : 평균 구하기
for (int a=0; a<size; a=a+1) {
aver[a] = ((kor[a]+eng[a]+mat[a])/3);
}//for end
//4)단계 : 등수 구하기(평균을 기준으로)
for (int a=0; a<size; a=a+1) {
for (int b=0; b<size; b=b+1) {
if (aver[a]<aver[b]) {
rank[a] = rank[a] + 1;
}//if end
}//for end
}//for end
//5)단계 : result.txt 결과 출력하기
fw = new FileWriter(outName, false);
out = new PrintWriter(fw, true); //true로 해야 쓰레기 정보가 들어가지 않는다
out.println("성/적/결/과");
out.println("--------------------------------");
out.println("이름 국어 영어 수학 평균 등수 결과");
out.println("--------------------------------");
//5명의 데이터 출력하기
for (i=0; i<size; i++) {
out.printf("%-6s %5d %5d %5d %5d %5d", name[i], kor[i], eng[i], mat[i], aver[i], rank[i]);
//과락
if (aver[i]>=70) {
if (kor[i]<40 || eng[i]<40 || mat[i]<40) {
out.printf("%-10s", " 재시험");
} else {
out.printf("%-10s", " 합 격");
}//if end
} else {
out.printf("%-10s", " 불합격");
}//if end
//평균 10점당 * 한개씩
for(int star=1; star<aver[i]/10; star++) {
out.printf("%c", '*');
}//for end
//평균 95점 이상 장학생
if(aver[i]>=95) {
out.printf("%-12s", "장학생");
}//if end
out.println(); //한 사람 출력하고 줄바꿈
}//for end
System.out.println("result.txt 성적 프로그램이 완성되었습니다");
} catch (Exception e) {
System.out.println("성적 프로그램 읽고, 쓰기 실패 : " + e);
} finally {
try {
if(br!=null) { br.close(); }
} catch (Exception e) {}
try {
if(fr!=null) { fr.close(); }
} catch (Exception e) {}
try {
if(out!=null) { out.close(); }
} catch (Exception e) {}
try {
if(fw!=null) { fw.close(); }
} catch (Exception e) {}
}//end
}//main() end
}//class end