package class01;
import java.util.Scanner;
// 프로그램
// 요구사항
// 프로그램에서 모든 요구사항은 CRUD로 귀결됩니다.
// 데이터
// create 생성 회원가입
// read 출력 게시글 검색
// update 변경 프로필사진 변경 글변경
// delete 삭제 회원탈퇴 글삭제
// 상품 구매 >> 사용자가 해당 상품을 구매했다는 사실이 기록
// >> 이 상품의 판매량이 증가
//CRUD, 비즈니스 메서드, 비즈니스 로직, 핵심 로직, 핵심 관심
// "학생부 프로그램"
//사용자의 첫번쨰 요사사항
// 1.최대 5명까지 저장할 수 있는 학생부가 있습니다.
// 2. 학생부 프로그램을 작성해세요
// 개발자와의 1차 요구사항 회의를 통해
// C: 학생을 추가 (동명이인 없다)
// R: 학생부를 전체출력/학생이름으로 검색 >>> selectAll, getAll
// R: 1번 학생 이름출력 >>> selectone,getOne
// ** 같은 R여도 All 이 있고,one이 있다
// U: 학생의 이름 변경
//(그래서 D를 하는 프로그램에서는 배열을 스지 않는다)
//-------------------
// 개발자는 제작할 때
//1. 샘플 데이터를 확보
// ex)학생이 존재한다고 가정하고,
// R(selectAll)부터 제잘
//===>임의의 데이터를 생성해놓고, 잘 출력이 되는지 확인
//(3. c부터 제작을해서, 생성한 데이터 공간에 다른 데이터가 잘 추가되는지 확인)
//내가 이름을 추가할때,
//만약 이름이 이미 저장되어있다면,
//다시 이름을 입력받도록
//1.flag알고리즘(로직)
//>> 어떤
public class Test01 {
public static void main(String[] args) {
String[] datas = new String[5];
Scanner sc=new Scanner(System.in);
System.out.println("학생부 프로그램");
datas[0] = "티모";
int 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("메뉴 입력 >> ");
int menu=sc.nextInt();
if(menu==0) {
System.out.println("프로그램이 종료됩니다.");
break;
}
else if(menu==1) {// 학생추가
if(cnt >= datas.length) { // 저장할 수 있는 최대로 이미 저장이 되어있는 경우라면
System.out.println("더 이상 데이터를 저장할수 없습니다");
continue;
}
// 정말____으로 하시겠습니까?
String name;
while(true) {
System.out.println("저장하고 싶은 학생의 이름을 입력해주세요"); // 사용자 이름입력
name = sc.next();
System.out.println("정말" +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])) {//저장하려는 이름이 이미 존재한다면
// 사용자가 입력한 name값이
// 학생부 데이터와 일치합니까?
// 학생부에 name이 있는 상태
flag=true;
System.out.println(name + "은(는) 이미 존재하는 이름입니다."
);
}
}
if(!flag) { // 만약 저장되어있지 않다면 == !(학생부에 저장되어 있다면)
break;
}
}
}
// 현재 들어갈 위치
datas[cnt]=name;// 데이터를 배열에 저장하는 기능
cnt++;
System.out.println("name이 저장되었습니다!");
}
else if(menu==2) {// 학생부 전체출력
// cnt <=0 ** 좋은 코드
// 악의적으로 접근하려는 것을 차단
// 유효성 검사는 더 넓은 범위로 꼼꼼하게
if(cnt <=0) { // 보여줄 데이터가 없다면 == 저장된 데이터가 없음
System.out.println("보여줄 학생 데이터가 없습니다.");
continue; //다시 반복문의 처음으로 이동;
}
// 1번 부터 저장된 학생수 만큼 출력
System.out.println("====학생 목록 ====");
for(int i = 0; i<cnt; i ++) { // ***i<cnt -> 저장된 수만큼
System.out.println((i+1)+"번 학생: " + datas[i]);
}
System.out.println("=================");
}
else if(menu==3) {// 이름으로 검색
//검색어를 입력 >>
// 이 검색어가 맞습니까? xxxx : 사용자가 하는 입력이 데이터에 변화를 주지 않기 때문에
System.out.println("검색어 입력 >>>");
String searchContent = sc.next(); //searchKeyword
boolean flag = false; // 검색결과가 없는 상태로시작
// 학생부를 하나하나 확인하면서
System.out.println("================");
for(int i=0; i<cnt ; i++) {
// 학생의 이름안에 검색어가 있나? ===> 티모 == 모xxx티모안에 모가 있니?
if(datas[i].contains(searchContent)) { // 티모안에 모가 있니?
System.out.println(datas[i]);
flag=true;
}
// 있다면, 출력
// 없다면 ,출력a x
}
if(!flag) { // 검색결과가 없다면
System.out.println("검색결과가 없습니다...");
}
// 검색 결과가 없다면, 없다고 알려주기
// 1. 검색 결과가 없다는 출력은 한번만! 수행하기 때무에반복문 바깥에 있어야함
// 2.검색 결과가 없다는 사실은 검색을 다! 해봐야알수 있음
// ====>flag 로직 대표적인 케이스!
System.out.println("================");
}
else if(menu==4) { // 번호로 검색 -> PK로 검색 == selectOne(getOne)
// PK
// primary key : "데이터를 '식별'"할 수있게 해주는 값
// 예) 주민번호, 학번, ...
// 사용자가 지정하는 것이 아니라,프로그램에서 부여하는 값
// 현재 학생부 프로그램에서는 '번호' == PK
// 경계값 검사란?
//
// 조건식에 들어가있는 변수들이
// 경계에 닿아있는 숫자들이어도
// 해당 조건식이 유효한지 확인하는 것
//
// 1<=num && num<=cnt
//
// cnt --->> 1보다 반드시 크거나 같아야함!
// cnt가 0일수있어?
// ㅇㅇ 가능함
// 경계값 검사
if(cnt <= 0){// 학생이 한명도 저장되어있지 않면
System.out.println("검샐할 학생 데이터가 없습니다!");
continue; // 프로그램 처음으로 돌아가
}
int num;
while (true) {
System.out.println(("검샐할 학생의 번호 입력 >>"));
num = sc.nextInt();
// 사용자가 검색하고 싶은 번호를 입력 : 유효성 검사
if(1<=num && num <= cnt) { // 제대로 입력했다면 // 경계값 검
break;
}
System.out.println("올바른 버호를 입력해주세요~!!");
//제대로 입력하라고 안내문구 출력
}
System.out.println(num +"번 학생의 이름은" + datas[num-1]+ "입니다.");
//사용자가 입력한 번호에해당하는 학생의 이름은
//datas[num-1]입니다.
}
else if(menu==5) { // 이름변경
// UPDATE : update 처리할 대상 데이터가 특징되어있어야함!
// ex) 프로필 사진 변경, 닉네임 변경
// 변경할 학생의 번호 입력 >> oooo
// 선례, 시장 조사를 안한 케이
// 이름을 변경할 학생의 이름 입력 >> xxx
// 개발자는 잘 카피해야함
// 이름을 변경할 학생의 번호 입력 >>
// PK로 데이터를 특정한 후에 UPDATE를 진행해야
if(cnt <= 0 ){// 학생이 한명도 저장되어있지 않면
System.out.println("검샐할 학생 데이터가 없습니다!");
continue; // 프로그램 처음으로 돌아가
}
int num;
while (true) {
System.out.println(("검샐할 학생의 번호 입력 >>"));
num = sc.nextInt();
if(1<=num && num <= cnt) { // 제대로 입력했다면 // 경계값 검
break;
}
System.out.println("올바른 번호를 입력해주세요~!!");
}
//PK로 대상 특정짓는다는 부분이 selectOne와 닮을 수밖에 없다
// 사용자가 A를 변하고 싶어한다.
System.out.println(num + "번 학생의 이름은" + datas[num-1]+"입니다");
// B로 이름을 변경
// 정말 변경할 지 확인
String name;
while(true) {
System.out.println("변경할 이름을 입력해주세요. >>"); // 사용자 이름입력
name = sc.next();
System.out.println("정말" +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])) {//저장하려는 이름이 이미 존재한다면
// 사용자가 입력한 name값이
// 학생부 데이터와 일치합니까?
// 학생부에 name이 있는 상태
flag=true;
// if(num-1 == i) { 내 이전 이름이
// 이전 이름이라 안됨
//
// }else {
// 이미 사용중인 이름입니다....
// }
System.out.println(name + "은(는) 이미 존재하는 이름입니다."
);
}
}
if(!flag) { // 만약 저장되어있지 않다면 == !(학생부에 저장되어 있다면)
break;
}
}
}
// 새로운 데이터를 입력한다는 점에서 create와 닮아 있다
// A자리에 B 데이터 저장
datas[num-1]=name;
}
else { // 유효성 검사
System.out.println("제대로 입력해주세요~~");
}
}
}
}