코딩항해기

[실습/JAVA] 출석부 프로그램 만들기 (+풀이 0628) 본문

problem solving/과제&실습 코딩

[실습/JAVA] 출석부 프로그램 만들기 (+풀이 0628)

miniBcake 2024. 6. 27. 21:09

 

배열에 대해 공부하기 위해 출석부 프로그램 만들기 실습을 진행하였다.

(풀이 비교 추가함 2024.06.28.)

[문제]

학생부 프로그램 만들기

 

요구사항

최대 5명까지 저장할 수 있는 학생부가 있습니다.
학생부 프로그램을 작성해주세요.

 

[로직 구성]

더보기

 * 메뉴안내
 * 메뉴 선택지 입력받기
 * 
 * 프로그램 종료 선택시
 * >정말 종료할지 확인하기
 * >>종료하겠다면 반복문 종료(프로그램 종료)
 * 
 * 학생 추가 선택시
 * >배열에 자리가 있다면
 * >학생 이름 입력받기
 * >저장하기 전 확인하기
 * >저장하기 선택시 학생이름 배열에 추가
 * >아니라면 저장하지 않고 이름을 다시 입력받음
 * 
 * 학생부 전체 출력
 * >배열이 비었는지 검사하기
 * >>만약 배열이 비었다면 비었음을 알리고 메뉴로
 * >배열의 값 출력하기
 * 
 * 학생 검색하기
 * >배열이 비었는지 검사하기
 * >>만약 배열이 비어있다면 비어서 검색이 불가능함을 알리고 메뉴로
 * >검색어 입력받기
 * >>검색 내용이 있다면 출력하기
 * >>없다면 없음을 알리기
 * 
 * 번호로 학생 검색하기
 * >배열이 비었는지 검사하기
 * >>만약 배열이 비어있다면 비어서 검색이 불가능함을 알리고 메뉴로
 * >번호 입력받기
 * >번호가 저장된 학생의 수의 길이을 넘지 않는지 검사하기
 * >>넘지 않는다면 해당 배열의 값을 반환
 * >>아니라면 해당 번호의 학생은 없으니 다시 입력받기
 * 
 * 학생 정보 변경하기(이름)
 * >배열이 비었는지 검사하기
 * >>만약 배열이 비어있다면 비어서 검색이 불가능함을 알리고 메뉴로
 * >변경할 학생이름 입력받기
 * >해당 이름을 가진 학생이 있는지 조회하기
 * >>없다면 다시 입력받기
 * >>있다면 변경할 이름 입력받기
 * >>배열 안에 이미 이름이 있지 않은지 검사하기
 * >>>있다면 다시 입력받기
 * >>변경할 이름 값을 확인하기
 * >>>맞다면 저장하기
 * >>>아니라면 다시 입력받기
 * 
 * 메뉴에 없는 숫자입력
 * >메뉴 다시 선택 안내하기

[코드]

package class05;

import java.util.Scanner;

public class Test02 {
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("학생부 프로그램");
		
		int menu;//메뉴 선택
		String[] student = new String[5]; //학생의 이름을 저장하는 배열
		int cnt = 0; //저장된 학생의 수
		String name; //입력받은 학생이름
		String choice; //저장 전 확인하는 입력을 저장하는 변수
		boolean flag; //유효성검사 결과
		int num; //입력받은 번호 값
		String search;//검색결과
		
		//샘플데이터
//		student[0] = "샘플";
//		cnt = 1;
		
