본문 바로가기
  • think normal
새로워지기/서른의 생활코딩

6일차) for문 while문 개념 및 예제 20180605_am

by 청춘만화 2018. 6. 5.

package c_sentence;


public class Sentence02 {

public static void main(String[] args) {

/* 1. 반복문

- for.    while,    do-while

- 어떤 작업이 반복적으로 수행되도록 할때 사용된다

- 반복문은 주어진 조건이 만족하는 동안 주어진 문장을 반복적으로 수행한다

- for 문은 주고 반복횟수를 알고 있을때,  

 - while 문은 반복횟수를 모를때 사용한다 (종착지를 모를때)

2.for 

- 기본구조

for( 값을 처음으로 입력  ;  조건식  ;  증감식 ){

 //1         //2, 4, 7, 10         //3, 6, 9 - 반복문이니까

조건식이 true일때 실행되는 문자 ;

                    //3, 5, 8

//11 조건식이 true일때 밖으로     */


// 예제1) 0 부터 100을 출력하시오

System.out.println(0);

System.out.println(1);

System.out.println(2);

System.out.println(3);

System.out.println(4);

System.out.println(5);

System.out.println(6);

System.out.println(7);

System.out.println(8);

System.out.println(9);

System.out.println(10);

System.out.println(11);

System.out.println(12);

System.out.println(13);

System.out.println(14);

System.out.println(15);

System.out.println(16);

System.out.println(17);

System.out.println(18);

System.out.println(19);

System.out.println(20);

System.out.println(31);

System.out.println(32);

System.out.println(33);

System.out.println(34);

System.out.println(35);

System.out.println(36);

System.out.println(37);

System.out.println(38);

System.out.println(39);

System.out.println(40);

System.out.println(41);

System.out.println(42);

System.out.println(43);

System.out.println(44);

System.out.println(45);

System.out.println(46);

System.out.println(47);

System.out.println(48);

System.out.println(49);

System.out.println(50);

System.out.println(41);

System.out.println(42);

System.out.println(43);

System.out.println(44);

System.out.println(45);

System.out.println(46);

System.out.println(47);

System.out.println(48);

System.out.println(49);

System.out.println(50);

System.out.println(51);

System.out.println(52);

System.out.println(53);

System.out.println(44);

System.out.println(45);

System.out.println(46);

System.out.println(47);

System.out.println(48);

System.out.println(49);

System.out.println(50);

System.out.println(41);

System.out.println(42);

System.out.println(43);

System.out.println(44);

System.out.println(45);

System.out.println(46);

System.out.println(47);

System.out.println(48);

System.out.println(49);

System.out.println(50);

System.out.println(51);

System.out.println(52);

System.out.println(53);

System.out.println(54);

System.out.println(55);

System.out.println(56);

System.out.println(57);

System.out.println(58);

System.out.println(59);

System.out.println(60);

System.out.println(61);

System.out.println(62);

System.out.println(63);

System.out.println(64);

System.out.println(65);

System.out.println(66);

System.out.println(67);

System.out.println(68);

System.out.println(69);

System.out.println(70);

System.out.println(71);

System.out.println(72);

System.out.println(73);

System.out.println(74);

System.out.println(75);

System.out.println(76);

System.out.println(77);

System.out.println(78);

System.out.println(79);

System.out.println(80);

System.out.println(81);

System.out.println(82);

System.out.println(83);

System.out.println(84);

System.out.println(85);

System.out.println(86);

System.out.println(87);

System.out.println(88);

System.out.println(89);

System.out.println(90);

System.out.println(91);

System.out.println(92);

System.out.println(93);

System.out.println(94);

System.out.println(95);

System.out.println(96);

System.out.println(97);

System.out.println(98);

System.out.println(99);

System.out.println(100);


// 예제2) 반복문을 사용하여 0 부터 100을 출력하시오

//값만 바뀐다

//시작 0, 끝 100, 증가량 1

for(int i =0; i<101; i++){ //int i는 지역변수 

System.out.println("System.out.println("+i+")");

}

// 예제3) 5 부터 15 까지의 합계를 구하시오

int sum = 0;

          sum+=6;        //sum = sum+6;

  sum+=7;

  sum+=8;

  sum+=9;

  sum+=10;

  sum+=11;

  sum+=12;

  sum+=13;

  sum+=14;

  sum+=15;


// 예제4) 반복문을 사용하여 5 부터 15 까지의 합계를 구하시오

//**나의 풀이

//5~15    = 5<= x <16  @11 가지

 //합계를 구하시오 = int sum = sum + x

//  +6+7+8+9+10+11+12+13+14+15


int sum = 5;                     // 합계는 5부터 시작

for( x = 0 ; x<11 ; x++){      // 연속해서 11번 증가하며 더함 

sum = sum + x ;        // 합에 더한 수와 이전 합을 더함 

}


int sum = 5;                     // 합계는 5부터 시작

for(int x=6 ; x<16 ; x++){     // 5이후 6부터 15까지 더해주기위한 변수 및 범위 선언 

sum = sum + x;           // 초기 값 + 증가하는 변수들과의 합

}


// 예제5) 5 부터 15 까지의 짝수들의 합계를 구하시오

//**나의 풀이

//5~15    = 5<= x <16  @11 가지

//짝수들   = x%2==0

 //합계를 구하시오 = int sum = sum + x

//5+6+7+8+9+10+11+12+13+14+15


int sum = 0;                     // 합계는 5부터 시작  <-- 짝수라는 조건에 부합 X

for(int x=5 ; x<16 ; x++){     // 5이후 6부터 15까지 더해주기위한 변수 및 범위 선언

 if(  x%2==0 ){

sum = sum + x;           // 초기 값 + 증가하는 변수들과의 합

}

}

System.out.println(sum);


//for(int i=5 ; i%2==0||i<16 ; i++){  

// i는 5~15까지 변하는 수  //여기에 넣을 수 없나

int sum = 0; for(int i=6 ; i<16 && i%2==0 ; i++){ // i<16 && i%2==0 //16보다 작고 짝수 // -> x 홀수가 나오자 마자 밖으로 튕 // i<16 || i%2==0 //16보다 작거나 짝수 // -> x 홀수여도 안으로 연산 sum = sum + i; }

/* 3. while문

- 반복 횟수를 모를 때

- 반복 횟수를 알 때

- 조건식과 수행해야 할 {   }만으로 구성되어 있다 

- 기본구조

while(조건식//t or f){

수행될 문장

}  */

for (int i = 0 ; i < 10 ; i++) {

System.out.println("for = " + i);

}

 = 

  int i= 0;           //밖에서 초기화, 

while(i < 10){    //안에서(조건식, 수행, 조건식, 수행, 조건식,.....)

System.out.println("while = " + i);

i++;

}



// 예제6) 23 부터 1092 까지의 합계를 구하시오

int sum = 0;           //  <-- 내가 가장 납득이 안되는, 습관적으로 따라하고 있는 부분

// 내가 초기화 한 합계에 대한 변수인데 왜 '0'으로 선언해야 하나?

for(int i=23 ; i<1093 ; i++){         //23<=i<1093

sum = sum + i;

}

System.out.println(sum);



// 예제6) 23 부터 1092 까지의 숫자들 중 3의 배수들의 합계를 구하시오

//방법1) for 문으로

int sum = 0;

for(int i=23 ; i<1093 ; i++){          //23<=i<1093

if(i%3==0){    // 일단 들어 오고나서, 3의 배수 구분 해줄 수 있으니까.. 

  // 앞에 했던 (초기화 ; 조건식; 증감식)방식에 무리가 있던거 같아

sum=sum + i;

}

}

System.out.println(sum);



//방법2) while 문으로

//시도1)

int sum = 0; // 합계를 담을 변수 선언 및 초기화

int i = 23; //반복문(while)에서 반복시킬 변수 선언 및 초기화

while( i<1093 && i%3==0){ //while에서 반복시킬 변수가 돌아가는 조건 

//-> 조건 자체가  맞긴한데 

//    두 조건을 동시에 만족시키면 들어가는 것 자체가 문제

//    걸름망 과정이 한번 더 필요

sum=sum+i;                 //조건을 만족하고 들어온, 반복하는 변수를 통해 

//구연하고자 하는 바

i++;                             // 변화하여 반복되는 변수를 위한 증감식

}

System.out.println(sum);



//시도2)

int sum = 0; // 합계를 담을 변수 선언 및 초기화

int i = 23; //반복문(while)에서 반복시킬 변수 선언 및 초기화

while( i<1093){      //반복시킬 조건 1) 숫자 범위

if( i%3==0){      //반복시킬 조건 2) 숫자 중 3의 배수

sum=sum+i;                 //구연하고자 하는 바

i++;                            // 변화하여 반복되는 변수를 위한 증감식

}

}

System.out.println(sum);

// 디버그가 고장 난줄 앎 

// 끝이 안남 ?? 무한이 반복되나?     //생각없이 따라간 것 같다... 

// 보니까... 23의 경우 계속 그 값 그대로 순환하네....  

//앞으로 반복문을 쓸때는 조건이 안 맞는 경우를 바로 대입해봐야 겠다



//시도3)

int sum = 0; // 합계를 담을 변수 선언 및 초기화

int i = 23; //반복문(while)에서 반복시킬 변수 선언 및 초기화

while( i<1093){      //반복시킬 조건 1) 숫자 범위

if( i%3==0){      //반복시킬 조건 2) 숫자 중 3의 배수

sum=sum+i;                 //구연하고자 하는 바

}

i++;                             // 변화하여 반복되는 변수를 위한 증감식

// 두번째 조건이 맞지 않을 경우에 바로 튕-이 아니라

// 다른 수로 바꿔서 대입할 수 있도록 

//첫번째 조건 블록 안에 기입

}

System.out.println(sum);



//ok 그럼 다른 방법은?

// ok 시도 1)

//계속해서 맘에 안들었던... 

//조건 절을 포함한 반복문 안에 조건문을 넣는 것...?

int sum = 0; // 합계를 담을 변수 선언 및 초기화

int i = 23; //반복문(while)에서 반복시킬 변수 선언 및 초기화

while( i<1093){      //반복시킬 조건 1) 숫자 범위

sum = (i%3==0)? sum+i : i++;                            

}

System.out.println(sum);


//이번에도 먹통... 디버그를 돌려본다....  어? 잘 돌아가네~  싶었는데...

//... i 가 안돌아 간다

//그르네...두번째 조건이 맞았을 경우, 반복문 변수를 증가시키질 않고 있네...

// 주의 사항 하나 더 추가 ! 

// 조건식을 쓸때는 반복문 변수의 증감 상태를 확인해야겠네

//정리 반복문을 쓸때는

// 반복문의 1)조건식이 false일 경우에 대한

// 2) 조건식의 true, false 를 떠나, 반복문용 변수의 증감상태 검토가 필요하다


// ok 시도 2)

int sum = 0; // 합계를 담을 변수 선언 및 초기화


int i = 23; //반복문(while)에서 반복시킬 변수 선언 및 초기화

while( i<1093){      //반복시킬 조건 1) 숫자 범위

sum = (i%3==0)? sum+i : i++;    

i++;                        

}

System.out.println(sum);

//... 양쪽 값 둘다 돌아가는 거 같았는데... 뭐지 값이 오르락 내리락 하다가 

// 뱅뱅도네???

 n)  '

//잘 나오나 싶었는데..

   n+1) 

// 값이 갑짜기 떨어지...

//        이번엔  " i++ ;" 이 부분을  생각없이 따라간 것 같다... 

// (i%3==0)가 참인 경우,  sum = sum+i 실행 ok 

// (i%3==0)가 거짓인 경우, sum = i++    

// 이건..  변수의 값을 sum에 넣는 다는 뜻이자나...

// 그동안 더해서 누적했던  sum+i는 버리공~ ㅋㅋㅋ  


// ok 시도 3)

int sum = 0; // 합계를 담을 변수 선언 및 초기화


int i = 23; //반복문(while)에서 반복시킬 변수 선언 및 초기화

while( i<1093){      //반복시킬 조건 1) 숫자 범위

sum = (i%3==0)? sum+i : sum ;    

i++;                        

}

System.out.println(sum);





// 예제7) 1 ~ ? 얼마까지의 합을 더했을 때 100 이상이 될까요?      

// while문에 대한 진퉁 문제 인듯

int i = 1 ;  

for( int sum =1 ; sum<99 ; sum++){    

sum = sum+i;     // i 를 증가시킬 방법?

}          //어? 지금 보니까 처음부터 과정이 틀렸네 ? ㅋㅋㅋㅋ

//시도 1.

int sum=0; //을 구하기 위한 변수 선언

// 1 <= i < y? //계속해서 증가하는 변수의 범위는?

//계속해서 증가하는 값에 대한 변수 선언 -> //반복문을 위한 변수 선언

int i=1; // 배우기로는 뭔지 모르는 수를 구할때 while을 쓰라는데... 체감이...

//while( 조건 ){      //어떤 유형으로 조건을 넣어야하는지.. 다시말해 변수가 2이상 일텐데..

// 이번 꺼는 y ... 구하고자 하는 값 y는 몇인지는 모르지만

// 그 동안의 증가되온 변수들의 합( sum+i )

// sum이 100을 넘는 순간의 '반복문 변수' i 의 값


// 질문 1)

//while( 조건절 ) 뭔지 모르는 변수 i(y) 에 대한 조건이 들어가야 하나?

// 궁극적인 조건이 되는 sum의 상태에 대한 조건으로 들어가야 하나

//근데.. 생각해보니까... 조건1부터 sum으로 맊으면 애초에 진입 자체가 안될듯..

// 앞에 예제처럼.. 그럼 일단 반복되는 합계를 구하고

// 조건 안에 조건을 어떻게 만들지 고민해보자

//while(i...){ //어? 어떻하지? i에 대한 조건? 조건이랄게 없자녀?

// 여기서 i는 조건없이 계속 증가하는 수인데 일단 다 받어봐?

//,.,,아.. 내 생각이 아니다.. 문득 어제 수업 시간 한 장면이 떠올랐다.. 아...이런..

}

