우당탕탕 개발일지

11일차_과제 본문

비트캠프/과제

11일차_과제

ujin302 2024. 7. 18. 12:04
반응형

1. 성적처리

1. 필드로 번호(no), 이름(name), 국어(kor), 영어(eng), 수학(math), 총점(tot), 평균(avg) 잡는다
2. 번호 입력할 때 중복해서 넣지 않는다.
3. 1인분의 클래스로 SungJukDTO.java 사용한다.
4. SungJukDTO.java 에서 toString() Override 한다.
   toString()에서 평균은 소수이하 2째자리까지 한다.
   
   생성자
   setter / getter 메소드
   calc() - 총점과 평균을 계산한다.
   
5. 입력, 출력, 수정, 삭제, 소트하는 클래스는 반드시 interface를 상속받는다.
6. menu() 작성한다.
   만약에 1 ~ 6번 외의 숫자가 들어오면 "1~6중에 선택하세요" 메세지를 출력 후 다시 입력받는다.
   1. 입력
   2. 출력
   3. 수정
   4. 삭제
   5. 정렬
   6. 끝

7. SungJukInsert.java
- 번호, 이름, 국어, 영어, 수학를 입력하여 총점과 평균을 계산한다.

번호 입력 : 
이름 입력 : 
국어 입력 : 
영어 입력 : 
수학 입력 : 

입력되었습니다

8. SungJukPrint.java
- ArrayList에 저장된 모든 데이터를 출력한다.
 
번호   이름   국어   영어   수학    총점   평균

9. SungJukUpdate.java
- 없는 번호가 입력되면 "잘못된 번호 입니다." 라고 출력한다.
- 있는 번호가 입력되면 번호에 해당하는 데이틀 출력 후 수정한다.
  수정한 후에는 총점과 평균을 재계산해야 한다.

번호 입력 : 
잘못된 번호 입니다.

또는 

번호   이름   국어   영어   수학    총점   평균

수정 할 이름 입력 : 
수정 할 국어 입력 : 
수정 할 영어 입력 : 
수정 할 수학 입력 : 

수정하였습니다.

10. SungJukDelete.java
- 이름을 입력하여 없는 이름이면 "회원의 정보가 없습니다" 출력하시오
- 똑같은 이름이 있으면 모두 삭제한다.

삭제할 이름 입력 : 천사
회원의 정보가 없습니다

또는 

x건의 항목을 삭제하였습니다.

11. SungJukSort.java
- menu() 작성한다. (단, 이름으로 오름차순 메뉴은 출력하되 소스 작성하지 않는다. (월요일))

********************
  1. 총점으로 내림차순
  2. 이름으로 오름차순
  3. 이전 메뉴
********************
  번호 : 

 

코드

SungJukMain.java

package sungjuk;

public class SungJukMain {

	public static void main(String[] args) {
		SungJukService sungJukService = new SungJukService();
		
		sungJukService.menu();
	}

}

 

 

SungJukService.java

메뉴 출력

package sungjuk;

import java.util.ArrayList;
import java.util.Scanner;

public class SungJukService {
	private ArrayList<SungJukDTO> list = new ArrayList<SungJukDTO>();
	
	public void menu() {
		Scanner sc = new Scanner(System.in);
		boolean isSelect = true;
		int input = 0;
		SungJuk sungJuk = null; // 인터페이스 
		
		while(isSelect) {
			System.out.print("----------------------\n"+ 
								"1. 입력\n" + 
								"2. 출력\n" + 
								"3. 수정\n" + 
								"4. 삭제\n" + 
								"5. 정렬\n" + 
								"6. 종료\n" + 
								"----------------------\n" + 
								"번호 입력 : ");
			
			input = sc.nextInt();
			
			switch (input) {
			case 1:
				sungJuk = new SungJukInsert();
				break;
			case 2:
				sungJuk = new SungJukPrint();	
				break;
			case 3:
				sungJuk = new SungJukUpdate();
				break;
			case 4:
				sungJuk = new SungJukDelete();
				break;
			case 5:
				sungJuk = new SungJukSort();
				break;
			case 6:
				isSelect = false;
				System.out.println("프로그램이 종료되었습니다.");
				break;
			default:
				System.out.println("1~6중에 선택하세요");
				break;
			}
			
			if(isSelect) sungJuk.execute(list);
		}
	}
}

 

