열심히 끝까지

디바이스 융합 자바(Java) day03 - 제어문 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day03 - 제어문

노유림 2022. 6. 9. 17:42

6/8일자 숙제(과제) 강사님의 방법

package class01;

import java.util.Scanner;

public class Test01 {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);

              System.out.print("시간 : ");
              int h = sc.nextInt();
              System.out.print("분 : ");
              int m = sc.nextInt();

              if((h < 1 || 12 < h)  ||  (m < 0 || 59 < m)) {
                     // 유효성 체크!
                     System.out.println("시간 범위 : 1~12");
                     System.out.println("분 범위 : 0~59");
              }
              else {
                     System.out.println(h + "시 " + m + "분의 1시간 20분 전 시간은");
                     h-=1;
                     m-=20;
                     if(m < 0) {
                            m += 60;
                            h--; 
                     }
                     if(h < 1) { // h값을 제대로 정하려면 정해놓은 이후로 건드리면 안된다.
                            h += 12;
                     }

                     System.out.println(h + "시 " + m + "분입니다.");
              }

              // 검사 == 테스트
              // 1) 경계값 검사 : 경계가 될 만한 값을 일부러 넣어서 검사해보기

       }
}

주말과제 낼 예정 -> 포스팅하고 링크를 이메일로 보낼 것



한글로 먼저 코딩하는 것 >> 스도코딩 

제어문 
반복문 while for

while
어떤(특정) 조건을 만족할 때까지 계속
  ~~~할 때까지 반복
  무한하게, 영원히

for
N번, N회
  a부터 ~ b까지
  범위가 분명하게 주어졌을 때
  '배열'(자료구조)


while(조건식){
       조건식이 참일 동안 수행할 문장; // 조건이 맞으면 계속 수행
}

if(조건식){
       조건식이 참일 때 수행할 문장; // 조건이 맞으면 한번 수행
}

코드가 재사용되었다!
>> 중복코드가 최소화
>> 오류의 파급효과가 줄어듦
    ==> 포스팅하여 미래의 나를 위하기!



a가 b의 약수이다.

if(a<b)
       dafdasdf
else
       dafdasdf

/*
int i = 1;
while(i <= 3) { System.out.println("확인");  i++; } 
// }를 절대로 통과할 수 없음!
// => 25번 라인의 조건식으로 간다!
*/

i           i<=3
---------------------
1           T           확인
2           T           확인
3           T           확인
4           F           
          -> 25번 라인에서 F를 만나면 
              바로 29번 라인으로 이동! (while문 밖으로) 


int i = 0;
while(i < 3) {
       System.out.println("i : " + i);
       i++;
}


i          i<3
----------------------------
0          T           
1          T
2          T
3          F     -> } 밖으로 이동

int i = 2;
while(i < 5) {
       System.out.println("i : " + i);
       i++;
}
syso(i)

i          i<5
----------------------------
2          T
3          T
4          T
5          F     -> } 밖으로 이동

int i = 2;
while(i < 5) {
       System.out.println("i : " + i);
       i--;
}
syso(i) 
--> 무한정


문제 
1. 정수 입력 : 5(0 이하 입력 xxx)
1 2 3 4 5

2. 정수1 입력:10
   정수2 입력:5
5 6 7 8 9 10

정수1 입력:5
정수2 입력:10
5 6 7 8 9 10

3. 정수입력 : 10
1 2 5 10 -> 약수들만 출력
-------
package class01;

import java.util.Scanner;