while(true) {    // i를 증가 시켜야하니까..  일단 드루와

i++  ;       // 일단 선언했던 int i =1 이 들어오고 이걸 ++ . but  아직  int i =1 !

sum = sum + i ; // 증가되는 반복변수들의 합을 구해야지  

// 아..  int i 가 연산 전에 2 가 되네... 

}

// 아...       이번엔  " i++ ;" 의 위치, 변수 선언 및 초기화를 생각없이 따라간 것 같다... 


//다시.. 시도 2- 1단계

int sum=1; // 1부터 시작하니까 합의 디폴트는 1 int i=2 ; // 합이 1부터 시작하니까.. 증가되는 반복문용 변수는 2부터 시작 // 확인 용 System.out.println(" 반복문 전 i : "+i); while(true) { sum = sum + i ; // 확인 용 System.out.println(" 반복문 연산 전 i :" + i); // 확인 용 System.out.println(" 반복문 연산 후 sum :" + sum);         i++ ; // 확인 용 System.out.println(" 반복문 증감 후 i :" + i); }

// 여기까지가 일단, 증가하는 반복문용 변수들의 합을 구하는 구조

// 그렇게 증가 시키다가 sum이 100을 넘기면

// 반복문을 종료시키고. 그때의 각각의 값을 출력하면 되겠구나.... 아... 이런 생각이 떠오르네...


