728x90
수업내용 정리 (Java)
1. 복습!
1-1) a 배열에서 짝수의 합과 홀수의 개수 출력
// 문제) a 배열에서 짝수의 합과 홀수의 개수 출력
int[] a = {45,78,54,48,6};
int a1 = 0;
int a2 = 0;
for(int i=0; i<a.length; i++) {
if(a[i]%2 == 0) {
a1 += a[i];
}else {
a2++;
}
}
- for문이 i가 a 배열의 크기보다 작을 동안 돌아간다.
- a 배열의 i번째 배열이 2로 나눴을 때 나머지가 없는 경우, a1에 i번째 배열의 값을 더한다.
- 그렇지 않을 경우, a2에 1씩 더한다.
1-2) 반복하면서 숫자를 입력받는데, 짝수만 b 배열에 저장하기. (*홀수만 입력 시 무한반복)
// 문제2) 반복하면서 숫자를 입력받는데 짝수만 b 배열에 저장하기 *홀수만 입력 시 무한반복
int[] b = new int[5];
for(int i=0; i<b.length; i++) {
System.out.print("숫자 입력> ");
int num = sc.nextInt();
if(num%2 == 0) {
b[i] = num;
}else {
i--;
}
}
- for문이 i가 b 배열의 크기보다 작을 동안 돌아간다.
- 숫자 하나를 한 변수에 저장해두고 그 변수가 2로 나눴을 때, 나머지가 0이라면 b 배열의 i번째 인덱스에 저장한다.
- 그렇지 않다면, i를 1씩 뺀다.
1-3) 인덱스를 한 칸씩 땡기기
// 고난이도 문제) 인덱스를 한 칸씩 땡기기
int[] a = {45,78,54,48,6};
// 내가 한 방법!
int num1 = a[0];
for(int i=0; i<a.length; i++) {
if(i == a.length-1) {
a[i] = num1;
}else {
a[i] = a[i+1];
}
}
- 변수를 하나 만들어 a의 0번째 인덱스 값을 저장해둔다.
- for문이 i가 a 배열의 크기보다 작은 만큼 돌아간다.
- for문을 마지막으로 돌릴 때 a 배열의 [i]번 인덱스에 변수에 저장해둔 값을 대입한다.
- 그렇지 않을 경우, a 배열의 i번째 인덱스에 i+1번째 인덱스 값을 대입한다.
// 선생님이 하신 방법 1
int temp = 0;
for(int i=0; i<a.length; i++) {
if(i==0) {
temp = a[i];
}else{
a[i-1] = a[i];
if(i == a.length-1) {
a[i] = temp;
}
}
}
- 변수를 하나 만들어둔다.
- for문이 i가 a 배열의 크기보다 작은 만큼 돌아간다.
- i가 0일때, 만들어둔 변수에 a의 i번 인덱스 값을 대입한다.
- 그렇지 않을때, a의 i-1번 인덱스에 i번 인덱스를 저장한다.
- 만약 i가 a 배열의 크기보다 1 작다면, a의 i번 인덱스에 변수 값을 대입한다.
// 선생님이 하신 방법 2
for(int i=1; i<a.length; i++) {
int temp = a[i];
a[i] = a[i-1];
a[i-1] = temp;
}
- for문이 i가 a 배열의 크기보다 작은 만큼 돌아간다.
- 변수 하나를 지정하면서 a의 i번 인덱스 값으로 초기화한다.
- a의 i번 인덱스에는 a의 i-1번 인덱스 값을 대입한다.
- a의 i-1번 인덱스에는 변수의 값을 대입한다.
2. 예제_sign
2-1) import
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy년MM월dd일 hh:mm:ss");
Scanner sc = new Scanner(System.in);
- DateTimeFormatter
날짜를 받아올 수 있다. - Scanner
콘솔창에서 입력받아올 수 있다.
2-2) 변수 선언
String[] name = new String[10]; // 이름
String[] id = new String[10]; // 아이디
String[] pw = new String[10]; // 비밀번호
String[] date = new String[10]; // 회원가입 날짜
int cnt = 0;
int loginIndex = -1;
- loginIndex: 의미없는 값 -1 / 인덱스 값을 담아야 하는데 인덱스는 0부터 시작하기 때문에
2-3) 기본 틀
while(true) {
System.out.println("========= 홈페이지 ==========");
if(loginIndex == -1) {
System.out.print("1.회원가입 2.로그인 3.회원목록 0.종료\n메뉴선택> ");
}else {
System.out.printf("1.정보수정 2.로그아웃 3.내정보(%s님) 0.종료\n메뉴선택> ",name[loginIndex]);
}
int menu = sc.nextInt();
if(menu == 1) {
if(loginIndex == -1) { // 회원가입
}else { //정보수정
}
}else if(menu == 2) { // 로그인
if(loginIndex == -1) {
}
}else { //로그아웃
}
}else if(menu == 3) { // 회원목록
if(loginIndex == -1) {
}
}else { //내정보
}
}else if(menu == 0) { // 종료
break;
}
System.out.println();
}
System.out.println("프로그램 종료");
- 메뉴는 0부터 3까지 있다.
- 로그인 시 메뉴가 바뀐다.
- 0은 종료이기 때문에 break;를 넣어 while문을 나간다.
2-4) 메뉴 선택에서 1을 입력
- 로그인 상태가 아닐 때, 회원가입
System.out.println("=====> 회원 가입");
System.out.print("회원가입 할 이름을 입력해주세요.\n이름 입력> ");
name[cnt] = sc.next();
System.out.print("회원가입 할 아이디를 입력해주세요.\n아이디 입력> ");
id[cnt] = sc.next();
System.out.print("회원가입 할 비밀번호를 입력해주세요.\n비밀번호 입력> ");
pw[cnt] = sc.next();
String now = dtf.format(LocalDateTime.now());
date[cnt] = now;
System.out.println("\n"+name[cnt]+"님 회원가입을 축하드립니다.");
cnt++;
- 이름, 아이디, 비밀번호를 각각 name, id, pw의 cnt번 인덱스에 넣고, 저장한 시각을 String now를 통해 date의 cnt번 인덱스에 저장한다.
- 저장이 완료되면 cnt를 1씩 추가한다.
- 로그인 상태일 때, 정보수정
System.out.print("1.아이디 변경 2.비밀번호 변경\n메뉴 선택> ");
int menu2 = sc.nextInt();
if(menu2 == 1) {
System.out.println("수정할 아이디를 입력해주세요.");
System.out.print("수정할 아이디> ");
id[loginIndex] = sc.next();
}else if(menu2 == 2) {
System.out.println("수정할 비밀번호를 입력해주세요.");
System.out.print("수정할 비밀번호> ");
pw[loginIndex] = sc.next();
}
- 아이디를 변경할건지, 비밀번호를 변경할건지 메뉴를 선택받는다.
- 1일 경우, id 배열의 loginIndex번 인덱스의 아이디를 입력받은 값으로 대입한다.
- 2일 경우, id 배열의 loginIndex번 인덱스의 비밀번호를 입력받은 값으로 대입한다.
2-5) 메뉴 선택에서 2을 입력
- 로그인 상태가 아닐 때, 로그인
System.out.println("=====> 로그인");
System.out.print("아이디 입력> ");
String inId = sc.next();
System.out.print("비밀번호 입력> ");
String inPw = sc.next();
boolean find = false; // 기억할 것!
for(int i=0; i<cnt; i++) {
if(inId.equals(id[i]) && inPw.equals(pw[i])) {
System.out.println("로그인 성공!");
loginIndex = i;
find = true;
break;
}
}
if(!find) {
System.out.println("로그인 실패..");
}
- 아이디와 비밀번호를 각각 inId, inPw에 입력받는다.
- boolean 타입을 이용해 false를 지정해둔다.
- for문이 i가 cnt보다 작을 동안에 돌아간다.
- 만약 inId와 inPw가 id와 pw의 i번 값과 같다면, 로그인 성공! 을 출력한다.
- loginIndex에 i 값을 대입한다.
- find는 true를 대입한다.
- break를 걸어서 for문을 빠져나간다.
- !find
- 로그인 상태일 때, 로그아웃
System.out.println("로그아웃이 성공적으로 완료됐습니다.");
loginIndex = -1;
- 로그아웃이 완료됐다는 말을 출력한다.
- loginIndex에 -1를 대입한다.
2-6) 메뉴 선택에서 3을 입력
- 로그인 상태가 아닐 때, 회원목록
System.out.println("=====> 회원 목록");
System.out.println("이름\t아이디\t비밀번호\t가입일\n===================================");
for(int i=0; i<cnt; i++) {
System.out.printf("%s\t%s\t%s\t%s\n",
name[i], id[i], pw[i], date[i]);
}
- 이름, 아이디, 비밀번호, 가입일 순으로 출력한다.
- 로그인 상태일 때, 내정보
System.out.println("=====> 회원 정보");
System.out.println("이름\t아이디\t비밀번호\t가입일\n===================================");
System.out.printf("%s\t%s\t%s\t%s\n",
name[loginIndex], id[loginIndex], pw[loginIndex], date[loginIndex]);
- name, id, pw, date의 loginIndex번 인덱스 값만 출력한다.
질문한 내용이나 어려웠던 점 메모
1. 2-5) boolean을 이용한 코드
boolean find = false;
for(int i=0; i<cnt; i++) {
if(inId.equals(id[i]) && inPw.equals(pw[i])) {
System.out.println("로그인 성공!");
loginIndex = i;
find = true;
break;
}
}
if(!find) {
System.out.println("로그인 실패..");
}
- !find 다시 물어볼것
- 내가 했던 방법은 마지막 반복일 때 아이디와 비밀번호가 일치하지 않다면 로그인 실패를 띄우게 하는 방법이었는데, 오늘 다시 해보니 1, 3번째는 되는데 2번째 아이디와 비밀번호로 로그인 시도 시 맞게 했는데도 로그인 실패가 떴다. 내 계산대로라면 되어야 할 텐데 안 되어서 해결은 나중에 하더라도 이 방법을 외우는 것이 나을 것 같다. 이해가 어렵다면 일단 이해하기 전에 외우기!
전체 피드백
728x90
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 9일차 (23/09/26) - Java (0) | 2023.09.26 |
---|---|
수업일지 8일차 (23/09/25) - Java (0) | 2023.09.25 |
수업일지 6일차 (23/09/21) - Java (0) | 2023.09.21 |
수업일지 5일차 (23/09/20) - Java (0) | 2023.09.20 |
수업일지 4일차 (23/09/19) - Java (0) | 2023.09.19 |