public class Test02 {
       public static void main(String[] args) {
              // 출력, 변수 -> 3요소(공간 자료형 이름)형변환(아스키코드, 자동형변환, 명시적형변환)
              // 연산자 : 우선순위가 중요 -> 디버깅표산술대입복합대입증감, 논리비교삼항 배움
              // 입력, 제어문 - 조건문 if -> "유효성 검사" << 매우 중요!!!!
              // "주석" -> 가독성 => ★유지보수★ << 매우 중요!!!

              /*
              while
              : 어떤(특정) 조건을 만족할 때까지 계속
                ~~~할 때까지 반복
                무한하게, 영원히

              for
              : N번, N회
                a부터 ~ b까지
                범위가 분명하게 주어졌을 때
                '배열'(자료구조)
               */

              /*
              int i = 1;
              while(i <= 3) { System.out.println("확인");  i++; } 
              // }를 절대로 통과할 수 없음!
              // => 25번 라인의 조건식으로 간다!
              */
              Scanner sc = new Scanner(System.in);

              // 문제 1
              System.out.print("정수입력 : ");
              int num = sc.nextInt();

              int i = 1;
              while(i <= num ) {
                     System.out.print(i + " ");
                     i++;
              }
              System.out.println();
              System.out.println();



              // 문제 2
              System.out.print("정수1 입력 : ");
              int n1 = sc.nextInt();
              System.out.print("정수2 입력 : ");
              int n2 = sc.nextInt();

              int tmp;
              if(n1 >= n2) {
                     tmp = n1;
                     n1 = n2;
                     n2 = tmp;
              }

              while(n1 <= n2) {
                     System.out.print(n1 + " ");
                     n1++;
              }
              System.out.println();
              System.out.println();

              // 문제 3
              System.out.print("정수 입력 : ");
              int j = sc.nextInt(); // 정수 j 입력받기

              int k = 1;
              while(k <= j) {
                     if(j%k==0) {
                            System.out.print(k + " ");
                     }
                     k++;
              }
       }
}

-----------교수님의 해설
package class03;

import java.util.Scanner;

public class Test03 {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);

              System.out.print("정수1 : ");
              int a = sc.nextInt();
              System.out.print("정수2 : ");
              int b = sc.nextInt();

              // [교환] -> * tmp 임시저장변수 * 
              if(a>b) {
                     int tmp = a;
                    a=b;
                     b=tmp;
              }
              // a가 b보다 무조건 작습니다.

              while(a<=b) {
                     System.out.print(a + " ");
                     a++;
              }
       }
}
-------------------------
문제 3
package class03;

import java.util.Scanner;

public class Test04 {

       public static void main(String[] args) {
              // 약수,소수,완전수
              // 피보나치,팩토리얼
              // 최대공약수,최소공배수
      
      
              Scanner sc=new Scanner(System.in);
              System.out.print("정수입력: ");
              int num=sc.nextInt();
      
              int i=1;
              while(i<=num) {
                     if(num%i==0) {
                            System.out.print(i+" ");
                     }
                     i++;
              }
      }
}

--------약수가 아니면 건너뛰는 방법
에러 고치기 전
package class03;

import java.util.Scanner;

public class Test04 {
       public static void main(String[] args) {
              // 약수, 소수, 완전수
              // 피보나치, 팩토리얼
              // 최대공약수, 최소공배수

              Scanner sc = new Scanner(System.in);
              System.out.print("정수입력 : ");
              int num = sc.nextInt();

              int i = 1;
              while(i<=num) {
                     if(num%i!=0) {
                            continue;
                            // 숫자의 약수가 아니면 건너뛰어라!
                     }

                     System.out.print(i + " ");
                     i++;
              }
       }
}
 
디버그표
i        num          i<=num               num%i !=0
-------------------------------------------------------
1        100              T          무한          F      1
2                           T          무한          F      2
3                           T          무한          T  
                             T          무한          T  
                             T          무한          T
                             T          무한          T
                             T          무한          T
                          .     


                          .                          
continue를 쓰지 않겠다 라고 고집하는 사람 -> 유지보수에 대해 고려 x

 

- i++가 if문 아래쪽에 있어 continue가 실행되면 i++가 적용되지 못하고 

  continue로 인해 계속 반복문만을 맴돈다(무한대로 돈다).


i++ 위로 이동시킨 후(if문 위에)
i        num          i<=num               num%i !=0
-------------------------------------------------------
1        100              T    
2

==> int를 0으로 설정하면 해결
...이 아니다.
// 유효성 검사를 통해 101까지 넘어감을 감지, 효율성이 떨어짐


i        num          i<=num               num%i !=0
-------------------------------------------------------
0        100              T    
1                                                     F   1
                             T
2                                                     F   2
                             T
3                                                     T
.
.
.
99                        
                            T
100                                                  F   100
                            T
101                                                  T
                            F

i<num으로 고침
i        num          i< num               num%i !=0
-------------------------------------------------------
0        100              T    
1                                                     F   1
                             T
2                                                     F   2
                             T
3                                                     T
.
.
.
99                        
                            T
100                                                  F   100
                            F

최종
package class03;

