열심히 끝까지
디바이스 융합 자바(Java) day03 - 제어문 본문
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 + "입니다.");
}
}
'디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)' 카테고리의 다른 글
디바이스 융합 자바(Java) day06 - 함수,오버로딩 (0) | 2022.06.14 |
---|---|
디바이스 융합 자바(Java) day05 - 버블정렬,최대값 찾기,이진검색,배열 이진검색,flag 변수 (0) | 2022.06.13 |
디바이스 융합 자바(Java) day04 - 중첩반복문,배열 (0) | 2022.06.10 |
디바이스 융합 자바(Java) day02 - 디버깅표,연산자,Scanner,유효성검사,제어문,교환알고리즘 (0) | 2022.06.08 |
디바이스 융합 자바(Java) day01 - 변수,자료형,연산자 (0) | 2022.06.07 |