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:59package 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("파일이 없습니다.");
}
}
}
'Language > Java_basic' 카테고리의 다른 글
Java Basic : day 8 - OOP: Class 특징 - 1. 은닉화 (0) | 2019.11.27 |
---|---|
Java Basic : day 8 - 객체 지향 프로그래밍 Object Oriented Programming (0) | 2019.11.27 |
Java Basic : day 7 - File write 파일 쓰기 (0) | 2019.11.26 |
Java Basic : day 7 - File Read 파일 읽기 (0) | 2019.11.26 |
Java Basic : day 7 - File : 파일 입출력 (0) | 2019.11.26 |