| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 자바 성적산출프로그램
- SVM 투패스 어셈블러
- 백준 1236번
- 백준 한수
- java 성적산출프로그램
- 백준 1065번
- 자바 백준
- CSS
- 자바
- 자바 미니프로젝트
- 백준 2751
- 자바 백준 1157
- 백준 1157
- 백준 9012
- 자바 한수
- 자바 백준 단어공부
- 자바 백준 9012
- 투패스 어셈블러
- 자바 백준 2751
- java
- 어셈블러
- 지도 구현
- 한수구하기
- javascript
- java 백준
- 자바 백준 1236번
- 백준 2751 자바
- html
- 카카오 맵 api
- SVM어셈블러
- Today
- Total
Sunny's Coding Diary
자바[JAVA] - 성적산출프로그램(최종) 본문
저번에 올렸던 성적산출프로그램의 최종본을 만들어서 업로드 하려고 한다.
저번 프로그램에서는 데이터를 넣어둔 상태에서 출력하는 프로그램이었다면 이번엔 직접 데이터입력해서 추가하고
데이터를 불러와서 출력하는 프로그램으로 만들어 보았다.
이번도 마찬가지로 간단하게 코딩할려고 기획 했기 때문에 코드들이 간단하다는 점을 알아주었으면 좋겠다.
이번 프로젝트 클래스들의 구성은
Main.java / Student.java / Score.java / Master.java / Management.java 총 5개의 클래스로 구성되었다.
(주요 기능들은 Management클래스안에 메서드로 정의해서 간추려서 코딩할려고 했다.)
각 클래스들의 역할은 아래와 같다.
[Main.java]
텍스트 파일을 내용을 불러오고 작업하기 위해 ArrayList를 이용하여 불러온 데이터를 넣고 프로그램을 시작하는 역할을 한다.
[Student.java]
학생정보(이름, 학번, 소속)를 관리하고 과목, 점수, 등급이 들어있는 scoreList를 관리하는 역할을 한다.
[Score.java]
학생들의 과목, 점수, 등급을 관리하는 역할을 한다.
[Master.java]
관리자클래스로써 관리자만 할 수 있는 역할들을 한다. (학생들 추가하는 역할을 수행한다.)
학생이름, 학번, 소속, 수강과목, 점수, 등급을 입력하고 저장하는 역할을 한다.
[Management.java]
메인파일을 실행할 수 있도록 도와주는 관리클래스 역할을 한다.
(프로그램이 실행 될 수 있도록 메서드들을 정리한 클래스이다.)
소스코드들은 아래와 같다.
[Main.java]
import ST.*;
import java.io.IOException;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws IOException {
int loadcount = 0;
ArrayList<Student> studentList = new ArrayList<Student>();
Management management = new Management();
loadcount = management.roading(studentList); //기존 데이터 불러오기 & 기존 리스트 개수 확인
management.start(studentList, loadcount);
}
}
[Student.java]
package ST;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
//학생클래스
public class Student {
private String ID; //학생학번
private String name; //학생이름
private String affiliation; //학생소속
private int check;
private String grade;
private ArrayList<Score> scoreList = new ArrayList<Score>(5);
private Score score;
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//Student 클래스 기본생성자
public Student(String ID, String name, String affiliation) {
this.ID = ID;
this.name = name;
this.affiliation = affiliation;
this.scoreList = scoreList;
}
//Student 클래스 디폴트생성자
public Student() {
}
//설정자 생성
public void setID(String ID) {
this.ID = ID;
}
public void setName(String name) {
this.name = name;
}
public void setAffiliation(String affiliation) {
this.affiliation = affiliation;
}
//접근자 생성
public String getID() {
return ID;
}
public String getName() {
return name;
}
public String getAffiliation() {
return affiliation;
}
//과목, 점수, 등급을 입력받아 scoreList에 입력하는 메서드
public void plusScore(String subject, int point, String grade) {
scoreList.add(new Score(subject, point, grade));
}
//scoreList를 출력하는 메서드
public void comeData() {
System.out.print(scoreList.get(0).getSubject());
System.out.print(" / ");
System.out.print(scoreList.get(0).getScore());
System.out.print(" / ");
System.out.print(scoreList.get(0).getGrade());
System.out.println();
}
//관리자인지 학생인지 확인하는 함수
public String modeChecking() throws IOException {
System.out.print("[1] 관리자 [2]학생 [3] 프로그램 종료 : "); //모드 선택
check = Integer.parseInt(bf.readLine());
if (check == 1) return String.valueOf(check); //관리자모드
if (check == 2) return String.valueOf(check); //학생 모드
else if (check == 3) {
System.out.println("\n프로그램을 종료합니다.");
return "종료"; //프로그램 종료
} else { //관리자모드와 학생모드가 아닌 다른 모드 선택시
System.out.println("잘못된 접근입니다.\n" + "나가세요.\n");
System.out.println("프로그램을 종료합니다.");
return "잘못된 접근"; //잘못된 접근 프로그램 종료
}
}
//학생모드를 체크하는 메서드
public String checkingStudent() throws IOException {
if (check == 2) { //학생 모드라면
System.out.print("학생의 이름을 입력해주세요. : ");
name = bf.readLine(); //이름 입력
System.out.println("\n");
return name; //이름값 반환
}
return null;
}
//수강과목을 출력하는 메서드
public void SubjectData() {
for(int i = 0;i < scoreList.size();i++)
System.out.print(scoreList.get(i).getSubject());
}
//백업데이터 불러오기
public String backupinputdata(int loadcount) {
String[] backupdata = new String[3];
String findata = "";
for(int i = 0;i < scoreList.size();i++) {
backupdata[i] = scoreList.get(i).getSubject();
backupdata[i+1] = String.valueOf(scoreList.get(i).getScore());
backupdata[i+2] = scoreList.get(i).getGrade();
}
findata = String.join(" / ", backupdata);
return findata;
}
}
[Score.java]
package ST;
//점수클래스
public class Score {
private int score = -1; //점수
private String ID; //학번
private String grade; //성적
private String subject;
//Score 클래스 기본생성자
public Score(String subject, int score, String grade) {
this.subject = subject;
this.score = score;
this.grade = grade;
}
//Score 클래스 디폴트생성자
public Score() { }
//설정자 && 접근자
public void setScore(int score){ this.score = score; }
public int getScore() { return score; }
public void setSubject(String subject) { this.subject = subject; }
public String getSubject() { return subject; }
public void setGrade(String grade) { this.grade = grade; }
public String getGrade() { return grade; }
}
[Master.java]
package ST;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
//관리자 클래스
public class Master {
private String ProPw; //관리자 번호
private String check; //항목선택
private int checking; //항목선택
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
public Master() { } //관리자 클래스 디폴트 생성자
//로그인 메서드 (관리자 모드에 접속할 땐 관리자번호를 입력해야됨.)
public boolean Login() throws IOException{
String propw = "super"; //고정적인 관리자 번호
System.out.print("\n관리자 번호를 입력하시오. : ");
ProPw = bf.readLine(); //관리자 번호입력
System.out.println("");
if(propw.equals(ProPw)){ //관리자 번호를 제대로 입력한 경우
System.out.println("관리자 서버 접속 성공");
System.out.println("\n");
}
else { //관리자 번호가 틀린 경우
System.out.println("관리자 번호가 틀렸습니다.");
System.out.println("나가세요.");
return false;
}
return true;
}
//관리자 모드 항복 선택하는 메서드
public String checkingMaster() throws IOException {
System.out.print("[1] 데이터 입력 [2] 데이터 확인 [3] 프로그램 종료 : ");
checking = Integer.parseInt(bf.readLine()); //3개의 항목 선택
System.out.println("\n");
if (checking == 3) { //프로그램 종료를 선택한 경우
System.out.println("프로그램을 종료합니다.");
return "종료"; //프로그램 종료
}
return String.valueOf(checking); //입력 항목 번호 반환(1, 2)
}
//항목을 받아와서 관리자모드의 기능을 수행하는 메서드
public String ProCheck(String ck, ArrayList<Student> studentList) throws IOException {
if(ck.equals("1")){ //데이터 입력을 선택한 경우
//기존에 있는 학생인지 신규학생인지 확인
System.out.print("[1] 기존 학생 [2] 신규 학생 : ");
check = bf.readLine();
System.out.println("\n");
return check;
}
else if(ck.equals("2")) { //데이터 확인을 선택한 경우
System.out.println("--------------");
for(int i = 0; i < studentList.size();i++){
System.out.println(studentList.get(i).getName());
}
System.out.println("--------------\n");
System.out.println();
System.out.print("확인하고 싶은 학생 이름을 입력하시오. : ");
check = bf.readLine();
System.out.println("\n");
return check;
}
else { //잘못된 접근일 경우
System.out.println("잘못된 접근입니다.");
return String.valueOf(0);
}
}
}
[Management.java]
package ST;
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
//프로그램 동작 관리 클래스
public class Management {
//프로그램 시작 메서드
public static void start(ArrayList<Student> studentList, int loadcount) throws IOException {
String check;
String save = "";
String save1 = "";
String save2 = "";
boolean login = false;
Student student = new Student();
Master master = new Master();
//프로그램 실행 문구
System.out.println("성적산출프로그램입니다.\n");
System.out.println("본 프로그램은 컴퓨터공학과 학생의 성적을 산출하는 프로그램입니다.");
System.out.println("\n");
//프로그램 시작 (모드 선택)
switch (check = student.modeChecking()) {
case "1": //관리자 모드
break;
case "2": //학생 모드
break;
case "종료": //프로그램 종료
break;
case "잘못된 접근": //잘못된 접근
break;
}
//모드 선택후 실행
while (true) {
if (check.equals("종료") || save2.equals("종료") || save.equals("종료")) break;
else if (check.equals("잘못된 접근") || save2.equals("잘못된 접근")) break;
else if (check.equals("1")) { //관리자 모드를 선택한 경우
if (login == false) {
login = master.Login(); //관리자 모드 로그인
if(login == false) break; //로그인 실패시 프로그램 종료
}
//데이터 입력(1) / 확인(2) /프로그램 종료(3) save에 저장
save = master.checkingMaster();
if (save.equals("종료")) break; //프로그램 종료(3)을 선택한 경우
save1 = master.ProCheck(save, studentList); //데이터 입력 / 확인 처리
if(save.equals("1")){
Write(studentList, save1, loadcount); //1이면 데이터 입력
save2 = exit();
}
//2번이면 데이터 확인 (학생이름으로 데이터 출력)
if (save.equals("2")){
if(save1.equals("all")) printAll(studentList);
else printChoice(studentList, save1);
System.out.println();
save2 = exit();
}
} else { //학생 모드를 선택한 경우
save = student.checkingStudent();
printChoice(studentList, save);
save2 = exit();
}
}
}
//로딩 메서드
public static int roading(ArrayList<Student> studentList) throws IOException {
String line = "";
int count = 0;
BufferedReader reader = new BufferedReader(new FileReader("src/Information.txt"));
while ((line = reader.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, " / ");
studentList.add(new Student(st.nextToken(), st.nextToken(), st.nextToken()));
studentList.get(count++).plusScore(st.nextToken(), Integer.parseInt(st.nextToken()), st.nextToken());
}
return count;
}
//데이터 출력 메서드
public static void printAll(ArrayList<Student> studentList) {
System.out.println("-------------2022년도 성적-------------");
System.out.println("학번 / 이름 / 소속 / 과목명 / 점수 / 성적\n");
for (int i = 0; i < studentList.size(); i++) {
System.out.print(studentList.get(i).getID());
System.out.print(" / ");
System.out.print(studentList.get(i).getName());
System.out.print(" / ");
System.out.print(studentList.get(i).getAffiliation());
System.out.print(" / ");
studentList.get(i).comeData();
}
}
//데이터 선택 출력 메서드
public static void printChoice(ArrayList<Student> studentList, String save) {
String line = "";
int count = 0;
System.out.println("-------------2022년도 성적-------------");
System.out.println("학번 / 이름 / 소속 / 과목명 / 점수 / 성적\n");
for(int i = 0;i < studentList.size();i++) {
if(save.equals(studentList.get(i).getName())) {
System.out.print(studentList.get(i).getID());
System.out.print(" / ");
System.out.print(studentList.get(i).getName());
System.out.print(" / ");
System.out.print(studentList.get(i).getAffiliation());
System.out.print(" / ");
studentList.get(i).comeData();
count++;
}
}
if(count == 0) System.out.print("입력 정보가 없습니다.");
System.out.println("");
}
public static String exit() throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String ch;
System.out.print("프로그램을 종료하시겠습니까? Y/N ");
ch = bf.readLine();
if (ch.equals("Y")) {
System.out.println("프로그램을 종료합니다.\n이용해주셔서 감사합니다.");
return "종료";
}
else if(ch.equals("N")) return "계속";
else {
return "잘못된 접근";
}
}
//데이터 입력 메서드
public static void Write(ArrayList<Student> studentList, String saving, int loadcount) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
File file = new File("src/Information.txt");
//FileWriter fileWriter = new FileWriter(file, true);
String save = null;
String save1 = null;
String save2 = null;
String ch;
int count = 0;
switch (saving) {
case "1": //기존 학생을 입력하는 경우
System.out.println("--------------");
for(int i = 0;i < studentList.size();i++) {
System.out.println(studentList.get(i).getName());
}
System.out.println("--------------\n");
System.out.print("어떤 학생의 정보를 보시겠습니까? ");
ch = bf.readLine();
for(int i = 0; i < studentList.size();i++){
if(ch.equals(studentList.get(i).getName())) count++;
}
if(count == 0) System.out.println("\n입력한 학생이 없습니다.\n");
if(count > 0) System.out.println(ch + " 학생의 정보입니다.\n");
for(int i = 0;i < studentList.size();i++) { //수강하는 과목 보여주기
if(ch.equals(studentList.get(i).getName())) {
System.out.println("----------------------------");
System.out.println("[학번 / 소속]");
System.out.print(studentList.get(i).getID());
System.out.println(" / " + studentList.get(i).getAffiliation());
System.out.println("----------------------------");
System.out.println("[수강과목]");
studentList.get(i).SubjectData();
System.out.println("\n");
}
}
break;
case "2": //신규 학생을 입력하는 경우
System.out.print("학번을 입력하시오. : ");
save = bf.readLine();
System.out.print("이름을 입력하시오. : ");
save1 = bf.readLine();
System.out.print("소속을 입력하시오. : ");
save2 = bf.readLine();
studentList.add(new Student(save, save1, save2));
System.out.print("\n[이번학기 수강과목]\n");
System.out.println("");
System.out.print("[1] 컴퓨터네트워크\n[2] 시스템프로그래밍\n");
System.out.print("[3] 객체지향프로그래밍\n[4] 정보보안\n");
System.out.print("[5] 웹프로그래밍\n[6] 데이터구조\n");
System.out.println("");
System.out.print("과목을 입력하시오. : ");
save = bf.readLine();
System.out.print("점수를 입력하시오. : ");
save1 = bf.readLine();
System.out.print("등급을 입력하시오. : ");
save2 = bf.readLine();
studentList.get(loadcount).plusScore(save, Integer.parseInt(save1), save2);
Backup(studentList, loadcount);
break;
default:
System.out.println("잘못된 접근입니다.");
}
}
//백업 메서드
public static void Backup(ArrayList<Student> studentList, int loadcount) throws IOException {
File file = new File("src/Information.txt");
FileWriter fileWriter = new FileWriter(file, true);
BufferedWriter writer = new BufferedWriter(fileWriter);
writer.write(studentList.get(loadcount).getID());
writer.write(" / ");
writer.write(studentList.get(loadcount).getName());
writer.write(" / ");
writer.write(studentList.get(loadcount).getAffiliation());
writer.write(" / ");
writer.write(studentList.get(loadcount).backupinputdata(loadcount));
writer.write("\n");
writer.close();
}
}
텍스트파일은 따로 없어도 프로그램을 실행하면 자동으로 생긴다.
(프로그램 실행화면은 각각의 화면들이 너무 많기 때문에 생략하겠다.)
[코딩을 하면서]
저번에 간단하게 만들었던 성적산출프로그램보다 업그레이드 된 프로그램이다.
프로그램을 만들면서 이런저런 잡다한 오류들이 많이 생겼는데 하나하나 푸는데 시간이 생각보다 많이 걸렸다.
아무래도 오랜만에 접하는 언어이기도 하고 처음해보는 미니 프로젝트이기 때문에 시간이 더 걸렸던거 같다.
실습을 하면서 하나하나의 코딩도 중요하지만 프로그램의 로직이 더 중요하다는 것을 깨달았다.
기초가 튼튼해야 완성도 있는 하나의 프로그램이 만들어진다.
부족한 부분도 많지만 이해해주길 바란다.
[꿈은 크게 가져라, 부셔져도 그 조각이 크게]
'JAVA' 카테고리의 다른 글
| 자바[JAVA] - 백준 2751번 수 정렬하기 (0) | 2023.02.26 |
|---|---|
| 자바[JAVA] - 백준 1157번 단어공부 (0) | 2023.02.25 |
| 자바[JAVA] - 백준 1065번 한수 (2) | 2023.02.04 |
| 자바[JAVA] - 백준 1236번 성지키기 (1) | 2023.02.01 |
| 자바[JAVA] - 성적산출프로그램 (3) | 2023.01.06 |