		while(true) {
			System.out.println("==========[메뉴]==========");
			System.out.println("1. 학생 추가");
			System.out.println("2. 학생부 보기");
			System.out.println("3. 이름으로 검색");
			System.out.println("4. 번호로 검색");
			System.out.println("5. 이름 변경");
			System.out.println("0. 학생부 프로그램 종료");
			System.out.println("=========================");
			
			System.out.print("메뉴 선택 >> ");
			menu = sc.nextInt();
			
			if(menu == 0) {//프로그램 종료
				System.out.print("정말 종료하시겠습니까? (Y/N) >> ");
				choice = sc.next();
				
				if(choice.equals("Y") || choice.equals("y")) {
					System.out.println("학생부 프로그램이 종료되었습니다.");
					break;
				}
			}
			
			else if(menu == 1) {//학생 추가
				//공간확인하기
				if(cnt == student.length) {//학생의 수가 배열의 길이와 같다면 == 더이상 저장할 자리가 없음
					System.out.println("더 이상 학생을 저장할 수 없습니다. ["+cnt+"/"+student.length+"]");
					continue;
				}
				
				//입력받기
				while(true) {
					System.out.print("등록할 학생 이름 입력 >> ");
					name = sc.next();
					

					System.out.print("["+name+"](으)로 저장하시겠습니까? (Y/N) >> ");
					choice = sc.next();
					
					//이름 확인하기
					if(choice.equals("Y") || choice.equals("y")) { //저장하겠다고 선택했다면
						//중복값 확인
						flag = false;//체크값 초기화
						for(int j = 0; j < cnt; j++) {
							if(name.equals(student[j])) {
								flag = true;//중복된 이름일 경우
								System.out.println("해당 이름으로 이미 등록된 학생이 있습니다.");
								continue;
							}
						}

						if(!flag) {//입력종료
							break;
						}
					}
				}
				//저장하기
				student[cnt] = name;
				cnt++;
				System.out.println(name+" 학생이 저장되었습니다. ["+cnt+"/"+student.length+"]");
			}
			
			else if(menu == 2) {//학생부 보기
				//저장된 값 확인
				if(cnt <= 0) {
					System.out.println("아직 등록된 학생이 없습니다.");
					continue;
				}
				
				System.out.println("[---------[학생부]---------]");
				for(int i = 0; i < cnt; i++) { //저장된 학생의 수만큼만 반복
					System.out.println("\t"+(i+1)+"번 "+student[i]);
				}
				System.out.println("[-------------------------]");
			}
			
			else if(menu == 3) {//이름으로 검색
				//저장된 값 확인
				if(cnt <= 0) {
					System.out.println("아직 등록된 학생이 없습니다.");
					continue;
				}
				
				System.out.print("검색어 입력 >> ");
				name = sc.next();
				
				//TODO 검색기능 추가 contains() : 대상 문자열에서 찾고자 하는 문자열이 포함되어있는지 여부를 알고 싶을때
				flag = false;
				search = "";//초기화
				for(int j = 0; j < cnt; j++) {
					if(student[j].contains(name)) {
						flag = true;
						search = "\t"+student[j]+"\n";
					}
				}
				
				if(flag) {
					System.out.println("[---['"+name+"' 검색결과]---]");
					System.out.print(search);
					System.out.println("[---------------------]");
				}
				else {
					System.out.println("일치하는 학생이 없습니다.");
				}
				
				
			}
			
			else if(menu == 4) {//번호로 검색
				//저장된 값 확인
				if(cnt <= 0) {
					System.out.println("아직 등록된 학생이 없습니다.");
					continue;
				}
				
				while(true) {
					System.out.print("조회할 학생의 번호 입력 >> ");
					num = sc.nextInt();
					
					if(!(0<=num && num<=cnt)) {
						System.out.println("유효하지 않은 번호입니다.");
						System.out.println("현재 학생이 "+cnt+"명 등록되어있습니다.");
					}
					
					else {
						System.out.println("[---["+num+"번 검색결과]---]");
						System.out.println("\t"+student[num-1]);
						System.out.println("[------------------]");
						break;
					}
					
				}
			}
			
			else if(menu == 5) {//이름 변경
				//저장된 값 확인
				if(cnt <= 0) {
					System.out.println("아직 등록된 학생이 없습니다.");
					continue;
				}
				while(true) {
					//변경할 학생 이름 입력받기
					System.out.print("변경할 학생 이름을 입력하세요. >> ");
					name = sc.next();
					
					boolean check = false;//저장성공하였는지 확인함
					
					//입력받은 학생 조회하기
					for(int i = 0; i <= cnt; i++) { //0~cnt-1까지는 배열 반복, cnt가 되면 값이 없음으로 판단함
						if(i != cnt) {
							//입력받은 이름 값의 학생이 존재한다면
							if(name.equals(student[i])) {
								while(true) {
									System.out.print("변경할 이름을 입력하세요. >> ");
									name = sc.next();
									
									//변경하려는 이름이 있지 않는지 검사하기
									flag = false;//체크값 초기화
									for(int j = 0; j < cnt; j++) {
										if(name.equals(student[j])) {
											flag = true;//중복된 이름일 경우
											System.out.println("해당 이름으로 이미 등록된 학생이 있습니다.");
											break;
										}
									}
									
									//새로 바꾸는 이름이 중복값이 없을 시 입력종료
									if(!flag) {
										break;
									}
								}
								//저장
								System.out.println(student[i]+"학생의 이름이 "+name+"으로 변경되었습니다.");
								student[i] = name;
								check = true;//저장됨
								break;//입력반복문 종료
							}
						}
						else {
							System.out.println("해당하는 학생이 없습니다.");
						}
					}
					
					if(check) {
						//값을 변경하였으므로 종료함
						break;
					}
				}
				

			}
			
			else {//유효성 검증
				System.out.println("올바르지 않은 입력값 입니다.");
				System.out.println("이용할 메뉴의 숫자를 입력해주세요.");
			}
			
		}
		
	}
}

 


 

