본문 바로가기

공부/자바 OOP

6월11일 - 문제) 성적프로그램 (메모장에 출력)

*oop0522 test02_sungjuk 참조

 

입력자료가 어디에 있는지 생각하고 연결할 방법 먼저 생각을 하기 

출력할 자료의 위치를 먼저 넣는 방법을 생각. 

 

1단계 : 데이터 저장 변수 선언

2단계 : sungjuk.txt에 가져와서 한줄에 , 를 기준으로 토큰 후 해당변수에 저장하기
 * 커서의 위치개념생각하기, 원하는 패턴대로 , 기본속성은 next이다.
2-1 파일불러오기

2-2 , 를 기준으로 토큰하기 split은 좀 복잡

line

name[0]

kor[0]

eng[0]

mat[0]

		try{
			String inName  ="D:/java0514/workspace/sungjuk.txt";
			String outName="D:/java0514/workspace/result.txt";
			
			//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 ;
			
			//2단계 : sungjuk.txt에 가져와서 한줄에 , 를 기준으로 토큰 후 해당변수에 저장하기
			//커서의 위치개념생각하기, 원하는 패턴대로 , 기본속성은 next이다.
			//파일불러오기
			FileReader         in=new FileReader(inName);  
			BufferedReader br=new BufferedReader(in);
			
			String line=null; //초기값설정
			while(true){
				line=br.readLine(); //br에 있는 정보를 한줄씩 line변수에 저장
				if(line==null) break;
				System.out.println(line);
				// , 를 기준으로 토큰하기 split은 좀 복잡
				StringTokenizer st=new StringTokenizer(line,",");
				while(st.hasMoreElements()){ //토큰할 게 있을 때까지 돌려라
					System.out.println(st.nextToken());
				}
				System.out.println("------------------------");
			}//while end
			
출력결과
무궁화,95,90,100
무궁화
95
90
100
------------------------
홍길동,30,55,40
홍길동
30
55
40
------------------------
사이다,60,95,75
사이다
60
95
75
------------------------

 

package oop0611;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.nio.Buffer;
import java.util.StringTokenizer;

public class Test06_Sungjuk {

	public static void main(String[] args) {
		// 성적 프로그램
		// 성적입력자료를 가져와서 -> sungjuk.txt
		// 성적 결과 파일 완성하긱  -> result.txt
		//
		try{
			String inName  ="D:/java0514/workspace/sungjuk.txt";
			String outName="D:/java0514/workspace/result.txt";
			
			//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 ;
			
			//2단계 : sungjuk.txt에 가져와서 한줄에 , 를 기준으로 토큰 후 해당변수에 저장하기
			//커서의 위치개념생각하기, 원하는 패턴대로 , 기본속성은 next이다.
			//2-1 파일불러오기
			FileReader         in=new FileReader(inName);  
			BufferedReader br=new BufferedReader(in);
			//2-3 idx초기값설정
			int idx=0;
			String line=null; //초기값설정
			while(true){
				line=br.readLine(); //br에 있는 정보를 한줄씩 line변수에 저장
				if(line==null) break;
				System.out.println(line);
				//2-2 , 를 기준으로 토큰하기 split은 좀 복잡
				StringTokenizer st=new StringTokenizer(line,",");
				/*
				for(int idx=0; idx<5;  idx++){ //for문도 가능하지만, idx의 length의 길이가 파일마다 다르므로
				                                           //유지보수가 힘듬 
					line=br.readLine(); //br에 있는 정보를 한줄씩 line변수에 저장
				}
				*/
				while(st.hasMoreElements()){ //토큰할 게 있을 때까지 돌려라
					//System.out.println(st.nextToken());
					//2-3 토큰해서 나눠진 변수들을 집어넣어주기
					name[idx]=st.nextToken();
					kor[idx]  =Integer.parseInt(st.nextToken()); //string을 int로 형변환
					eng[idx]  =Integer.parseInt(st.nextToken());
					mat[idx] =Integer.parseInt(st.nextToken());
				}//while end
				idx++;
				//System.out.println("------------------------");
			}//while end
			
			//3단계 : 평균, 등수구하기
			//평균구하기
			for(int a=0; a<size; a++){
				aver[a]=(kor[a]+eng[a]+mat[a])/3;
			}//for end
			
			//등수를 구하기 (평균값을 기준으로)
			for(int a=0;a<size;a++){
				for(int b=0;b<size;b++){
					if(aver[a]<aver[b]){
						rank[a]++;
					}//if
				}//for end
			}//for end
			
			//4단계 : result.txt에 출력하기
			FileWriter    fw=new FileWriter(outName);
			PrintWriter out=new PrintWriter(fw, false);
			
			//out.printf(format, args);
			out.println("**********성 / 적 / 결 / 과************");
			out.println("----------------------------------------");
			out.println("  이름   국어  영어  수학  평균  등수  결과 ");
			out.println("----------------------------------------");
			
			for(idx=0; idx<size; idx++){
				out.printf("%-5s %5d %5d %5d %5d %4d ", name[idx], kor[idx], eng[idx], mat[idx], aver[idx], rank[idx]);
				
				if(aver[idx]>=70){
					if(kor[idx]<40||eng[idx]<40||mat[idx]<40){
						out.printf("%-5s", "재시험");
					}else{
						out.printf("%-5s", "합격");
					}
				}else{
					out.printf("%-5s", "불합격");
				}//if end
				
				for(int star=1; star<=aver[idx]/10;star++){
					out.printf("*");
				}//for
				
				if(aver[idx]>=95){
					out.printf("%-5s", "장학생");
				}//if	
				out.println();
			}//for end
			/*
			for(int i=0; i<5; i++){
				out.print(name[i]+"   ");
				out.print(kor[i]+"   ");
				out.print(eng[i]+"    ");
				out.print(mat[i]+"    ");
				out.print(aver[i]+"    ");
				out.println(rank[i]+"");
			}
			*/
			out.println("----------------------------------------");
			
			
			
			in.close();  br.close();
			fw.close(); out.close();
			
			/*
			//sungjuk데이터에 있는 걸 한줄씩 가져온다 read
			// , 기준으로 데이터를 나눈다.
			FileWriter fw=new FileWriter(inName, false);
			
			//autoFlush : true 버퍼클리어
			PrintWriter in=new PrintWriter(fw, true);
			in.println("무궁화,95,90,100");
			in.println("홍길동,30,55,40");
			in.println("사이다,60,95,75");
			in.println("섭웨이,20,85,65");
			in.println("신호등,100,35,100");
			
			fw.close();
			in.close();
			
			//sungjuk 파일 가져오기
			FileReader file=new FileReader(inName);
			BufferedReader br=new BufferedReader(file);
			while(true){
				String line=br.readLine();
				if(line==null){
					break;
				}
				//line , 로 나누기
				String[] word=line.split(",");
			}//while end
			*/	
			
		}catch(Exception e){
			System.out.println("실패:"+e);
		}//try end
		
	
	}//main() end
}//class end