- 숙제_내가푼_오답
// 문제) 배열 num의 값을 앞으로 한칸씩 땡기시오
// 출력 예) {2,3,4,5,6,7,8,9,10,1}
int num[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int num1 = num[0];
for (int i = 0; i < num.length; i++) {
if (i == 0) {
i = i+1;
}
System.out.println(num[i]);
}
System.out.println(num1);
}
> 배열의 이해를 도와주는 숙제 풀었지만 오답임...
> for문 밖에 변수를 하나 만들고 0 번째 배열 칸에 있는 1을 대입함
> 이후 for문에서 i+1을 함으로 배열 num[]이 한칸 밀려서 출력하게함
> for문밖에서 num[0]을 넣어둔 num1을 출력하여 붙여넣기
> 풀다가 짜증나서 이렇게 만들고 껏음
- 숙제_정답
// 문제) 배열 num의 값을 앞으로 한칸씩 땡기시오
// 출력 예) {2,3,4,5,6,7,8,9,10,1}
int num[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int num1 = num[0];
for (int i = 0; i < num.length; i++) {
if (i == num.length - 1) {
num[i] = num1;
break;
}
num[i] = num[i + 1];
}
for(int i = 0; i<num.length ; i++) {
System.out.println(num[i]);
}
> 이번 문제를 이해하기 위해서는 num.length를 이해해야함
> num.length는 쉽게 말해서 배열의 칸 갯수를 뜻합니다
> 칸 갯수는 10개이지만 번호는 0번부터 시작합니다
> 변수 i는 방번호역활을 하기 때문에 i가 num.length 와 같아져 버리는 경우
> i가 10까지 증가합니다 num.length는 10이지만 0~9까지의 10이기 떄문에
> 없는 방번호를 가져오는 경우이기 때문에 실행은 가능하지만 마지막에 에러코드를 띄우게 됩니다
> 그렇기에 i를 0부터 9까지만 증가시키게하는 것입니다
> 이걸 이해하지 못하면 풀수 없는 문제입니다!!
> 그렇기에 for문을 작성하고 if문으로 i가 num.length-1과 같아지는 경우
> 즉 9와 같아지는 경우 9까지 증가한 i를 num[i]에 넣고 이후 num1을 대입합니다
> num1에는 num[0]를 대입해두었기 때문에 해석하면 num[9]에 있던 10이 num[0]에 있던 1로 바뀝니다
> break는 9인 i에 0을 대입했기 떄문에 조건이 불충되며 다시 반복하는것을 막기 위함입니다
> 아래에서는 num[i]=num[i+1]로 (num[0] = num[0+1])로 한칸씩 대입하며 당켜주었기 때문에
> 밖에있는 for문을 이용하여 출력하면 당겨진 배열이 출력되는것을 확인할 수 있습니다
```
- 숙제_응용
// 10을 앞으로 당겨 출력하기
int num[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int num1 = num[9];
for (int i = 9; i >= 0; i--) {
if(i == 0) {
num[i] = num1;
break;
}
num[i] = num[i-1];
}
for(int i = 0; i<num.length ; i++) {
System.out.println(num[i]);
}
}
> 위의 문제를 이해했다면 정말 쉽게 풀이가 가능합니다
> for문의 조건이 중요한 문제입니다
> i에 9를 넣고 i가 0보다 크거나 같다면으로 0까지 뺼 수 있게해줍니다
(i에 9를 넣는 이유는 배열의 칸 번호 역활을 하는 i이기 떄문입니다 )
> 이후 if문에 i가 0과 같다면 num[i]에 num1을 대입하여 빠져나오게합니다
> 반복문을 반복하며 num[i]에 num[i-1]로 수를 대입하며 앞으로 당겻기 때문에
> 아래 for문으로 출력을 진행하면 num[9]에 있던 10이 맨앞으로 와진걸 확인할 수 있습니다
- 성적표_프로그램
!!성적표를 등록하고 리스트를 불러와 확인하는 프로그램 !!
Scanner sc = new Scanner(System.in);
String[] name = new String[5];
int[] kor = new int[5];
int[] eng = new int[5];
int[] mat = new int[5];
int[] total = new int[5];
double[] avg = new double[5];
char[] grade = new char[5];
int cnt = 0;
사용자가 작성한 기록을 저장하기 위한 배열과 배열의 번호 역활을 해줄 변수를 지정
while(true) {
System.out.println("====성적 시스템====");
System.out.println("1.성적등록 2.리스트 0.종료");
System.out.print("메뉴선택 >");
int menu = sc.nextInt();
반복문 while에 true를 넣어 계속 반복하게 만들었고
사용자에게 기능의 번호와 선택할 수 있는 칸을 만들었음
사용자가 입력한 메뉴 번호는 변수 menu에 대입하였음
if(menu == 1) {
System.out.print("이름입력 >");
name[cnt] = sc.next();
System.out.print("국어점수 입력 >");
kor[cnt] = sc.nextInt();
System.out.print("영어점수 입력 >");
eng[cnt] = sc.nextInt();
System.out.print("수학점수 입력 >");
mat[cnt] = sc.nextInt();
total[cnt] = kor[cnt] + eng[cnt] + mat[cnt];
avg[cnt] = total[cnt] /3f;
if(avg[cnt] <= 90) {
grade[cnt] = 'a';
}else if(avg[cnt] <= 80) {
grade[cnt] = 'b';
}else if(avg[cnt] <= 70) {
grade[cnt] = 'c';
}else if(avg[cnt] <= 60) {
grade[cnt] = 'd';
}else {
grade[cnt] = 'f';
}
System.out.println("성적등록 완료!");
cnt++;
> 주요기능인 1번만 확인을하고 넘어가겠음
> 사용자가 각정보를 작성할 공간을 프린트해줌
> 각작성 정보는 위에서 지정한 배열에 각각 대입함
> 토탈 점수와 평균을 계산하는 식을 만들고 각배열에 대입함
> 조건문 if를 이용하여 각평균 이상이라면 해당 학점이 해당 배열에 대입되게만듬
> 맨처음 cnt에 0을 대입했기 때문에 처음 작성한 정보들은 각 배열의 0번에 저장됨
> 각 배열의 번호는 cnt로 작성하기 때문에 메뉴1의 조건문을 빠져나가기 전에
> cnt를 1 증가시킨 모습
> 이로 다음에 조건문에 다시 진입하면 cnt는 1로 바뀌고 새로 작성한 정보들은 1 다시 빠져나가며
> cnt가 증가함으로 이러한 메커니즘으로 저장할 배열들의 칸번호를 지정하게 만듬
}else if(menu == 2) {
System.out.println("이름\t국어\t영어\t수학\t평균\t학점\t");
System.out.println("-------------------------------------------");
for(int i = 0 ; i<cnt ; i++) {
System.out.printf("%s\t%d\t%d\t%d\t%d\t%.2f\t%c\n",name[i],kor[i],eng[i],mat[i],total[i],avg[i],grade[i]);
}
}else if(menu == 0) {
break;
}else {
}
}
- 로그인_기능_응용
while (true) {
System.out.println("====회원가입====");
System.out.println("1.회원가입 2.로그인 3.리스트 0.종료");
System.out.print("메뉴 선택 >");
int menu = sc.nextInt();
> 메뉴창은 계속 띄워야하기 때문에 반복문 while에 true를 넣어줌
> 사용자가 메뉴와 입력위치를 알 수 있게 프린트해줌
> 사용자가 작성한 메뉴를 변수 menu에 대입함
if (menu == 1) {
System.out.print("이름 입력 >");
name[cnt] = sc.next();
System.out.print("아이디 입력 >");
id[cnt] = sc.next();
System.out.print("비밀번호 입력 >");
pw[cnt] = sc.next();
System.out.println("회원가입 성공!");
cnt++;
> 입력 menu가 1번과 같다면 해당 조건문 실행
> 가입을 위한 정보를 작성할 위치를 프린트하고
> 입력받은 정보를 각각의 배열에 대입하게 만듬
> 배열의 번호칸 역활을 해주는 cnt는 마지막에 1증가하게하여
> 조건문을 빠져나가기 전에 다음 저장공간으로 넘어가게 만듬
} else if (menu == 2) {
System.out.print("아이디 입력 >");
String id1 = sc.next();
System.out.print("비밀번호 입력 >");
String pw1 = sc.next();
for (int i = 0; i < cnt; i++) {
if (id1.equals(id[i]) && pw1.equals(pw[i])) {
System.out.println(name[i] + "님 로그인 성공!");
fa = 0 ;
}
}
if(fa == 0) {
fa = 1;
}else if(fa > 0) {
System.out.println("로그인 실패");
}
> 이렇게 입력받아 저장한 배열에 있는 정보를 가져오는 방법을 알아보기위해
> 만든 프로그램이라고 할 수 있음
> 먼저 사용자가 로그인할 아이디를 작성할 공간을 만들고
> 마찬가지로 비밀번호도 받아줌
> 각정보는 id1과 pw1에 저장했음
> 이렇게 작성받은 정보가 배열에 저장된 정보와 맞는지 확인하기위해
> for문으로 i가 1씩 증가하며 대조하게 만듬
> 대조 방법은 if문으로 조건을 걸어 확인함
> 회원가입할때 입력받은 배열 id pw의 번호는 cnt하나만 사용했기에 같을 수 밖에 없기 때문에
> 1씩 증가하는 i를 넣어 열어보게만들고
> if문을 이용하여 대조했을때 입력받은 정보가 맞다면 로그인 성공을 출력하고
> 맞는 정보가 없다면 로그인 실패가 프린트되도록 설정함
>여기서 cnt보다 작을때까지 i를 1씩 증가시키는 이유는
>메뉴1번의 if문의 마지막에 cnt가 1씩 증가하기 때문임
>만약 회원가입을 1번하면 cnt가 1이되고 한번더하면 2가되기 때문임
>배열의 칸번호는 0부터 시작이기 때문에 i가 cnt보다 작아야하는게 맞음 아무튼 맞음 이해못하면 니잘못
- 로그인_기능_응용_정답
!! 이번 문제의 의도는 배열에 저장한 정보를 가져오는 방법을 알아보는 것이기 때문에
!! 메뉴 2번의 다른 방법만 알아보겠읍니다
>변수 boolean을 사용한 방법입니다
else if (menu == 2) {
System.out.print("아이디 입력 >");
String id1 = sc.next();
System.out.print("비밀번호 입력 >");
String pw1 = sc.next();
boolean op = false;
for (int i = 0; i < cnt; i++) {
if (id1.equals(id[i]) && pw1.equals(pw[i])) {
System.out.println(name[i] + "님 로그인 성공!");
op = true ;
}
}
if(!op) {
System.out.println("로그인 실패");
}
> 배열에 있는 값을 대조하는 방법은 똑같습니다
> 변수 boolean은 참과 거짓만 대입할 수 있습니다
> 때문에 boolean에 false를 넣어주고
> 입력 정보가 배열에 있는 정보와 맞다면 boolean을 true로 대입해줍니다
> 입력 정보가 배열의 정보와 하나도 맞는것이 없어서 for문을 빠져나오면
> 조건문 if로 넘어가 boolean이 true가 아닐때 "로그인 실패"를 프린트합니다
============================================================================================
2번째는 for문 안에서 정보가 맞지 않다면 "로그인 실패"를 출력하게 하는 방법입니다
} else if (menu == 2) {
System.out.print("아이디 입력 >");
String id1 = sc.next();
System.out.print("비밀번호 입력 >");
String pw1 = sc.next();
for (int i = 0; i < cnt; i++) {
if (id1.equals(id[i]) && pw1.equals(pw[i])) {
System.out.println(name[i] + "님 로그인 성공!");
break;
}else if( i ==cnt-1) {
System.out.println("로그인 실패");
}
}
> 이번에도 입력정보와 배열에 있는 정보를 대조하는 방법은 똑같습니다
> 하지만 입력정보와 배열의 정보가 맞다면 break;를만나 for문을 빠져나가고
> 맞지 않다면 i가 cnt-1과 같을때 "로그인 실패"를 프린트합니다
> i가 cnt -1과 같아졌다는 말은 배열의 모든 정보를 확인했다는 말이됩니다
> 같아졌는데도 if문이 아닌 else if로 내려왔다는 말은 맞는 정보가 없다는 말과 같습니다
- 계좌이체_프로그램_만들기
!! 메뉴 4번을 중요하게 살펴보기 너무 길기 때문에 따로 풀이를 진행하지 않음 !!
!! 이해못하는 부분이 있다면 글을 처음부터 다시 읽어보고 공부해야함 !!
Scanner sc = new Scanner(System.in);
String[] name = new String[100];
String[] account = new String[100];
String[] date = new String[100];
int[] balance = new int[100];
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm");
int cnt = 0;
int index = 0;
int index1 = 0;
while (true) {
System.out.println("====인천일보은행====");
System.out.println("1.계좌생성 2.입금 3.출금 4.계좌이체 5.계좌 목록 0.종료");
System.out.print("메뉴선택 >");
int menu = sc.nextInt();
System.out.println("");
if (menu == 1) {
System.out.print("예금주명 >");
name[cnt] = sc.next();
System.out.print("계좌 번호 >");
account[cnt] = sc.next();
System.out.print("초기입금 금액 >");
balance[cnt] = sc.nextInt();
LocalDateTime now = LocalDateTime.now();
date[cnt] = dtf.format(now);
System.out.println(name[cnt] + "님 계좌가 계설되었습니다!");
cnt++;
} else if (menu == 2) {
System.out.print("입금 계좌 >");
String dAccount = sc.next();
System.out.print("입금 금액 >");
int depposit = sc.nextInt();
for (int i = 0; i < cnt; i++) {
if (dAccount.equals(account[i])) {
balance[i] += depposit;
System.out.println("입금 완료!");
break;
} else if (i == cnt - 1) {
System.out.println("잘못된 계좌입니다");
}
}
} else if (menu == 3) {
System.out.print("출금 계좌 >");
String wAccount = sc.next();
System.out.print("출금 금액 >");
int withdraw = sc.nextInt();
boolean accountCheck = false;
for (int i = 0; i < cnt; i++) {
if (wAccount.equals(account[i])) {
if (balance[i] >= withdraw) {
balance[i] -= withdraw;
System.out.println("출금 완료");
} else {
System.out.println("잔액부족");
}
accountCheck = true;
break;
}
}
if (!accountCheck) {
System.out.println("잘못된 계좌 번호입니다");
}
} else if (menu == 4) {
int fa = 0;
System.out.print("출금 계좌 >");
String wAccount = sc.next();
System.out.print("입금 계좌 >");
String dAccount = sc.next();
System.out.print("이체 금액 > ");
int money = sc.nextInt();
for (int i = 0; i < cnt; i++) {
if (wAccount.equals(account[i])) {
index = i;
}
if (dAccount.equals(account[i])) {
index1 = i;
} else if (i == cnt - 1) {
System.out.println("계좌 확인 필요");
fa = 1;
break;
}
}
if (balance[index] >= money && fa == 0) {
balance[index] -= money;
balance[index1] += money;
System.out.println("이체 성공!\n");
System.out.println(name[index] + "님 계좌 잔액은" + balance[index] + "입니다1");
System.out.println(name[index1] + "님 계좌 잔액은" + balance[index1] + "입니다2");
} else if (!(balance[index] >= money )&& fa == 0) {
System.out.println("잔액이 부족합니다\n");
}
} else if (menu == 5) {
System.out.println("이름\t계좌번호\t계좌잔액\t계좌생성일\t");
System.out.println("---------------------------------");
for (int i = 0; i < cnt; i++) {
System.out.printf("%s\t%s\t%,d\t%s\n", name[i], account[i], balance[i], date[i]);
System.out.println("");
}
} else if (menu == 0) {
break;
} else {
System.out.print("다시 입력");
}
}
System.out.println("프로그램 종료");
}
}