import java.util.Scanner;

public class Test04 {
       public static void main(String[] args) {
              // 약수, 소수, 완전수
              // 피보나치, 팩토리얼
              // 최대공약수, 최소공배수

              Scanner sc = new Scanner(System.in);
              System.out.print("정수 입력 : ");
              int num = sc.nextInt();

              // 소수 : 약수가 1과 자기 자신밖에 없는 정수
              // ex ) 2, 3, 4, 5, 11, 13, 17,... -> 약수의 개수가 2개인 정수
              // 1은 소수가 아닙니다.
              int i = 0;
              int cnt = 0; // 약수의 개수를 기억할 변수가 필요!
              while(i<num) {
                     i++;
                     if(num%i==0) {
                            cnt++;
                     }
              }

              if(cnt==2) {
                     System.out.println("소수입니다.");
              }
              else {
                     System.out.println("소수아닙니다.");
              }
              // 유효성검사 << 꼭 기억할 것 중요!!
       }
}
num     i      cnt        i<num       num%i==0
------------------------------------------------
6        0        0          T
          1        1          T                    T
          2        2          T                    T
          3        3          T                    T
          4                    T                    F
          5                    T                    F
          6        4          F                     T   

 

-----------------------------------------------------------------------

num     i       cnt        i<num        num%i==0
--------------------------------------------------
3         0        0             T
           1        1             T                 T     
           2                       T                 F
           3        2             F                 T

--------
완전수 문제
숫자 입력
4 -약수(본인제외)-> 1,2 = 3(약수 더하기)
6 -> 1,2,3 = 6 -> 합이랑 숫자랑 같으면 완전수!
8 -> 1,2,4 = 7

ex ) 6, 28, 496
7,8,9,10,100
---------------------
+) 심화
1~1000 정수들 중에서 완전수만 출력해주세요!

--------------------------------------------------------
package class03;

import java.util.Scanner;

public class Test0501 {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);

              System.out.print("정수 입력 : ");
              int n = sc.nextInt();

              // n과 n의 약수(본인을 제외한 약수)의 합이 같은 것 = 완전수
              int i = 0;
              int s = -n; // n의 약수의 합(본인을 제외한)
              while(i < n) {
                     i++;
                     if(n%i==0) { // 0이 된다는 것은 약수
                            s += i; // s에 약수를 넣어 합하기
                     }
              }

              if(n == s) {
                     System.out.println(n + "은(는) 완전수입니다. 약수(본인제외)의 합 : " + s);
              }
              else {
                     System.out.println(n + "은(는) 완전수가 아닙니다. 약수(본인제외)의 합 : " + s);
              }
       }
}

n          i           s           i < n         n%i==0
----------------------------------------------------
6         0           -6           T              
           1           -5           T                  T
           2           -3           T                  T
           3            0           T                  T
           4                         T                  F
           5                         T                  F
           6            6           F                   T

----------------------
package class03;

import java.util.Scanner;

public class Test0502 {
       public static void main(String[] args) {

              Scanner sc = new Scanner(System.in);

              System.out.print("정수 입력 : ");
              int n = sc.nextInt();

              // n과 n의 약수(본인을 제외한 약수)의 합이 같은 것 = 완전수
              int i = 0;
              int s = 0; // n의 약수의 합(본인을 제외한)
              while(i < (n-1)) {
                     i++;
                     if(n%i==0) { // 0이 된다는 것은 약수
                            s += i; // s에 약수를 넣어 합하기
                     }
              }

              if(n == s) {
                     System.out.println(n + "은(는) 완전수입니다. 약수(본인제외)의 합 : " + s);
              }
              else {
                     System.out.println(n + "은(는) 완전수가 아닙니다. 약수(본인제외)의 합 : " + s);
              }
       }
}
n          i           s           i < n-1(5)         n%i==0
----------------------------------------------------
6         0           0              T              
           1           1              T                  T
           2           3              T                  T
           3           6              T                  T
           4                           T                  F
           5                           F                 

------------------강사님 방법
package class05;

import java.util.Scanner;

public class Test06 {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);


              System.out.print("정수입력 : ");
              int num = sc.nextInt();

              int i = 1;
              int total = 0; // 약수들을 저장하는 역할
              while(i<num) {
                     if(num%i==0) {
                            total += i;
                     }
                     ++;
              }
              System.out.println("total : " + total);

              if(total == num) {
                     System.out.println("완전수");
              }
              else {
                     System.out.println("완전수아님");
              }
       }
}