//다시.. 시도 2- 2단계 : sum < 100 인 경우에 멈추기

int sum=1; int i=2 ; while(true) {

sum = sum + i ; i++ ; // 여기까지가 반복되는 수의 합

if(sum>=100){ // 여기서부터가 sum이 100이거나 100을 넘어서는 순간을 찾기 위한 조건식

System.out.println( "100을 넘기는 첫번째 값 반복문 증감변수 i :"+ i );

System.out.println( "그때의 합은 :"+ sum );

}

break; // 아.. 그러고보니... 아까 while문에서는 while문 특유의 break를 안썼네...

}

System.out.println( " 돌아간거 맞니? 확인 용 sum : "+ sum );


// 아...먹통 .. 뭐가 문제지...   braek point도 안돌아감.....

// 다행이?? ㅋㅋㅋ... break를 빼보니까... 돌아가긴하는데... 무한증식......     


// break 위치를 if문으로 이동.... 

// 된다. 정상 답 도출... 

// 왜지?!!!!!

// break를

// while안에 if 문 만족하는 경우 그 안의 구문을 다 수행하고 나오면 break를 실행하도록 넣는데..  

// 아.. 

// 그럼... while 을 통과한 첫 번째 조건문부터 밖으로 튕기겠네... 

// 그르네.. System.out.println( " 확인 sum :"+ sum );를 해보니까...

