코딩항해기
[실습/JAVA] 출석부 프로그램 만들기 (+풀이 0628) 본문
배열에 대해 공부하기 위해 출석부 프로그램 만들기 실습을 진행하였다.
(풀이 비교 추가함 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("===================");
}
'problem solving > 과제&실습 코딩' 카테고리의 다른 글
[과제/코드업/JAVA] 1360 : 숫자 피라미드 2 (0) | 2024.06.28 |
---|---|
[과제/JAVA] 별찍기 추가 (0) | 2024.06.28 |
[실습/JAVA] 입력받은 정수 총합, 평균 구하기 (0) | 2024.06.25 |
[과제/JAVA] 배열 최댓값·최솟값 구하기, 역순·반복 출력하기 (0) | 2024.06.20 |
[과제/JAVA] 별찍기 (0) | 2024.06.19 |