오늘은 while, do ~ while에 대해 배워보겠습니다.
목차 | |
1. | while |
2. | printf |
3. | do ~ while |
4. | 다중 for문 |
5. | 예제 문제 |
6. | 느낀점 |
1. while
/* while문
* 횟수가 일정하지 않을 경우 사용
* while(조건식) {
* 실행문;
* }
* while문은 반드시 실행문 안에 조건식이 false가 될 수있는 식을 포함해야 함.
*/
// 1 ~ 10까지 출력
for (int i = 1; i <= 10; i++) {
System.out.print(i + " ");
}
System.out.println();
//while
int i = 1; // 사용할 변수 미리 초기화
while(i <= 10) { // true가 되어야 실행
System.out.print(i + " ");
i++;
}
System.out.println();
while문에서 사용할 변수는 for문과 다르게 변수를 while 밖에서 호출을 하기에 다른 while문에 사용할 변수는 그 전에 쓰인 변수와는 다른 이름으로 하거나 변수의 값을 초기화해야 합니다.
(1) 짝수 출력하기
// while문을 이용한 1 ~ 10까지의 짝수 출력
i = 1;
while (i <= 5) {
System.out.print((i * 2) + " ");
i++;
}
System.out.println();
// if문을 활용한 다른 방법
// i = 1;
// while (i <= 10) {
// if (i % 2 == 0) {
// System.out.print(i);
// }
// i++;
// }
/* 1 ~ 50까지의 짝수
* 출력값은 아래의 예시처럼 표시해야함
* 2 4 6 8 10
* 12 14 16 18 20
* ...
* 42 44 46 48 50
*/
int i = 1;
while(i <= 25) {
System.out.print((i * 2) + " ");
if ((i * 2) % 10 == 0) {
System.out.println();
}
i++;
}
2. printf
/* println : 줄바꿈이 있는 출력
* print : 줄바꿈이 없는 출격, 출력값이 없으면 error <- System.out.print();
* printf : 지시자를 이용한 출력
*
* 지시자
* %d(정수형), %f(실수형), $c(문자), %s(문자열), %n(줄바꿈)
* 소수점 설정 가능. 공백 추가 가능
*/
System.out.printf("%.2f%n", 1.6666666666);
int num1 = 5;
int num2 = 3;
// 5 + 3 = 8
System.out.println(num1 + " + " + num2 + " = " + (num1 + num2));
System.out.printf("%d + %d = %d%n", num1, num2, (num1 + num2));
3. do ~ while
/* do {
* 실행문;
* } while(조건식);
*
* - 실행문을 먼저 실행하고, 조건식을 비교하여 반복을 결정하는 구조
* - for, while문은 조건식을 먼저 비교하기 때문에 조건식 false면 한 번도 실행되지 않을 수 있음.
* - do ~ while문은 무조건 1번은 거치고 난 후 비교.
*/
Scanner scan = new Scanner(System.in);
// 한 글자 입력 후 출력, y를 입력하면 종료
char ch = 'a';
do {
System.out.println("한 글자 입력 > ");
ch = scan.next().charAt(0);
System.out.println(ch);
} while(ch != 'y');
System.out.println("종료~!!");
scan.close();
do 안에 있는 변수(지역변수)는 while이 인지하지 못하기에 do ~ while에서 변수를 사용한다면 괄호 밖에서 변수를 선언하는 것이 편합니다.
(1) 메뉴 구성하기
/* 메뉴 구성
* do ~ while()문은 많이 사용함.
* menu
*/
Scanner scan = new Scanner(System.in);
int menu = 0;
do {
System.out.println("--menu--");
System.out.println("1.저장하기|2.새로만들기|3.종료하기");
System.out.println("menu >>");
menu = scan.nextInt();
switch(menu) {
case 1:
// 실제 기능 처리
System.out.println("저장되었습니다.");
break;
case 2:
System.out.println("새로만들었습니다.");
break;
case 3:
System.out.println("종료합니다.");
break;
default:
System.out.println("잘못된 메뉴");
}
}while(menu !=3);
System.out.println("종료!");
scan.close();
(2) 계산기 만들기
/* 숫자 2개를 입력 받고, 메뉴를 출력
* menu
* 1.+ | 2.- | 3.* | 4./ | 5.% | 6.종료
* menu에 따라서 두 수의 연산 결과를 출력
* num1 = 5 num2 = 3
* 1 => 5 + 3 = 8
* 2 => 5 - 3 = 2
*/
Scanner scan = new Scanner(System.in);
// 정수 입력
System.out.println("정수 2개를 입력해주세요.");
int num1 = scan.nextInt();
int num2 = scan.nextInt();
int menu = 0;
do {
System.out.println("--menu--");
System.out.println("1.+ | 2.- | 3.* | 4./ | 5.% | 6.종료");
menu = scan.nextInt();
int res = 0;
char op = ' ';
if (((menu == 4) || (menu == 5)) && num2 == 0) { // 0으로 나누려할 시
System.out.println("0으로 나눌 수는 없습니다.");
} else if (menu >= 1 && menu <= 6) {
switch(menu) {
case 1:
res = num1 + num2;
op = '+';
break;
case 2:
res = num1 - num2;
op = '-';
break;
case 3:
res = num1 * num2;
op = '*';
break;
case 4:
res = num1 / num2;
op = '/';
break;
case 5:
res = num1 % num2;
op = '%';
break;
case 6:
continue;
default:
System.out.println("잘못된 입력값입니다.");
continue;
}
System.out.println("1 => " + num1 + op + num2 + "=" + res);
}
}while(menu != 6);
System.out.println("종료합니다.");
scan.close();
4. 다중 for문
// 다중 for문
for(int i = 1; i <= 5; i ++) {
for(int j=1; j <= 5; j ++) {
System.out.print(j + " ");
}
System.out.println();
System.out.println("---------");
}
◉ 다중 for문을 활용해서 출력하기
(1) 별 찍기
// 별 찍기
/* *****
* *****
* *****
* *****
* *****
*/
for(int i = 1; i <= 5; i ++) {
for(int j=1; j <= 5; j ++) {
System.out.print('*');
}
System.out.println();
}
(2) 별 찍기
/* *
* **
* ***
* ****
* *****
*/
for(int i = 1; i <= 5; i ++) {
for(int j=1; j <= i; j ++) {
System.out.print('*');
}
System.out.println();
}
(3) 별 찍기
/* *****
* ****
* ***
* **
* *
*/
for(int i = 1; i <= 5; i ++) {
for(int j=1; j <= (6 - i); j ++) {
System.out.print('*');
}
System.out.println();
}
System.out.println("---------------");
(4) 숫자 나열하기
/* 1 2 3
* 4 5 6
* 7 8 9
* 3개씩 3줄 출력
*/
int count = 0;
for(int i = 1; i <=3; i ++) {
for(int j = 1; j <= 3; j ++) {
count++;
System.out.print(count + " ");
}
System.out.println();
}
(5) 소수 출력하기
Scanner scan = new Scanner(System.in);
System.out.println("숫자를 입력해주세요. >> ");
int num = scan.nextInt();
int cnt = 0;
for(int i = 1; i <= num; i ++) {
if(num % 1 == 0) {
cnt ++;
}
}
if(cnt == 2) {
System.out.println(num + "소수입니다.");
} else {
System.out.println(num + "소수가 아닙니다.");
}
scan.close();
5. 예제 문제
◉ 문제 1번
/* up/down game
* 1 ~ 50사이의 랜덤수를 생성하여 플레이어가 맞추는 게임.
* 컴퓨터가 랜덤수를 생성하였습니다. => 23
* 입력 > 10
* 결과 > up!
* 입력 > 30
* 결과 > down~
* 입력 > 23
* 정답!! 종료
*/
◉ 문제 2번
// 과제 제출
/* 주사위 게임
* 주사위를 던져서 총 30칸을 이동 (Enter = 주사위 굴림)
* 주사위는 랜덤으로 생성(1~6까지 생성)
* 주사위 : 3
* 3칸 전진 => 27칸 남았습니다.
* ...
* 도착 ~ !! 총 횟수 : 10회 <= 주사위를 던진 횟수
*/
◉ 문제 3번
// 2부터 100까지 중 소수만 출력
정답:
◉ 문제 1번
Scanner scan = new Scanner(System.in);
// 랜덤수 생성
int ran = (int)(Math.random()*50)+1;
// 게임
System.out.println("up / down game start~~!!");
System.out.println("1 ~ 50사이의 숫자를 생성하였습니다.");
while (true) {
System.out.println("정답을 입력해주세요.");
int msg = scan.nextInt();
if (msg == ran) {
System.out.println("정답!! 축하드립니다."); // 정답
System.out.println("게임을 종료합니다.");
break;
} else if ((msg > 50) || (msg < 0)) {
System.out.println("입력된 숫자가 범위를 벗어났습니다."); // 1 미만, 50 초과의 수를 입력할 시
} else if (msg < ran) {
System.out.println("Up!");
} else if (msg > ran) {
System.out.println("Down~");
} else {
System.out.println("잘못 입력되었습니다.");
System.out.println("게임을 종료합니다.");
break;
}
}
scan.close();
◉ 문제 2번
Scanner scan = new Scanner(System.in);
System.out.println("주사위 게임");
System.out.println("주사위를 굴러 30칸까지 가세요!");
int block = 0; // 몇 칸
int count = 0; // 횟 수
while(block < 30) {
System.out.println("주사위 굴리기(Enter)");
scan.nextLine(); // 주사위 굴리기
int ran = (int)(Math.random()*6)+1;
block += ran;
count ++;
System.out.printf("주사위 : %d", ran);
System.out.println(" ");
int res = (30 - block) < 0 ? 0 : (30 - block); // -n칸 방지용
System.out.printf("%d칸 전진 => %d칸 남았습니다.", ran, res);
System.out.println(" ");
}
if (block > 30) {
System.out.printf("도착 ~ !! 주사위 굴린 횟수: %d번", count);
System.out.println(" ");
}
scan.close();
◉ 문제 3번
Scanner scan = new Scanner(System.in);
int count = 0;
for (int i = 2; i <= 100; i ++) {
for (int j = 1; j <= i ; j ++) {
if (i % j == 0) {
count ++;
}
}
if (count == 2) {
System.out.print(i + " ");
}
count = 0;
}
scan.close();
6. 느낀점
오늘 문제들을 풀면서 예전에 배웠던 개념들이 기억이 잘 안나서 문제들을 푸는 중간중간마다 어떻게 해결해야할 지 고민을 했었다. random, nextLine과 같은 많이 다루지 못했던 용어들을 위주로 복습을 해야 한다고 생각하게 되었다.
'Java' 카테고리의 다른 글
Java 기초(객체 지향 언어) - AWS 풀스택 과정 6일차 (0) | 2024.07.22 |
---|---|
Java 기초(String, Method) - AWS 풀스택 과정 5일차 (0) | 2024.07.19 |
Java 기초(배열) - AWS 풀스택 과정 4일차 (0) | 2024.07.18 |
Java 기초(Switch, For) - AWS 풀스택 과정 2일차 (0) | 2024.07.16 |
Java 설정 및 기초(Print, Scanner, If) - AWS 풀스택 과정 1일차 (0) | 2024.07.16 |