[JAVA] ArrayList사용 성적관리 프로그램
- 맨땅에코딩
- 2020. 8. 24.
성적 관리 프로그램을 만들어 보았다. database가 없어 실제로 어딘가에 사용될 일은 없지만
java 복습겸 나름 여러가지 기능을 추가해서 만들어 보았다.
기능
1.추가 2.조회 3.전체조회 4.수정 5.삭제 0.종료 추가 >>몇명의 학생을 한번에 추가할지 물어봄 ( 배열이 아니라 차후에 더 입력 가능 ) 조회 >> 학번을 입력받아 학번으로 조회 전체조회 >> 입력된 모든정보가 나옴 수정 >> 일괄수정, 부분수정 삭제 >> 전체삭제,부분삭제 (5명의 학생이 잇을때 2명을 한번에 삭제한다고하면 한명 삭제후 메인으로 이동하는게 아닌 바로 다음 학생의 정보를 삭제가능) |
DataClass
public class StuData {
private int kor,eng,mat;
private String name,id;
public StuData(String id,String name, int kor, int eng, int mat){
this.id = id;
this.name = name;
this.kor = kor;
this.eng = eng;
this.mat = mat;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
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 String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getTotal() {
return (kor+eng+mat);
}
public float getAvg() {
float avg =kor+eng+mat/3.f;
String str = String.format("%.2avg",avg);
return avg;
// return (kor+eng+mat)/3.f;
}
}
MainRun
import java.util.Scanner;
public class MainRun {
public static void main(String[] args) {
int select = -1;
StuCont cont = new StuCont();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("성적관리 프로그램");
System.out.println("1.추가 2.검색 3.전체검색 4.수정 5.삭제 0.종료");
select = sc.nextInt();
if (select == 1) {
cont.insert();
} else if (select == 2) {
cont.serch();
} else if (select == 3) {
cont.serchAll();
} else if (select == 4) {
cont.modify();
} else if (select == 5) {
cont.delete();
} else if (select == 0) {
System.exit(0);
}
break;
}
}
}
Controller
import java.util.ArrayList;
import java.util.Scanner;
public class StuCont{
ArrayList<StuData> list; //arraylist 생성 ( StuData 클래스가 배열에 담기게 된다 )
Scanner sc;
private String id,name;
private int kor,eng, mat;
StuData data; //래퍼런스 변수
boolean flag;
StuCont() {
list = new ArrayList();
sc = new Scanner(System.in);
flag = true; //중복된 학번입력 받을시 유효성 검사를 위한 변수
}
//입력
void insert(){
int stu_Num;
System.out.println("몇명의 학생을 입력하시겠습니까?:");
stu_Num = sc.nextInt(); //값 입력 받음
for(int i=0;i<stu_Num;i++) { //입력 받은 수만큼 반복문
//값 입력 부분
System.out.println("학번을 입력하세요:");
id = sc.next();
System.out.println("이름을 입력하세요.:");
name = sc.next();
System.out.println("국어점수를 입력하세요:");
kor = sc.nextInt();
System.out.println("영어점수를 입력하세요 :");
eng = sc.nextInt();
System.out.println("수학점수를 입력하세요::");
mat = sc.nextInt();
//list크기만큼 for문 실행
for(int j=0;j<list.size();j++) {
//중복된 학번 잇으면 다시 입력
if(list.get(j).getId().equals(id)) {
System.out.println("이미 존재하는 학번입니다.다시 입력해주세요.");
flag = false;
break;
}
}
//없으면 값 입력!
if (flag == true) {
list.add(new StuData(id,name,kor,eng,mat));
}
}
}
//조회
void serch(){
String find; //학번이나 이름 입력받을 변수
System.out.println("검색할 학번 또는 이름을 입력하세요:");
find = sc.next();
for(int i = 0; i<list.size();i++){ //list 크기만큼 for문 실행
//학번이나 이름 둘다 조회 가능하게
if(find.equals(list.get(i).getId()) || find.equals(list.get(i).getName())) {
System.out.println("조회중입니다 잠시만 기다려 주세요");
try { //복습겸 있어보이는 Thread 사용 ㅋㅋ(없어도됨)
Thread.sleep(300);
}catch(InterruptedException e) {
}
System.out.println("학번\t이름\t국어\t영어\t수학\t총점\t평균");
System.out.println(list.get(i).getId()+"\t" +list.get(i).getName()+"\t"+list.get(i).getKor()+"\t"+list.get(i).getEng()+"\t"+list.get(i).getMat()+"\t"+
list.get(i).getTotal()+"\t"+list.get(i).getAvg());
}
else {
System.out.println("학번 혹은 이름을 다시 확인해주세요.");
}
break;
}
}
//전체조회
void serchAll() {
System.out.println("학번\t이름\t국어\t영어\t수학\t총점\t평균");
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i).getId()+"\t" +list.get(i).getName()+"\t"+list.get(i).getKor()+"\t"+list.get(i).getEng()+"\t"+list.get(i).getMat()+"\t"+
list.get(i).getTotal()+"\t"+list.get(i).getAvg());
}
}
//수정
void modify() {
String mod_Stu;
System.out.println("수정할 학번 또는 이름을 입력하세요:");
mod_Stu = sc.next();
int select;
for (int i=0;i<list.size();i++) {
if(mod_Stu.equals(list.get(i).getId()) || mod_Stu.equals(list.get(i).getName())) {
System.out.println("수정할 부분을 선택해주세요 1.일괄수정 2.학번 3.이름 4.국어 5.수학 6.영어 0.취소:");
select = sc.nextInt();
if(select == 1) {
System.out.println("변경할 학번을 입력하세요:");
list.get(i).setId(sc.next());
System.out.println("변경할 이름을 입력하세요:");
list.get(i).setId(sc.next());
System.out.println("변경할 국어점수를 입력하세요:");
list.get(i).setId(sc.next());
System.out.println("변경할 수학점수를 입력하세요:");
list.get(i).setId(sc.next());
System.out.println("변경할 영어점수를 입력하세요:");
list.get(i).setId(sc.next());
System.out.println("수정이 완료되었습니다.\n");
System.out.println("학번\t이름\t국어\t영어\t수학\t총점\t평균");
System.out.println(
list.get(i).getId()+"\t" +list.get(i).getName()+"\t"+list.get(i).getKor()+"\t"+
list.get(i).getEng()+"\t"+list.get(i).getMat()+"\t"+
list.get(i).getTotal()+"\t"+list.get(i).getAvg()+"\n\n");
break;
}
else if(select == 2) {
String previous;
previous = list.get(i).getId();
System.out.println("변경할 학번을 입력하세요:");
list.get(i).setId(sc.next());
System.out.println("학번이"+previous+"에서"+list.get(i).getId()+"로 변경되었습니다");
break;
}
else if(select == 3) {
String previous;
previous = list.get(i).getId();
System.out.println("변경할 이름을 입력하세요:");
list.get(i).setName(sc.next());
System.out.println("이름이"+previous+"에서"+list.get(i).getName()+"로 변경되었습니다");
break;
}
else if(select == 4) {
int previous;
previous = list.get(i).getKor();
System.out.println("변경할 국어점수를 입력하세요:");
list.get(i).setKor(sc.nextInt());
System.out.println("국어점수가"+previous+"에서"+list.get(i).getKor()+"로 변경되었습니다");
break;
}
else if(select == 5) {
int previous;
previous = list.get(i).getEng();
System.out.println("변경할 영어점수를 입력하세요:");
list.get(i).setEng(sc.nextInt());
System.out.println("영어점수가"+previous+"에서"+list.get(i).getEng()+"로 변경되었습니다");
break;
}
else if(select == 6) {
int previous;
previous = list.get(i).getMat();
System.out.println("변경할 수학점수를 입력하세요:");
list.get(i).setMat(sc.nextInt());
System.out.println("수학점수가"+previous+"에서"+list.get(i).getMat()+"로 변경되었습니다");
break;
}
else if(select == 0) {
break;
}
else {
System.out.println("제대로 입력해주세요.");
}
}
}
}
//삭제
void delete() {
String del_Stu;
int select,stu_Num;
System.out.println("1.전체삭제 2.부분삭제");
select = sc.nextInt();
//전체삭제
if(select==1) {
list.clear(); //clear()라는 메소드를 사용하면 배열에 담겨잇는 전체 객체를 날려버린다.
System.out.println("전체삭제가 완료 되었습니다.");
}
//부분삭제
else if(select==2) {
System.out.println("몇명의 학생을 삭제하시겠습니까?:");
stu_Num = sc.nextInt();
for(int i=0;i<stu_Num;i++) {
System.out.println("삭제할 학생의 학번을 입력해주세요:");
del_Stu = sc.next();
for (StuData data : list) {
if(data.getId().equals(del_Stu)) {
list.remove(data);
break;
}
}
}
}
}
}
하면서 막혔던부분
전체삭제
clear()라는 메소드를 모르고 list.remove(i)라는 메소드를 사용을 했었는데 (for문 같이 사용)
5명의 학생이 있다고 가정했을때 전체 삭제를 수행시키면 1,3,5 번째 학생만 삭제된다(하나씩 띄어져서 삭제됨)
아직 원인은 못찾았지만 clear라는 해결책을 찾아내서 기능구현을 완료했다.
*추가 remove를 사용해서 전체 삭제 하는방법
if(select==1) {
System.out.println("1. size : "+list.size());
int ct = list.size(); // list.size의 고정값을 담을 변수생성
for(int i=0; i<ct;i++) { //고정값이 담긴 변수로 for문 실행
System.out.println("i : "+i+" listsize : " + list.size());
list.remove(0); // 하나씩 당겨지면서 0이 되는 모든 인덱스들 삭제
}
}
1,3,5번만 삭제되던 이유 : i가 1씩 증가하면서 삭제하는데 0번째 인덱스가 삭제되면서 1이었던 인덱스가 앞으로 당겨지면서 0이되고 2였던 인덱스가 1로 되면서 원래 2였던 인덱스가 삭제. (반복)
그걸 println으로 'i'값, 'listsie'값을 출력해보며 확인을 했고 remove(i)가아닌 (0)을 넣어서 0번째 인덱스를 계속 삭제하도록 했다.
근데 5번 수행하도록 생각하고 만든 for문이 listsize크기가 1씩 줄어들면서 3번밖에 실행이 되지 않는다는것을 확인하고 변수(ct)를 새로 만들어 listsize의 삭제전 고정값을 넣어주고 'ct' 만큼 반복문을 돌리니 clear를 사용한것과 같은 동작이 되도록 만들었다.
부분삭제
우선 문제점이 뭐였냐면 여러명의 학생을 삭제한다고 했을때 처음과 끝 인덱스값이 아닌 중간 인덱스들을 삭제하면
기능이 잘 수행됐지만 처음이나 끝인덱스를 삭제하는 명령을 사용하면 에러가 났다.
원인은 break 자리에 return을 사용했었는데 이 부분만 수정하니 정상적으로 동작이 됐다.(return 위치만 몇번을 바꿧는지 모르겠다)
이유에 대해서는 머리아프니 나중에 개념이 확실하게 정리되면 써놓도록 하겠다.
입력 부분에서중복된 학번이 있을경우에 대한 유효성
원래 처음 만들땐 중복상관없이 입력을 받았지만 실제 프로그램이라면 이렇게 짜여지지 않았을거라 생각하고 변경을 해
보려고 했지만 뭔가 계속 막혔다. if문의 조건문안에서만 해결하려고 했던게 문제였고 새로 boolean 변수를 만들어
if문의 조건이 맞지 않으면 출력 X boolean변수의 값이 일치하면 출력 O 이런식으로 기능을 조금 나누었더니 정상적으
로 작동을 했다. boolean이 아닌 다른 평범한(?) 타입으로 해도 되지만 직관적으로 확인하기 쉽게 boolean을 썻다.
추가하면 좋을것 같은 기능들
1. 학생의 점수에 따라 등급을 나눠주는 기능.
2. 과목을 배열로 선언해서 내가 원하는 과목수 만큼 넣는 기능.
3. 학생과, 선생님이 있다고 할때 학생은 조회만 가능하도록. 선생님은 모든 기능을 사용 가능하도록
하는 기능을 넣어보고 싶다.
4.기능은 아니지만 같은 collections인 set,map을 이용해서 구현해 보고싶다. ( 나~중에 ㅋㅋ)
'맨땅에코딩' 카테고리의 다른 글
[JAVA] for문으로 최소,최대수 입력받아서 총 합 출력 (0) | 2020.09.06 |
---|