SungJuk.java 

인터페이스

package sungjuk;

import java.util.ArrayList;

public interface SungJuk {
	public void execute(ArrayList<SungJukDTO> list);
}

 

SungJukDTO.java

학생 정보 

package sungjuk;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

public class SungJukDTO implements Comparable<SungJukDTO>{
	private int no; // 힉생 번호 
	private String name; // 이름
	private int kor, eng, math, tot; // 국어, 영어, 수학, 총점
	private double avg; // 평균 
	
	public SungJukDTO() {}
	
	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	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 getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}

	public int getTot() {
		return tot;
	}

	public void setTot(int tot) {
		this.tot = tot;
	}

	public double getAvg() {
		return avg;
	}

	public void setAvg(double avg) {
		this.avg = avg;
	}
	
	public void calc() {
		this.tot = kor + eng + math;
		this.avg = (double) tot / 3;
	}
	
	public String toString() {
		return this.no + "\t" + this.name + "\t" + kor + "\t" + eng + "\t" + math + "\t" + tot + "\t" + String.format("%.2f", avg);
	}
	
	public int compareTo(SungJukDTO o) {
		// 총점 기준 내림차순
		if(this.tot > o.tot) return -1; 
		else if(this.tot < o.tot) return 1;
		else return 0;
	}

}

 

SungJukInsert.java

학생 정보 및 성적 입력

package sungjuk;

import java.util.ArrayList;
import java.util.Scanner;

public class SungJukInsert implements SungJuk {
	
//	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		Scanner sc = new Scanner(System.in);
		
		// 1. DTO 객체 생성 
		SungJukDTO sungJukDTO = new SungJukDTO();
		
		// 2. 입력
		System.out.print("번호 입력 : ");
		sungJukDTO.setNo(sc.nextInt());
		
		System.out.print("이름 입력 : ");
		sungJukDTO.setName(sc.next());
		
		System.out.print("국어 입력 : ");
		sungJukDTO.setKor(sc.nextInt());
		
		System.out.print("영어 입력 : ");
		sungJukDTO.setEng(sc.nextInt());
		
		System.out.print("수학 입력 : ");
		sungJukDTO.setMath(sc.nextInt());
		
		// 3. 총점, 평균 계산  
		sungJukDTO.calc();
		
		// 4. list에 추가 
		list.add(sungJukDTO);
		System.out.println("입력되었습니다.\n");
	}
}

 

SungJukPrint.java

모든 학생 정보 출력

package sungjuk;

import java.util.ArrayList;

public class SungJukPrint implements SungJuk {

//	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		System.out.println("번호\t이름\t국어\t영어\t수학\t총점\t평균");
		
		for(SungJukDTO dto : list) {
			System.out.println(dto);
		}
	}
}

 

SungJukUpdate.java

학생 정보 및 성적 수정

package sungjuk;

import java.util.ArrayList;
import java.util.Scanner;

public class SungJukUpdate implements SungJuk {

//	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		Scanner sc = new Scanner(System.in);
		int no = 0;
		boolean isFind = false;
		System.out.print("번호 입력 : ");
		no = sc.nextInt();
		
		for(SungJukDTO dto : list) {
			if(dto.getNo() == no) {
				isFind = true;
				System.out.println("번호\t이름\t국어\t영어\t수학\t총점\t평균\n" + dto);
				
				// 1. 정보 입력 및 수정 
				System.out.print("수정할 이름 입력 : ");
				dto.setName(sc.next());
				
				System.out.print("수정할 국어 입력 : ");
				dto.setKor(sc.nextInt());
				
				System.out.print("수정할 영어 입력 : ");
				dto.setEng(sc.nextInt());
				
				System.out.print("수정할 수학 입력 : ");
				dto.setMath(sc.nextInt());
				
				// 2. 총점, 평균 재계산
				dto.calc();
				System.out.println("수정하였습니다.\n");
			}
		}
		
		if(!isFind) System.out.println("잘못된 번호 입니다.\n");
		
	}
}

 

SungJukDelete.java

