2013년 7월 1일 월요일

(130701) 6일차 FileOutputStreamTest2.java (6일차 7교시 파일출력 - 학생 성적 관리 프로그램)

 - test3.txt








 - 소스
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.Vector;

public class FileOutputStreamTest2 {

public static void main(String[] args) {
/*
* test3.txt 파일을 이용하여 아래와 같은 프로그램을 하시오
* 1. 입력 : 입력을 누르면 번호 이름 국어 영어 수학 점수를 입력 받아서 기존 파일에 추가하시오
* 2. 출력 : 
* - N명의 평균 총점을 화면에 표시하시오 
* - 총점을 기준으로 등수를 표시하시오
*/

try{
Scanner sc = new Scanner(System.in);
File f = new File("test3.txt");

while(true){
System.out.println("1. 입력 \t 2. 출력 \t 3. 삭제 \t 4. 종료");
int m = sc.nextInt();

if(m == 1){ // 1. 입력
System.out.println("번호, 이름, 국어, 영어, 수학 점수를 입력받으시오.");
System.out.print("번호 : ");
String num = sc.next();
System.out.print("이름 : ");
String name = sc.next();
System.out.print("국어 : ");
String korean = sc.next();
System.out.print("영어 : ");
String english = sc.next();
System.out.print("수학 : ");
String math = sc.next();

// 버퍼에 데이터를 쓴다.
FileWriter fw = new FileWriter(f, true); // 한글을 지원해줌, true를 붙이면 txt 파일에 반복해서 써진다.
fw.flush(); // 버퍼에 데이터를 모두 쓰지 않아도 강제로 출력
fw.write("\n" + num + " ");
fw.write(name + " ");
fw.write(korean + " ");
fw.write(english + " ");
fw.write(math + " ");
fw.close(); // 메모리를 효율적으로 사용하기 위해 사용
}

else if(m == 2){ // 2. 출력
Scanner sc2 = new Scanner(f); // txt 파일을 읽기위한 스캐너
Vector<String> s = new Vector<>(); // s에 각 행을 저장
while(sc2.hasNext()) // 다음 가져올 라인이 있으면 true값을 반환
s.add(sc2.nextLine());

Vector<String> s2 = new Vector<>(); // s2에 각 행의 열을 저장
for(int i=0 ; i < s.size() ; i++){
StringTokenizer st = new StringTokenizer(s.get(i)," "); // StringTokenizer를 사용해서 자름
while(st.hasMoreTokens()){
s2.add(st.nextToken()); // 공백이 여러개든, 한 개든 추출해서 List의 Vector에 삽입
}
}

Vector<Integer> s3 = new Vector<>(); // s3에 총점을 입력함
for(int i = 0; i < s.size() ; i++){
int total = 0;
for(int j = 2 ; j < 5 ; j++){
int val = Integer.parseInt(s2.get((i*5)+j));
total = val + total;
}
s3.add(total); // 총점 입력
}

Vector<Integer> s4 = new Vector<>(); // s4에 s3의 값을 복사함
for(int i=0 ; i<s3.size() ; i++)
s4.add(s3.get(i));

for(int i=0 ; i<s3.size()-1 ; i++){ // s3의 값을 선택정렬을 이용해서 내림차순으로 정렬
for(int j=i+1 ; j<s3.size() ; j++){
if(s3.get(i) < s3.get(j)){
int temp = s3.get(i);
s3.set(i, s3.get(j));
s3.set(j, temp);
}
}
}

for(int i = 0; i < s.size() ; i++){ // txt 파일 내용 및 총점, 등수 입력
System.out.print(s.get(i));
System.out.print("\t" + s4.get(i)/3 + "\t"); // 평균 입력
System.out.print(s4.get(i)); // 총점 입력

for(int j=0 ; j<s3.size() ; j++){ // 등수 계산 및 입력
if((s4.get(i)).equals(s3.get(j)))
System.out.println("\t" + (j+1) + "\t");
}
}
System.out.println();
}

else if(m == 3){ // 3. 삭제
Scanner sc3 = new Scanner(f); // txt 파일을 읽기 위한 스캐너
Vector<String> s = new Vector<>(); // s에 각 행을 저장
while(sc3.hasNext()) // 다음 가져올 라인이 있으면 true값을 반환
s.add(sc3.nextLine());

for(int i = 0; i < s.size() ; i++) // 현재 txt 파일 내용을 출력
System.out.println(s.get(i));

System.out.println("삭제할 학생 번호를 입력하세요.");
Scanner sc4 = new Scanner(System.in);
int input = sc4.nextInt(); // 학생의 키값을 입력받음

s.remove(input-1); // 해당 백터값 삭제
for(int i = 0; i < s.size() ; i++){
System.out.println(s.get(i));
}

// 버퍼에 데이터를 쓴다.
// 삭제된 전체 내용을 txt 파일에 새로 입력
FileWriter fw = new FileWriter(f); // true를 붙이지 않으면 txt 파일에 새로 쓴다.
fw.flush(); // 버퍼에 데이터를 모두 쓰지 않아도 강제로 출력
for(int i = 0; i < s.size() ; i++){
fw.write(s.get(i));
fw.write('\n');
}
fw.close(); // 메모리를 효율적으로 사용하기 위해 사용
}

else if(m == 4){ // 4. 종료
System.out.println("종료합니다.");
break;
}
}
} catch (IOException e){
e.printStackTrace();
}
}
}


 - 결과