Daily coding

Java Basic : day 7 - Example 01 : 메소드로 성적 입출력 프로그램 작성하기 ( CRUD + FileWrite ) 본문

Language/Java_basic

Java Basic : day 7 - Example 01 : 메소드로 성적 입출력 프로그램 작성하기 ( CRUD + FileWrite )

sunnnkim 2019. 11. 26. 19:59
package day7;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Ex01_GradeProgram {
	public static void main(String[] args) {
		
		/*
		
		* 함수로 만들기
			String student[10][]; 
			------- 출력예시 -------- 
		 	1. 학생 정보 추가 (이름, 나이, 영어, 수학)
		 	2. 학생 정보 삭제 
		 	3. 학생 정보 검색
		 	4. 학생 정보 수정
		 	5. 학생 성적 조회(1명) : 총점
		 	6. 학생 성적 총점
		 	7. 학생 성적 평균
		 	8. 학생 성적순 출력(총점)
		 	9. 파일로 저장하기(시간 남으면 풀어보세요)
		 	
		 	어느 작업을 하시겠습니까 ? >> 
		 	
		 */
		
		Scanner sc = new Scanner(System.in);
		String student[][] = new String[10][4];
		int dataSize = 0;	// 현재 데이터가 몇개인지 표시한 변수 
		int choice;
		while(dataSize != -1) {
		choice = printMain(sc);
		dataSize = selectMenu(choice, student, dataSize, sc);;
		}
		
		// Main 끝
		
	}
	
	
	
	
	// 메소드 시작
	//TODO: 메소드 시작 
	static int printMain(Scanner sc) {
		System.out.println("-----------------------------------");
		System.out.println("1. 학생 정보 추가 (이름, 나이, 영어, 수학)");
		System.out.println("2. 학생 정보 삭제 ");
	 	System.out.println("3. 학생 정보 검색");
	 	System.out.println("4. 학생 정보 수정");
	 	System.out.println("5. 학생 성적 조회(1명) : 총점");
	 	System.out.println("6. 학생 성적 총점");
	 	System.out.println("7. 학생 성적 평균");
	 	System.out.println("8. 학생 성적순 출력(총점)");
	 	System.out.println("9. 학생데이터 TXT 파일로 저장하기");
	 	System.out.println("0. 종료");
	 	System.out.println();
	 	System.out.print("어느 작업을 하시겠습니까 ? >> ");
	 	int choice;
	 	try {
	 		choice = sc.nextInt();	 	
		} catch (Exception e) {
			choice = -1;
			sc.nextLine();
		}
	 	
	 	return choice;
	 	
	}
	
	//TODO: Main Menu
	static int selectMenu(int choice, String[][] student, int dataSize, Scanner sc) {
	 	if(choice == 1) {	
	 		// 학생추가하기 
	 		dataSize = addStudent(student, dataSize, sc);
	 		
	 	}else if(choice == 2 ) {
	 		// 학생 정보 삭제
	 		dataSize = deleteStudent(student, dataSize, sc);
	 	}else if(choice == 3 ) {
	 		// 학생정보 검색
	 		printStudentInfo(student, sc);
	 	}else if(choice == 4 ) {
	 		// 학생정보 수정
	 		update(student, sc);
	 	}else if(choice == 5 ) {
	 		// 학생 성적 조회
	 		 printSumOne(student, sc);
	 	}else if(choice == 6 ) {
	 		//학생 성적 총점
	 		printSum(student);
	 	}else if(choice == 7 ) {
	 		// 학생 성적 평균 
	 		printAvg(student, dataSize);
	 	}else if(choice == 8 ) {
	 		// 학생성적 출력
	 		printByGrade(student, dataSize);
	 	}else if(choice == 9 ) {
	 		// 파일 출력하기
	 		setFile(student);
	 		readFile();
	 	}else if(choice == 0 ) {
	 		// 종료
	 		System.out.println("종료합니다.");
	 		return -1;
	 	}else {
	 		System.out.println("잘못된 접근입니다 !");
	 	}
	 	
	 	return dataSize;
	}
	
	// 1. 학생 정보 추가 (이름, 나이, 영어, 수학)
	static int addStudent(String[][] student, int dataSize, Scanner sc) {
		if(dataSize > student.length ) {
			System.out.println("< Fail : 정보를 넣을 공간이 없습니다 >");
			return dataSize;
		}
			System.out.print("이름 : ");
			String name = sc.next();
			System.out.print("나이 : ");
			String age = sc.next();
			System.out.print("영어 : ");
			String eng = sc.next();
			System.out.print("수학 : ");
			String math = sc.next();
			
			student[dataSize][0] = name;
			student[dataSize][1] = age;
			student[dataSize][2] = eng;
			student[dataSize][3] = math;
			
			dataSize++;
			return dataSize;
	}
	
	// 1-1 데이터 사이즈 구하기
	static int getSize(String[][] student) {
		int nextIndex =0;
		for (int i = 0; i < student.length; i++) {
			if(student[i][0]!= null) {
				nextIndex = i;
				break;
			}
		}
		return nextIndex;
	}
	
	// 2. 학생 정보 삭제
	static int deleteStudent(String[][] student, int dataSize, Scanner sc) {
		if(dataSize == 0) {
			System.out.println("삭제할 학생이 없습니다.");
			return dataSize;
		}
		System.out.print("삭제할 학생의 이름? : ");
		String name = sc.next();
		
		for (int i = 0; i < student.length; i++) {
			try {
				if(student[i][0].equals(name)) {	// 동명이인이면 앞 쪽 데이터부터 삭제됨.
					System.out.println(name + "의 정보가 삭제되었습니다.");
					student[i][0] = null;
					student[i][1] = null;
					student[i][2] = null;
					student[i][3] = null;
					dataSize --;
					return dataSize;
				}
			} catch (Exception e) {
				continue;
			}
		}
		System.out.println("< Fail : 해당 학생이 없습니다 >");
		return dataSize;
	}
	
	//3. 학생 정보 검색
	static void printStudentInfo(String[][] student, Scanner sc) {
		System.out.print("검색할 학생의 이름? : ");
		String name = sc.next();
		for (int i = 0; i < student.length; i++) {
			try {
				if(student[i][0].equals(name)) {
					System.out.println("이름 : " + student[i][0]);
					System.out.println("나이 : " + student[i][1]);
					System.out.println("영어 : " + student[i][2]);
					System.out.println("수학 : " + student[i][3]);
					return;
				}
			} catch (Exception e) {
				continue;
			}
		}
		System.out.println("< Fail : 해당 학생이 없습니다 >");
		}
	
	//4. 학생 정보 수정
	static void update(String[][] student, Scanner sc) {
		System.out.print("수정할 학생의 이름? : ");
		String name = sc.next();
		for (int i = 0; i < student.length; i++) {
			try {
				if(student[i][0].equals(name)) {
					System.out.println(name+" 학생의 정보 수정 ");
					System.out.print("영어 : ");
					String eng = sc.next();
					System.out.print("수학 : ");
					String math = sc.next();
					
 					student[i][2] = eng;
					student[i][3] = math;
					return;
				}
			} catch (Exception e) {
				continue;
			}
			
		}
		System.out.println("< Fail : 해당 학생이 없습니다 >");	}
	
	//5. 학생 성적 조회(1명) : 총점
	static void printSumOne(String[][] student, Scanner sc) {
		System.out.println(" < 성적 조회 >");
		System.out.print("조회할 학생의 이름? : ");
		String name = sc.next();
		for (int i = 0; i < student.length; i++) {
			try {
				if(student[i][0].equals(name)) {
					int sum =0;
					sum = getSumOne(student[i]);
					double avg = getavgOne(student[i]);
					if(sum==-1) {
						System.out.println(name+"학생의 성적정보가 잘못됐습니다.");
					}else {
					System.out.print("<"+name+"> 학생의 총점 : "+ sum + "점\n");
					System.out.printf("<"+name+"> 학생의 평균 : %.2f점", avg);
					
					System.out.println();
					}
					return;
				}
			} catch (NullPointerException e) {
				continue;
			}
		}
		System.out.println("< Fail : 해당 학생이 없습니다 >");
	}
	// 5-1. 각 사람의 점수 합계 구하기 
	static int getSumOne(String[] student) {
		int sum = 0;
		try {
			sum+= Integer.parseInt(student[2]);
			sum+= Integer.parseInt(student[3]);
			
		} catch (Exception e) {
			sum =-1;
		}
		
		return sum;	
	}
	
	// 5-2. 한 사람의 평균 구하기 
	static double getavgOne(String[] student) {
		double avg = 0;
		int sum = getSumOne(student);
		
		if(sum==-1) {
			avg =-1;
		}
		else {
			avg = sum / 2.0;
		}
		
		return avg;	
	}
	
	//6. 학생 성적 총점
	static int getSumEng(String[][] student) {
		
		int sumEng=0;
		for (int i = 0; i < student.length; i++) {
			try {
				if(student[i][0]!= null) {
					sumEng += Integer.parseInt(student[i][2]);
				}
			}
			catch (Exception e) {
//				System.out.println(" < Fail : 성적을 숫자로 수정하세요 >");
				System.out.println(" < "+student[i][0]+" 학생 영어 정보의 오류>" );
				continue;
			}
		}
		return sumEng;
	}
	
	static int getSumMath(String[][] student) {
		int sumMath =0;
		
		for (int i = 0; i < student.length; i++) {
			
			try {
				if(student[i][0]!= null) {
					sumMath += Integer.parseInt(student[i][3]);
				}
			}
			catch (Exception e) {
			//	System.out.println(" < Fail : 성적을 숫자로 수정하세요 >");
				System.out.println(" < "+student[i][0]+" 학생 수학정보의 오류>" );
				continue;
			}
		}
		
		return sumMath;
	}
	
	static int getSumAll(String[][] student) {
		int sumAll=0;
		int sumEng=0;
		int sumMath=0;
			
		sumEng = getSumEng(student);
		sumMath = getSumMath(student);
			
		sumAll = sumEng+sumMath;
		return sumAll;
	}
	static void printSum(String[][] student) {
		System.out.println("< 학생들의 총점 : " + getSumAll(student)+"점 >");
		System.out.println("< 영어 총점 : "+getSumEng(student)+"점 >");
		System.out.println("< 수학 총점 : "+getSumMath(student)+"점 >");
	}
	
	//7. 학생 성적 평균
	static double getAverageSum(String[][] student, int dataSize) {
		double avg = getSumAll(student);
		avg /= dataSize;
		return avg;
	}
	
	static double getAverageEng(String[][] student, int dataSize) {
		double avg = getSumEng(student);
		avg /= dataSize;
		return avg;
	}
	
	static double getAverageMath(String[][] student, int dataSize) {
		double avg = getSumMath(student);
		avg /= dataSize;
		return avg;
	}
	
	static void printAvg(String[][] student,int dataSize) {
		System.out.println("< 학생들의 평균 : " + getAverageSum(student, dataSize)+"점 >");
		System.out.println("< 영어 평균 : " + getAverageEng(student, dataSize)+"점 >");
		System.out.println("< 수학 평균 : " + getAverageMath(student, dataSize)+"점 >");
		
	}
	
	
	//8. 학생 성적순 출력(총점)
	// 8-1. 학생 데이터가 있는 배열만 뽑아서 총점과 인덱스를 담는 int 배열만들기 
	static int[][] getSum(String[][] student, int dataSize){
		int[][] studentGradeAll = new int[dataSize][2];
		for (int i = 0; i < student.length; i++) {
			try {
				if(student[i][0] != null) {	//데이터가 삭제되었거나 없으면 담지 않는다.
					
					studentGradeAll[i][0] = i;	// 해당 점수가 student[][]에서 몇번째 학생인지 확인용 변수 
					studentGradeAll[i][1] = getSumOne(student[i]); // 실제 정렬에 쓰일 비교용 데이터(총점)
				
				}
			} catch( Exception e) {	// NumberFormatException
				// 숫자나 문자가 입력되어있지 않은 경우 예외가 발생한다.
				studentGradeAll[i][0] = i;
				studentGradeAll[i][1] = -1;	// -1로 처리하여 정렬의 맨 끝에 오도록 한다. 
			}
		}
		return studentGradeAll;
		
	}
	
	// 8-2. 학생 성적순으로 출력하기 
	static int[][] sortByGrade(String[][] student, int dataSize) {
		int[][] studentGradeAll =  getSum(student, dataSize);
		int temp[];
		for (int i = 0; i < studentGradeAll.length -1; i++) {
			for (int j = i+1; j < studentGradeAll.length; j++) {
				if(studentGradeAll[i][1] < studentGradeAll[j][1] ) { 
					temp = studentGradeAll[i];
					studentGradeAll[i] = studentGradeAll[j];
					studentGradeAll[j] = temp;
				}
			}
		}
		return studentGradeAll;
	}
	// 8.2 출력하기 
	static void printByGrade(String[][] student, int dataSize) {
		int[][] studentGradeAll = sortByGrade(student, dataSize);
		for (int i = 0; i < studentGradeAll.length; i++) {
			int index = studentGradeAll[i][0];
			System.out.println((i+1)+"등 : "+student[index][0] + ", " + studentGradeAll[i][1]+"점");
		}
	}
	
	// 9. 파일로 만들어보기
	static void setFile(String[][] student) {
		String dirName = "d:";
		String fileName = "studentInfo.txt";
		
		File file = new File(dirName+"\\"+fileName);
		
		try {
			if(!file.exists()) {
				file.createNewFile();
				printFile(file, student,dirName);
			}else {
				file.delete();
				file.createNewFile();
				printFile(file, student, dirName);
			}
		} catch (Exception e) {
			// null
		}
		
		}
	static void printFile(File file, String[][] student, String dirName) {
		if(checkBeforeWriteFile(file)) {
			FileWriter fWriter = null;
			try {
				fWriter = new FileWriter(file);
			} catch (Exception e) {
			}	
			BufferedWriter bw = new BufferedWriter(fWriter); // 문장으로 모아주는 부분
			PrintWriter pw = new PrintWriter(bw);	// 모아진 문장을 출력해주는 부분()
			
			pw.println(" 이름\t나이\t영어\t수학");
			for (int i = 0; i < student.length; i++) {
				if(student[i][0] != null)
				pw.println(student[i][0]+"\t"+student[i][1]+"\t"+student[i][2]+"\t"+student[i][3]);
			}
			pw.close();
			System.out.println("< Txt 파일이 " + dirName + "에 저장되었습니다 >");
			
		}else {	// ReadOnly거나 해당 파일이 없는 경우
			System.out.println("파일이 없거나 쓸 수 없습니다.");
		}
		


	}
	
	static boolean checkBeforeWriteFile(File f) {
		if(f.exists()) {	// 파일이 존재함 
			if(f.isFile() && f.canWrite()) {	// 파일이며 쓸수 있는 파일인지 
				return true;
			}
		}
		return false;
		
	}
		
	
	static void readFile()  {
		
		String dirName = "d:";
		String fileName = "studentInfo.txt";
		File file = new File(dirName+"\\"+fileName);
		try {
			
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);
			String str;
			try {
				while( (str = br.readLine()) != null){
					System.out.println(str);
				}
			} catch (IOException e) {
				System.out.println("읽을 수 없는 파일입니다.");
			}
		
		} catch (FileNotFoundException e) {
			System.out.println("파일이 없습니다.");
		}
					
	}
	
}