학생 정보 삭제

 

방법 1. list 크기만큼 반복문 사용하여 이름과 동일하면 삭제

오류 발생 가능성이 있다. 

크기 4일 경우, i=2 삭제 되었다고 가정해보겠다.

그렇게 되면 2 인덱스가 3으로 3인덱스가 4로 이동한다. 그러면 2번을 또 확인을 해여야 하지만 그렇게 되지 않는다. 또한, list의 크기가 변경되어 오류 발생 가능성이 생긴다. 따라서 방법 2번으로 진행한다. 

 

방법 2. Iterator 인터페이스를 활용하여 이름과 동일하면 삭제 

Iterator 인터페이스형을 가진 itList 변수를 사용한다. 

Iterator 인터페이스의 next() 함수를 사용한다. 

next() 함수는 현재 원소를 반환한 후에 그 다음 원소로 이동한다. 

원소를 중간에 삭제하여도 이미 다음 원소로 이동하였기 때문에 오류가 발생하는 상황이 생기지 않는다.

또한, hasNext() 함수를 사용하여 다음 원소가 존재하는 경우에만  while문을 수행하기 때문에 원소의 인덱스와 상관이 없어진다. 

package sungjuk;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class SungJukDelete implements SungJuk {

//	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		Scanner sc = new Scanner(System.in);
		String name = null;
		int deleteCount = 0;
		
		// 1. 이름 입력 
		System.out.print("삭제할 이름 입력 : ");
		name = sc.next();
		name.replace(" ", "");
		
		// 2. 이름 탐색 및 삭제 
		Iterator<SungJukDTO> itList = list.iterator();
		while(itList.hasNext()) {
			SungJukDTO dto = itList.next();
			if(name.equals(dto.getName())) {
				deleteCount ++;
				list.remove(dto);
			}
		}
		
		
		if(deleteCount > 0) {
			System.out.println(deleteCount + "건의 항목을 삭제하였습니다.\n");
		}else {
			System.out.println("회원의 정보가 없습니다.\n");
		}
	}
}

 

SungJukSort.java

학생 정렬

package sungjuk;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

public class SungJukSort implements SungJuk {
	
	public void menu(ArrayList<SungJukDTO> list) {
		Scanner sc = new Scanner(System.in);
		int num = 0;
		
		while(true) {
			// 1. 메뉴 입력
			System.out.print("********************\n" + 
					"  1. 총점 기준 내림차순\n" + 
					"  2. 이름 기준 오름차순\n" + 
					"  3. 이전 메뉴\n" + 
					"********************\n" + 
					"  번호 : ");
			num = sc.nextInt();
						
			// 2. 메뉴별 sort
			if(num == 1) {
				// 총점 기준 내림차순 
//				Collections.sort(list, (o1, o2) -> o2.getTot()- o1.getTot());
//				Collections.sort(list, (o1, o2) -> (o1.getTot()- o2.getTot()) * -1);
				Collections.sort(list);
			}else if(num == 2) {
				// 이름 기준 오름차순 
//				Collections.sort(list, (o1, o2) -> o1.getName().compareTo(o2.getName()));
				
				Comparator<SungJukDTO> com = new Comparator<SungJukDTO>() {
					@Override
					public int compare(SungJukDTO o1, SungJukDTO o2) {
						return o1.getName().compareTo(o2.getName());
					}
				};
				
				Collections.sort(list, com);
			}else if(num == 3) break;
			else System.out.println("1~3중에 선택하세요");
			
			// 3. 출력
			System.out.println("번호\t이름\t국어\t영어\t수학\t총점\t평균");
			
			for(SungJukDTO dto : list) {
				System.out.println(dto);
			}
			
		}
	}
	
//	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		new SungJukSort().menu(list);
	}
}

 

출력 화면

1. 입력

 

2. 출력

 

3. 수정

 

 

4. 삭제

 

5. 정렬

 

6. 종료

반응형

'비트캠프 > 과제' 카테고리의 다른 글

16일차_과제  (1) 2024.07.24
15일차_과제  (0) 2024.07.23
10일차_과제  (0) 2024.07.16
9일차_과제  (0) 2024.07.16
7일차_과제  (0) 2024.07.12