----------------------------------------------------------1000까지의 완전수 구하기 
package class03;

public class Test0503 {
       public static void main(String[] args) {
              int n = 0;
              int b = 1000;

              // n과 n의 약수(본인을 제외한 약수)의 합이 같은 것 = 완전수
              while(n <= b) {
                     int i = 0;
                     int s = 0; // n의 약수의 합(본인을 제외한)
                     n++;
                     while(i < (n-1)) {
                            i++;
                            if(n%i==0) { // 0이 된다는 것은 약수
                                   s += i; // s에 약수를 넣어 합하기
                            }
                     }
                     if(n == s) {
                            System.out.print(n + " ");
                     }
              }
              System.out.println("끝");
       }
}

-------------강사님 방법

package class05;

import java.util.Scanner;

public class Test06 {
       public static void main(String[] args) {

              System.out.print("정수입력 : ");
              int num = 1;
              while(num<=1000) {
                     int i = 0;
                     int total = 0; // 약수들을 저장하는 역할
                     while(i<num) {
                            i++;
                            if(num%i==0) {
                                   total += i;
                            }
                     }

                     if(total == num) {
                            System.out.print(num + " ");
                     }
                     num++;
              }
              // 디버깅표
       }
}


디버깅표
num           i           total            i<num-1
----------------------------------------------------------------
1               0            0                  F
2               0            0                  T
                 1            1                  F
...(생략)
4               0            0                  T
                 1            1                  T
                 2            3                  T
                 3                                F
5
......(생략)

 

------------------------------------------------------------------------------

오늘의 while 마지막 문제
-------------------------------------
1. 아메리카노
2. 카페라떼
3. 프라푸치노
입력) 2
- 사용자의 입력이 옳지 않을 경우 ( 잘못입력하셨습니다.)

카페라떼 나왔습니다.

package class05;

import java.util.Scanner;

public class Test07 {
       public static void main(String[] args) {

              /* 처음 의뢰(과제)받았을 때 하는 법
              int i = 1;
              while(i <= 1000) {
                     int j = 1; // 약수체크용 변수 
                     int sum = 0; // 약수 총합을 저장할 변수
                     while(j<i) {
                            if(i%j==0) {
                                   sum += j;
                            }
                            j++;
                     }

                     if(sum == i) {
                            System.out.print(i + " ");
                     }
                     i++;
              }
              */

              Scanner sc = new Scanner(System.in);
              boolean t = true;
              while(t) {

                     System.out.println("-----메뉴판-----");
                     System.out.println("1. 아메리카노");
                     System.out.println("2. 카페라떼");
                     System.out.println("3. 프라푸치노");
                     System.out.print("입력) ");

                     int mn = sc.nextInt();
                     if(mn == 1) {
                            System.out.print("아메리카노");
                     }
                     else if(mn == 2) {
                            System.out.print("카페라떼");
                     }
                     else if(mn == 3) {
                            System.out.print("프라푸치노");
                     }
                     else {
                            System.out.println("잘못입력하셨습니다!");
                            continue;
                     }
                     t = false;
              }
              System.out.println(" 나왔습니다!");
       }
}

-------------------


while : 횟수를 모를 때
   while(true)
   무한루프(무한반복문)
   -> 종료조건이 필수!! ☆
   -> 꼭 만들어 둘 것!!!


for : 종료조건을 분명히 알 때


----------------------
변수
     scope (유효범위)
    
while안에 변수가 들어가게 되면 
while이 끝날 때 변수도 사라지기때문
밖에서 변수를 지정해주어야 이후의 변수를 사용하는 코드에서
에러가 나지 않음


---------강사님 코드방법
package class06;

import java.util.Scanner;

