제어문
: 코드의 흐름을 제어하는 문장(문법)
코드의 일정 부분을 선택하여 실행하거나
코드의 일정 부분을 반복하여 실행하는 제어문
제어문의 종류
조건문
: if ~ else문
조건식의 결과가 참과 거짓에 따라 실행 내용을 선택하여 실행하는 제어문
조건문 설명 : https://developernew.tistory.com/13
선택문
: swich ~ case문
값에 따라 실행 내용을 선택하여 실행
선택문 설명 : https://developernew.tistory.com/14
반복문
: while, for, do ~ while
코드의 일정 부분을 반복하여 실행하는 제어문
조건식이 [참]일 동안 반복하여 실행한다 ; [거짓]이 될 때 종료함
반복문 설명: https://developernew.tistory.com/18
반복문 : while, for, do ~ while문
코드의 일정 부분을 반복하여 실행하는 제어문
조건식의 결과가 참일 동안 반복하여 실행한다
반드시 탈출 조건 또는 종료 지점을 만들어 주어야 한다
종류
while : 반복할 횟수가 일정하지 않을 때
do ~ while : 무조건 한 번은 실행을 해야하며 잘못된 데이터를 거를 때
for : 반복할 횟수가 일정할 때
while
반복할 횟수가 일정하지 않을 때
반복할 횟수를 모를 때
반복이 무한일 때
형식 :
while( 조건식 ) {
종속문장
}
->
조건식이 참이면 종속문장 실행
조건식이 참일 때까지 무한으로 실행
조건문이 거짓일 때 빠져나오게 된다
do ~ while
무조건 한 번은 실행을 해야 하며 잘못된 데이터를 거를 때 사용한다
while문과 구별하기 위해 조건식 옆에 ;을 적어 준다
종속문장이 먼저 실행이 되고 그 후에 조건식을 비교하는 형식
형식:
do {
종속문장;
}
while (조건식);
-> while(조건식)이 참이면 다시 do {}로 돌아가고
조건식이 거짓이 될 때 빠져나옴
for
반복할 횟수가 일정할 때
반복할 횟수를 알고 있을 때
반복이 유한할 때
괄호 안에 초기식과 조건식, 증감식들을 구별하기 위해서 반드시 세미콜론 두개가 필요
형식:
for (초기식; 조건식; 증감식) {
종속문장;
}
* 초기식
일반적으로 초기식부분에서 변수 선언을 한다
기존 데이터 공간을 가져와서 사용해도 된다
반복할 변수를 설정하는 부분 ; 반복의 시작
* 조건식
참일 때 실행해라
반복의 끝을 설정
단순한 조건식이 온다
* 증감식
일정하게 증가 또는 감소하는 식
일반적으로 증감연산자를 많이 사용
i++ i+=1 i==+1 0
i + i (x)
for를 만나는 순간 초기식을 가지고 조건식 비교 -> 조건식이 참이면 종속문장 실행 -> 종속문장 실행 후 증감식으로 반복
: 초기식 > 조건식 > 증감식 > 조건식 > 증감식 > ... > 조건식(거짓인 경우 종료)
ex.
for(int i = 0; i<5; i++) {
System.out.println(i);
}
for(float a = -0.36f; a>=-0.4; a-=0.01) {
System.out.println(a);
}
-> 모든 제어문은 중첩이 가능하다
다중 for문
for문 안에 for문이 있는 형태
외부 for문 종속문장 안에 내부 for문이 있는 형태
for문이 중첩적인 구조를 가지는 for문
총 반복횟수 : 외부 for문 * 내부 for문
외부 for문이 한 번 실행할 때마다 내부 for문은 한바퀴가 돈다
형식
for (초기식; 조건식; 증감식) {
종속문장;
for (초기식; 조건식; 증감식) {
종속문장;
}
}
Exercise 1
public class Test01 {
public static void disp(int i) {
}
public static void main(String[] args) {
예시1)
int i=0;
while (i < 5) {
System.out.println(i);
}
// 멈추는 조건이 없으므로 무한히 i값 출력
예시2)
int i = 0;
while (i < 5) {
System.out.println(i);
i++;
}
// 'i++'값을 부여해 i가 5 미만이 될 때까지 출력
Exercise 2
public class Test02 {
public static void disp(int i) {
}
public static void main(String[] args) {
예시1)
int i=0;
while(true) {
System.out.println(i);
i++;
}
// 무한히 출력하게 됨
예시2)
int i = 0;
while(true) {
System.out.println(i);
i++;
if(i == 4){
break;
}
}
// i가 4가 되면 멈춤 ; 0, 1, 2, 3 출력
/*
지역변수 : 변수의 생성 위치
어느 지역 또는 영역에 속해서 그 지역 내에서 우선적으로 사용되는 변수
그 지역이 실행할 때 공간이 생성되고 , 그 지역이 끝날 때 공간이 소멸
*/
int i = 0; // main 메소드의 지역 변수
while(true) {
System.out.println(i);
if(i == 4){
break;
}
i++;
}
// 0, 1, 2, 3, 4 출력
int i = 0;
while(true) {
i++;
System.out.println(i);
if(i == 4){
break;
}
}
// 1, 2, 3,4 출력
Exercise 3
1부터 100까지의 정수를 출력하세요
int i1 = 1;
while (true) {
System.out.println(i1);
i1++;
if (i1 == 100 ) {
break;
}
}
// or
int i1a = 1;
while (i1a <= 100) {
System.out.println(i1a);
i1a++;
}
Exercise 4
1부터 10까지의 합 구하기
int i2 = 1;
int sum2 = 0;
while (true) {
sum2 += i2;
i2++;
if (i2 > 10) {
break;
}
}
System.out.println(sum2);
// or
int i2a = 1;
int sum2a = 0;
while (i2a <= 10) {
sum2a += i2a;
i2a++;
}
System.out.println(sum2a);
Exercise 5
10~20 사이의 숫자만 입력받아 1부터 입력 받은 수까지의 합을 구하시오
Scanner sc = new Scanner(System.in);
int user = 0;
while(true) {
System.out.println("10~20사이의 숫자를 입력하세요.");
user = sc.nextInt();
if(user >= 10 && user<= 20) {
break;
} else {
System.out.println("잘못된 값입니다. 다시 입력해주세요.");
}
}
int i3 = 1;
int sum3 = 0;
while (i3 <= user) {
sum3 += i3;
i3++;
}
System.out.println("1부터 입력한 값까지의 총 합 : " + sum3);
sc.close();
Exercise 6
어떤 수의 약수를 구하는 프로그램을 작성하여라
* 약수 = 어떤 수를 정수로 나눌 수 있는 수
Scanner sc = new Scanner(System.in);
System.out.println("약수를 구하려는 수를 입력하세요");
int user5 = sc.nextInt();
int i5 = 1;
while (i5 <= user5) {
if (user5%i5 == 0) {
System.out.println(i5);
}
i5++;
}
sc.close();
Exercise 7
두 수의 최소 공배수와 최대 공약수를 구하는 프로그램을 작성하라
최소공배수 = 공배수 중에서 가장 작은 정수
최대공약수 = 공약수 중에서 절대치가 가장 큰 수
import java.util.Scanner;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("두 수를 입력하세요");
int user1 = sc.nextInt();
int user2 = sc.nextInt();
sc.close();
// 최대공약수
// Step1
int min; // user1과 2중 작은 수 찾기
if (user1 <= user2) {
min = user1;
} else {
min = user2;
}
// Step2
int i = 1; // 공약수
int gcm = 1; // i1과 i2의 최대공약수
while (true) {
if (user1%i == 00 && user2%i == 00) {
gcm = i;
}
i++;
if (i > min) {
break;
}
}
System.out.println("두 수의 최대공약수: " + gcm);
// 최소공배수
int lcm = (user1 * user2)/ gcm;
System.out.println("두 수의 최소공배수: " + lcm);
}
// or
import java.util.Scanner;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("두개의 정수 입력 : ");
int a = sc.nextInt();
int b = sc.nextInt();
sc.close();
int big = (a > b) ? a : b;
int small = (a < b) ? a : b;
// System.out.println((a < b) ? a : b);;
// (a > b) ? System.out.println(a) : System.out.println(b);
int i = small;
while(i > 0) {
if(small % i == 0 && big % i == 0) {
System.out.println("최대 공약수는 " + i + "입니다.");
break;
}
i--;
}
i = 1;
while(true) {
if((big * i) % small == 0) {
System.out.println("최소 공배수는 " + (big * i) + "입니다." );
break;
}
i++;
}
}
Exercise 8
정수를 입력해 수를 거꾸로 출력하시오
출력만은 한개만 출력
출력은 while 밖에서 한 번
입력 : 12340
출력 : 04321
import java.util.Scanner;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("정수 입력 : ");
int su = sc.nextInt();
String rev = "";
while (su !=0) {
rev += (su%10);
su /= 10;
}
System.out.println(rev);
sc.close();
Exercise 9
사용자가 틀릴 때까지 구구단 문제를 출제하는 프로그램 구현
(2 x 1 부터 19 x 9까지 구현)
사용자가 3문제를 틀리면 게임오버! 라는 메세지를 출력한 뒤 종료
종료 전에 정답 개수와 점수를 출력
[1] 일반 정답 +10점
[2] 어려운 문제 정답은 5점 추가 (총 15점) 11단부터~
package whileloop;
import java.util.Scanner;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cnt1 = 0; //오답
int cnt2 = 0; //정답
int tot = 0;
int over = 3;
while (true) {
System.out.println("구구단의 답을 입력하세요");
int a = (int)(Math.random() * 18 + 2);
int b = (int)(Math.random() * 18 + 2);
int x = a*b;
System.out.println(a + " X " + b + " = ?");
int ans = sc.nextInt();
if (ans != x) {
tot-=5;
over --;
System.out.println("틀렸습니다. 5점 감점. " + over + " 회 남았습니다.");
cnt1++;
if (over == 0) {
System.out.println("게임 오버");
System.out.println("총 문제 개수 : " + (cnt1+cnt2));
System.out.println("총 정답 개수 : " + cnt2 + ", 총점 : " + tot);
break;
}
} else {
System.out.println("정답입니다! 10점 획득");
tot+=10;
cnt2++;
if (a >= 11 || b >=11) {
System.out.println("축하합니다! 어려운 문제를 맞춰 5점 추가 획득");
tot+=5;
}
}
}
sc.close();
}
Exercise 10
업다운 게임을 구현하려 합니다.
컴퓨터에게 1부터 100 사이의 정답을 생성하도록 코드를 구현한 뒤
사용자가 숫자를 입력하여 정답을 맞추도록 프로그래밍하세요
<게임의 상태>
[ 업 ] 사용자가 정답보다 낮은 값을 입력한 경우
[ 다운 ] 사용자가 정답보다 높은 값을 입력한 경우
[ 정답 ] 사용자가 정답과 같은 값을 입력한 경우, 게임 종료
게임 종료시 총 입력한 횟수를 화면에 출력
import java.util.Scanner;
public static void main(String[] args) {
System.out.println("업다운 게임! 1~100사이의 수를 맞추세요.");
Scanner sc = new Scanner(System.in);
int x = (int)(Math.random() * 100 + 1);
int cnt = 0;
while (true) {
System.out.print("정수 입력 : ");
int user = sc.nextInt();
cnt++;
if (x > user) {
System.out.println("[업!]");
} else if (user > x) {
System.out.println("[다운!]");
} else {
System.out.println("[정답]");
System.out.println("총 입력 횟수 : " + cnt + " 번");
break;
}
}
sc.close();
}
Exercise 11
[ 아이템 강화 시뮬레이션 ]
1. 아이템은 1번 강화하는데 현금 1000원이 필요하다
2. 아이템은 처음에 레벨이 0이다
3. 강화가 성공할 확률은 35% 이고 성공하면 레벨이 1 증가
4. 강화가 실패할 확률은 30% 이고 실패하면 레벨이 1 감소
5. 그 외의 경우에는 아무런 변화가 없다
0레벨의 아이템을 10레벨로 만들기 위해 내가 쏟아 부어야 되는 현금을 계산하세요
public static void main (String[] args) {
System.out.println("아이템 강화");
int lev = 0; // 레벨
int cost = 1000; // 현금
int cnt = 0;
int tot = 0;
while (true) {
double rate = Math.random();
cnt++;
tot += cost;
if (rate <= 0.35) { // 성공할 확률
lev++;
System.out.println(cnt + ". 강화 성공! " + lev);
if (lev == 10) {
System.out.println(cnt + ". 강화 종료! 레벨 : " + lev);
System.out.println("총 강화 횟수 : " + cnt + " 번 / 총 금액 : " + tot + " 원" );
break;
}
} else if (rate >= 0.7) {
if (lev == 0) {
System.out.println(cnt + ". 강화 실패! 레벨 0이하로는 떨어지지 않습니다. 레벨 : " + lev);
} else {
lev--;
System.out.println(cnt + ". 강화 실패! 레벨 : " + lev);
}
} else {
System.out.println(cnt + ". 아무런 변화가 없습니다. 레벨 : " + lev);
}
}
}
Exercise 12
아래의 구간을 for 문을 이용하여 화면에 출력
[1] 2자리 정수
[2] 1부터 100사이의 홀수
[3] 대문자 알파벳
[4] 1000보다 작은 3의 배수
[5] 1000보다 작은 2의 제곱수 (1, 2, 4, 8, 16, ..., 256, 512)
public static void main(String[] args) {
for (int a=10; a<100; a++) {
System.out.println(a);
}
for (int b=1; b <= 100; b+=2) {
System.out.println(b);
}
for (char ch = 'A'; ch <='Z'; ch++) {
System.out.println(ch);
}
for (int d=1; d < 1000; d++) {
if(d%3 == 0) {
System.out.println(d);
}
}
for (int e=1; e < 1000; e*=2) {
System.out.println(e);
}
}
Exercise 13
돈을 저축하려 합니다
오늘 저축할 돈은 어제 저축한 돈의 두배로 할 예정이고
첫째날에 1원을 저축하려고 합니다
(Q1) 30일동안 통장에 저축될 돈은 얼마입니까?
(Q2) 40일동안 통장에 저축될 돈은 얼마입니까?
for (int day=1, amt=1, tot=0; day<=30; amt*=2, day++) {
tot+=amt;
System.out.println(day + "일째 저축 금액 : " + amt + "원\n총 " + tot + "원");
}
long amt = 1, tot=0;
for (int day=1; day<=40; amt*=2, day++) {
tot+=amt;
System.out.println(day + "일째 저축 금액 : " + amt + "원\n총 " + tot + "원");
}
}
}
Exercise 13
[문제] Test04.java에 구현
타이머 만들기
사용자에게 분을 입력받아서 해당하는 시간이 흐른 뒤 메세지가 출력되도록 코드구현
(예상결과)
분 입력 : 3
3분 0초 남음
2분 59초 남음
...
0분 2초 남음
0분 1초 남음
0분 0초 남음
정신차려 이놈자식아!!!!
import java.util.Scanner;
public static void main(String[] args) throws InterruptedException {
Scanner sc = new Scanner(System.in);
System.out.println("타이머를 몇 분으로 설정할까요?");
int user = sc.nextInt();
sc.close();
for (int min=user-1; min>=0; min--) {
for (int sec=59; sec>=0; sec--) {
System.out.println(min + "분 " + sec + "초 남음");
}
}
System.out.println("정신차려 이놈자식아");
// or
for (int sec1 = user*60; sec1>=0; sec1--) {
System.out.println(String.format("%02d분 %02d초 남음", sec1/60, sec1%60)); //문자열이 앞에 오고 , 뒤의 정수값이 차례대로 온다
}
System.out.println("정신차려 이놈자식아");
// or
for (int sec2 = user*60; sec2>=0; sec2--) {
System.out.println(String.format("%02d분 %02d초 남음", sec2/60, sec2%60));
Thread.sleep(1000); // 내가 지정한 시간 만큼 프로그램을 멈추어 주는 역할 ; ms단위로 적어 주어야 한다
}
}
}
'Backend > JAVA' 카테고리의 다른 글
JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, static (0) | 2023.02.16 |
---|---|
JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, 함수, 메소드 (0) | 2023.02.16 |
JAVA 코딩 제어문 - 선택문 : switch ~ case문 (0) | 2023.02.03 |
JAVA 코딩 제어문 - 조건문 : 단순if문, if~else문, if~else if~else문 (0) | 2023.02.03 |
JAVA 코딩 System.in 표준 입력 스트림, Scanner 스캐너 (0) | 2023.02.01 |