[풀이 비교] (상단코드와 변수명 다름) 24.06.28.

*student = datas

 

[이름변경]

번호로 입력을 받으니 훨씬 코드가 간결하고 알아보기도 쉬워졌다.

그리고 변경 전과 동일한 이름인지, 중복되는 이름인지를 구분한 부분이 추가 되어 안내가 자세해졌다.

(코드 재활용으로 작성시간도 단축됨)

else if (menu == 5) { // 이름변경

		//경계값 검사
		if(cnt<=0) {//학생이 한 명도 있지 않다면
			//프로그램 처음으로 돌아감
			System.out.println("변경할 학생 데이터가 없습니다!");
			continue;
		}
		int num;
		while(true) {
			System.out.print("변경할 학생의 번호 입력 >> ");
			num = sc.nextInt();
			if(1<=num && num<=cnt) { 
				break;
			}
			System.out.println("올바른 번호를 입력해주세요!");
		}

		//사용자가 A를 변경하고 싶어한다
		System.out.println(num+"번 학생의 이름은 "+datas[num-1]+"입니다.");
				
		//B로 이름을 변경
		//정말 변경할지 확인
		String name;
		while(true) {
			System.out.print("변경할 이름을 입력해주세요 >> ");
			//이미 있는 이름과 변경 전 이름과 동일할 때 경우 멘트를 분리해주면 좋다
			name = sc.next();
					
			System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
			String answer = sc.next();
					
			if(answer.equals("Y")) {//제대로 입력했다면
						
				boolean flag = false;//학생부에 name이 없는 상태
				for(int i = 0; i< cnt; i++) {
					if(name.equals(datas[i])) {
						flag = true;
                              //구분해주면 좋다!
						if(name.equals(datas[num-1])) {//내 이전이름이면
							//이전이름이라 안됨
							System.out.println("변경 전 이름과 동일하여 변경이 불가합니다.");
						}
						else {//사용중인이름이라 안됨
							System.out.println("이미 존재하는 이름입니다.");
						}
					}
				}
						
				if(!flag) {//!이미저장되어있다면
					break;
				}
			}
		}
		//새로운 데이터를 입력한다는 점에서 create와 닮았다!!!
		//A자리에 B데이터 저장
		datas[num-1]=name;
	}

 

 

[이름검색]

훨씬 더 깔끔하게 정리 된 것 같다.

검색 결과가 ==== 안에 나오니까 아예 통으로 바꾸어 검색결과가 없다고 한 것보다 보기에도 더 좋은 것 같다.

실제 돌아가는 페이지에서도 해당 방식이니 그렇게 연습하는게 좋을 것 같다.

else if (menu == 3) {// 이름으로 검색
				
	//사용자로부터 검색어를 입력
	//이 검색어가 맞습니까는 묻지 않음! : 사용자가 하는 입력이 데이터에 변화를 주지 않기 때문이다.
	System.out.print("검색어 입력 >> ");
	String searchContent = sc.next(); //searchKeyword도 많이 사용함
				
	boolean flag = false; //검색결과가 없는 상태로 시작
				
	//학생부를 하나하나 확인하면서
	System.out.println("===================");
	for(int i = 0; i<cnt; i++) {
		//학생의 이름 안에 검색어가 있니?
		if(datas[i].contains(searchContent)) {//티모 안에 모가 있니?
			System.out.println(datas[i]);
			flag = true;
		}
		//있다면 출력
		//없다면 출력하지않음
	}
				
	//검색 결과가 없다면, 없다고 알려주기
	//1. 검색결과가 없다는 출력은 한 번만 수행하기 때문에 반복문 바깥에 있어야함
	//2. 검색결과가 없다는 사실은 검색을 다 해봐야 알 수 있음
	// ==>flag 로직 대표적인 케이스!!!
	if(!flag) {//만약에 검색결과가 없다면
		System.out.println("검색결과가 없습니다.");
	}
				
		System.out.println("===================");
				
	}