public class Test08 {
       public static void main(String[] args) {

              Scanner sc = new Scanner(System.in);

              int num;
              while(true) { // 유효성 체크
                     System.out.println("================");
                     System.out.println("     메뉴판");
                     System.out.println("================");
                     System.out.println("1. 아메리카노");
                     System.out.println("2. 카페라떼");
                     System.out.println("3. 프라푸치노");
                     System.out.println("4. 자몽허니블랙티");
                     System.out.print("입력) ");
                     num = sc.nextInt();

                     if(num >= 1 && num <= 4) { // 종료조건 ☆
                            break; // continue;같은 아이
                            // 다음 반복문을 수행하지 않고 반복문 밖으로 바로 빠져나가는 것
                     }
                     System.out.println("잘못입력하셨습니다!");
              }

              String menu = "";
              if(num==1) {
                     menu = "아메리카노";
              }
              else if(num==2) {
                     menu = "카페라떼";
              }
              else if(num==3){
                     menu = "프라푸치노";
              }
              else if(num==4){
                     menu = "자몽허니블랙티";
              }
              System.out.println(menu + " 나왔습니다!");

       }
}

 

*내 코드와의 다른 점

 내 코드의 경우 while문 안에 다 들어가 있어 고치기 쉽지 않다.

 강사님의 코드는 출력문과 입력 후 출력문이 다르기 때문에 유지보수가 쉽다.

  *유지보수를 생각하며 프로그래밍 할 것*


--------------------------------------


제어문
  조건문if
  반복문 while for
횟수여부   x     o

while()
   -> continue;
   -> 무한루프 + break;

do-while() // 생략( 많이 쓰이지 않음)

while(조건식){
       수행;
}

for(초기식; 조건식; 증감식){
       수행할 문장;
}


for(int i = 1; i <= 3; i++){
       System.out.println("i : " + i);
}

i        i<=3
---------------
1         T
2         T
3         T
4         F

 

초기식(처음에만 적용) -> 조건식 -> 수행문
-> 증감식 -> 조건식


--------------------------
package class07;

public class Test09 {
       public static void main(String[] args) {
              /*
              for(초기식; 조건식; 증감식) {
                     수행할 문장;
              }
              */

              /*
              // scope 유효범위
              int i;
              for(int i = 0; i <= 5; i++) {

              }
              System.out.println("i : " + i);
              */

              for(int i = 1; i <= 10; i++) {
                     // System.out.println(i);
              }
              for(int i = 65; i <= 90; i++ ) {
                     // System.out.println((char)i);
              }

              for(int i = 2; i <= 11; i++) {
                     if(i%2==0) {
                            // System.out.println(i);
                     }
              }

              for(int i = 2; i <= 11; i++) {
                     if(i%2==1) {
                            continue;
                     }
                     // System.out.println(i);
              }

              int cnt=0;
              int num = 23;
              for(int i = 1; i <= num; i++) {
                     if(num%i==0) {
                            cnt++;
                     }
              }
              if(cnt==2) {
                     System.out.println("소수입니다.");
              }
              else {
              System.out.println("소수아닙니다.");
              }
       }
}
-----------------
package class07;

public class Test10 {
       public static void main(String[] args) {

              for(int i = 1; i <= 1000; i++) {

                     int sum = 0;
                     for(int j = 1; j < i; j++) {
                            if(i%j==0) {
                                   sum += j;
                            }
                     }

                     if(sum==i) {
                            System.out.println(i);
                     }
              }
       }
}
--------------------

과제
정수 두개 입력
정수1 : 10
정수2 : 12

10와(과) 12의 
최대공약수는 2이고,
최소공배수는 60입니다.

정수1 : 16
정수2 : 12

12와(과) 16의 
최대공약수는 4이고,
최소공배수는 48입니다.

-----------
6/10 과제 풀이 6/10일에 풀이 올라갈 예정
package class07;

import java.util.Scanner;

public class Test1001 {
       public static void main(String[] args) {

              Scanner sc = new Scanner(System.in);

              System.out.print("정수 1 입력 : ");
              int n1 = sc.nextInt();
              System.out.print("정수 2 입력 : ");
              int n2 = sc.nextInt();

              int tmp;
              if(n1 > n2) {
                     tmp = n1;
                     n1 = n2;
                     n2 = tmp;
              }

              int gd = 0;
              int lm = 0;
              for(int i = n1; i > 1; i--) {
                     if(n1 % i == 0 && n2 % i == 0) {
                            gd = i;
                            lm = i * (n1 / i) * (n2 / i);
                            break;
                     }
              }
              System.out.println(n1 + "와(과) " + n2 + "의\n최대공약수는 " + gd + "이고,"
                                                 + " \n최소공배수는 " + lm + "입니다.");
        }
}