2013년 7월 2일 화요일

(130702 - 중요) 7일차 outputStreamTest.java, MemberJoin.java (7월 1일 과제 풀이 - 파일 입출력 수정 및 삭제)

 - test.txt
1 주진모 88 75 80
2 설경구 90 64 99
3 조하문 67 86 65
4 박하나 89 92 84
5 이현정 77 90 95


 - outputStreamTest.java 소스
import java.io.*;
import java.util.*;

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

public class outputStreamTest {
File f = new File("test.txt");
Vector<MemberJoin> v = new Vector<>();
Scanner sc = new Scanner(System.in);

public outputStreamTest() {  
// 기존의 있는 데이터를 먼저 백터에 저장하는 메소드
this.getData();

while(true){
System.out.println("아래 번호중 하나를 선택해주세요");
System.out.println("1.입력  2.출력  3.삭제   4.종료");
//번호를 입력 받음
int num = sc.nextInt();
if(num==1){
//입력 메소드 호출
this.insertData();
}else if(num==2){
//데이터 출력
this.printMember();
}else if(num==3){
//삭제 메소드 호출
this.removeMember();
}else if(num==4){
System.out.println("프로그램을 종료 합니다.");
break;
}
}

}

// 프로그램 시작시 기존 데이터를 백터에 저장
private void getData() {
// 파일을 읽어드림
try {
Scanner scfile = new Scanner(f);
MemberJoin mj = null;
while(scfile.hasNext()){
// 하나의 라인을 읽어드림
String data = scfile.nextLine();
// 배열로 데이터를 나눔
String [] split = data.split(" ");
// 맴버 조인 클래스를 생성
mj = new MemberJoin();
// 각각의 데이터를 넣어버림
mj.setNo(Integer.parseInt(split[0]));
mj.setName(split[1]);
mj.setEng(Integer.parseInt(split[2]));
mj.setMat(Integer.parseInt(split[3]));
mj.setKor(Integer.parseInt(split[4]));
// 하나의 데이터를 MemberJoin에저장하고 백터에 다시 저장
v.add(mj);
}

} catch (Exception e) {
e.printStackTrace();
}
}

// 입력 메소드
private void insertData() {
// 5개의 데이터를 입력 받음
MemberJoin member  = new MemberJoin();
System.out.println("번호를 입력해주세요");
member.setNo(sc.nextInt());
System.out.println("이름를 입력해주세요");
member.setName(sc.next());
System.out.println("영어를 입력해주세요");
member.setEng(sc.nextInt());
System.out.println("수학를 입력해주세요");
member.setMat(sc.nextInt());
System.out.println("국어를 입력해주세요");
member.setKor(sc.nextInt());
//입력 받은 데이터를 백터에 추가
v.add(member);

this.setData();
}

// 입력 또는 삭제시 호출하여 파일에 수정하는 메소드
public void setData(){
FileWriter fw = null;
try {
fw = new FileWriter(f);

for (int i = 0; i <v.size(); i++) {
MemberJoin m  = v.get(i);
//하나의 스트링으로 만든후에 데이터를 파일에 씀
String data = m.getNo()+" "+m.getName()+" "+m.getEng()+" "+m.getMat()+" "+m.getKor()+"\n";
//파일에 쓰기위해서 파일 writer,객체 생성
fw.write(data);
fw.flush();   
}   
} catch (IOException e1) {
e1.printStackTrace();
}

try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}

// 회원 정보 출력
private void printMember() {

// 평균배열선언
int avg[] = new int [v.size()];
int tot[] = new int [v.size()];
int rank[] = new int [v.size()];

try {
// 스캐너를 통하여 파일을 읽어드림
Scanner sc = new Scanner(f);

// 백터의 있는 데이터 만큼 반복문을 돌림
for (int j = 0; j < v.size(); j++) {

MemberJoin mj = v.get(j);
// 먼저 평균입력
avg[j]= (mj.getEng()+mj.getKor()+mj.getMat())/3;
// 총점 입력
tot[j] = mj.getEng()+mj.getKor()+mj.getMat();

}  
// 배열 복사
int totclone[]= tot.clone();
// 총점을 기준으로 순위를 정함
// max변수
int max =0;
int count=1;
int index=0;
for (int s = 0; s< tot.length; s++) {
max=0;
index=0;
for (int j = 0; j < tot.length; j++) {
if(tot[j]>max){
max=tot[j];
index=j;
}     
}
tot[index]=0;
rank[index]=count;
count++;
}

// 파일을 읽어드림
Scanner sc1 = new Scanner(f);
int m=0;
while(sc1.hasNext()){
System.out.print(sc1.nextLine()+"   ") ;
System.out.println(avg[m]+"    "+totclone[m]+"   "+rank[m]);
m++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

// 회원정보 삭제
private void removeMember() {

System.out.println("삭제할 회원의 번호를 넣어주세요");
int num = sc.nextInt();

// 반복문을 이용하여 회원 정보중 번호를 찾아서 같은 번호라면 삭제
for (int i = 0; i < v.size(); i++) {

MemberJoin m = v.get(i);

// 회원 번호와 입력받은 번호가 같은지 비교
if(num == m.getNo()){
// 백터에서 삭제
v.remove(i);
}
}
this.setData();
}

public static void main(String[] args) {
outputStreamTest ost = new outputStreamTest();
}
}


 - MemberJoin.java 소스
public class MemberJoin {

int no;
String name;
int eng;
int mat;
int kor;

public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
}


 - 결과