// while 을 통과하자마자 break에 걸려서....  바로 나왔네....


//다시.. 시도 3

int sum=1; int i=2 ; while(true) {

sum = sum + i ; i++ ;

if(sum>=100){

System.out.println( "100을 넘기는 첫번째 값 반복문 증감변수 i :"+ i );

System.out.println( "그때의 합은 :"+ sum );

break;

}

}






//[문제]

//1~? 합이 100 이상이 될까요?

// 1<= x < y 

// int sums = 0;  // 100 이상의 합계

// int is= 0; // 증가하는 수

// while(sums>99){

// sums = is + sums;

// is++; // 넘은 순간에도 마지막에 한번 더 찍는다 1

// }

// System.out.println(is); 

//타입 1

//시작하는 수

//합계

//선언을 하는 순간이 아닌, 초기화되는 값이 적용되는 순간을 고려해야한다

//타입 2

//break 사용 가장 까까운 반복문을 나온다! 

// int start = 1;

// int sum3 =0;

// while(true){

// sum3 += start;

// if(sum3>=100){

// break;

// }

// start++;

// }

// System.out.println(start);

// //Scanner //import java.util.Scanner; 추가됨

// Scanner sc = new Scanner(System.in);  //콘솔창에 입력받기 위해 한번 선언한 상태에서는main()중엔 sc.으로 계속 쓸 수 있다

// System.out.println("합계가 몇 이상일지 숫자를 입력해주세요");

// //sc.nextInt();

// //2000

// int endSum = sc.nextInt();// "숫자" 받을 때 

//

// int start = 1;

// int sum3 =0;

// while(true){

// sum3 += start;

// if(sum3>=endSum){

// break;

// }

// start++;

// }

// System.out.println(start);

//

// System.out.println("문자를 입력해주세요");

// String str = sc.next(); //"문자"열을 받을 때 //콘솔창에 입력받기 위해 한번 선언한 상태에서는 sc.으로 계속 쓸 수 있다

// System.out.println(str);

//중첩  

//2 * 1 = 2    숫자만 변수에 담는다

// int dam =2;

// int gob =1;

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

//2 * 1 = 2   

//2 * 2 = 4    

// int dam =2;

// System.out.println(" --- 2수작업 --- ");

// System.out.println(dam +"*"+ 1  +"="+ dam*1);

// System.out.println(dam +"*"+ 2  +"="+ dam*2);

// System.out.println(dam +"*"+ 3  +"="+ dam*3);

// System.out.println(dam +"*"+ 4  +"="+ dam*4);

// System.out.println(dam +"*"+ 5  +"="+ dam*5);

// System.out.println(dam +"*"+ 6  +"="+ dam*6);

// System.out.println(dam +"*"+ 7  +"="+ dam*7);

// System.out.println(dam +"*"+ 8  +"="+ dam*8);

// System.out.println(dam +"*"+ 9  +"="+ dam*9);

// System.out.println(" --- for문 --- ");

// int dam =2;

// for(int gob=1 ; gob<10 ; gob++){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// }

// int dam =3;

// for(int gob=1 ; gob<10 ; gob++){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// }

// int dam =4;

// for(int gob=1 ; gob<10 ; gob++){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// }

// int dam =5;

// for(int gob=1 ; gob<10 ; gob++){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// }

// int dam =6;

// for(int gob=1 ; gob<10 ; gob++){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// } ...


// System.out.println(" --- 중첩 for문 --- ");  // 안에서 부터 

// for(int dam=2 ; dam<10 ; dam++){

// for(int gob=1 ; gob<10 ; gob++){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// }

// System.out.println("");

// }

//문제

//구구단에서 짝수단에 홀수 곱만 출력

// for(int dam=2 ; dam<10 ; dam++){

// if(dam%2==0){

// for(int gob=1 ; gob<10 ; gob++){

// if(gob%2!=0){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// }

// }

// System.out.println("");

// }

// }

// for(int dam=2 ; dam<10 ; dam++){

// for(int gob=1 ; gob<10 ; gob++){

// if(dam%2==0 && gob%2!=0){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// }

// }

// System.out.println("");

// }

//문제 - for문을 while문으로 변경 

// for(int dam=2 ; dam<10 ; dam++){

// for(int gob=1 ; gob<10 ; gob++){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// }

// System.out.println("");

// }

// int dam=2 ;

// while(dam<10){

// int gob=1 ; // 안에 넣는 이유를 이제 알겠네...! 

// // 여기부터가 두번때 반복문의 덩어리 이잖아!

// while(gob<10){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// gob++;

// }

// dam++;

// System.out.println("");

// }

//2단만 찍어라

// int dam=2 ;

// while(dam<10){

// int gob=1 ;

// while(gob<10){

// System.out.println(dam +"*"+ gob  +"="+ dam*gob);

// gob++;

// }

// dam++;

// System.out.println("");

// break; // 2부터 시작하니까 한바퀴만 돌리고 나가자 

// }


int dam=2 ;

int gob=1 ;

while(gob<10){

System.out.println(dam +"*"+ gob  +"="+ dam*gob);

gob++;

}

System.out.println("");

/* 4. do while

- while문의 변형으로 기본구조는 while문과 같으나 블럭{}을 먼저 수행하고 조건식을 판단한다

- 기본구조

do{

}while(조건식); */

//예제) 사용자로부터 몇번을 받을 지 모를때. 사용자로부터 임의의 문자를 임의의 번 입력받다가 중간에 'x'가 나오면 중단

// Scanner sc = new Scanner(System.in);//입력기능 추가

// System.out.println("문자열을 입력해주세요");//무한 반복 

// String str = sc.next(); //문자열 입력

// System.out.println(str);

Scanner sc = new Scanner(System.in);

String str = null;

do{

System.out.println("문자열을 입력해주세요. \n그만하려면 x를 실행하세요");//무한 반복 

str = sc.next(); 

System.out.println(str);

}while(!str.equals("x")); //입력받은 값은 비교가 안된다. 그래서 

//기본형 비교는 '==' 참조형 비교는 '.equals'


/* 

5. break문

- 현재 위치에서 가장 가까운 'switch'문 또는 '반복'문을 '나갈때' 사용

6. continue문

- '반복문' 내에서만 사용가능!

- 반복문 끝으로 이동하여 '다음 반복문'으로 넘어간다

- skip용 */

for(int jc=0 ; jc <20 ; jc++){

if(jc%2==0){

continue; //짝수일때만 찍지말고 그냥 넘어가라 

}

System.out.println(jc);

}



댓글