- [Java 기본]제어문

Posted by 겨울에
2011. 5. 14. 15:43 scrap/ Java/JSP
출처 : http://cafe.naver.com/litave/356


 


//===========================================================================//
  본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
    기본으로 하여 정리하였습니다.
  - 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
  작성자 : litwave
//---------------------------------------------------------------------------//

<목차>
1. 예약어와 제어문 5가지
2. if ~ else
3. switch ~ case ~ break
4. for
5. while
6. do while

//---------------------------------------------------------------------------//

* 제어문
a) 문장을 제어하는 것.
b) 일반적으로 프로그램은 위에서 아래, 좌에서 우로의 순서로 실행 되지만
    특정 구간의 단순 반복이 연속 되는 경우나 
    특정 구간을 조건에 따라 건너뛰는 경우 제어문을 사용한다. 


1. 예약어와 제어문 5가지
1) 제어문
  a) if ~ else
  b) switch ~ case
  c) for
  d) while
  e) do ~ while
2) 예약어
  f) break
  g) continue

2. if ~ else
- 만약에 ~ 라면, 그렇지 않다면.
- 세가지 형식이 존재.
1) 형식 1     if (조건식)    ;   
   a) 조건식은 true 나 false 의 결과를 돌려 줄 수 있는 조건식 이어야 한다.
   b) 조건식이 true 면 ; 를 만나는 한 문장만을 실행 한다.
   c) 여러문장의 조건식을 처리 하기 위해서는 {}(블럭) 으로 묶어 주어야 한다.

2) 형식 2 : 삼항연산자와 유사.
   if(조건식)
               ;         // 참일경우 ;을 만나는 한 문장 실행
   else
               ;         // 거짓일 경우 else 이후에 ; 한 문장 실행
  a) 여러문장 사용시 블럭으로 묶어 주어야 한다.

3) 형식 3
  a) 생년월일을 주민등록 번호를 통해서 만드는 프로그램을 작성하시오.
  b) 주민번호 앞자리 시작 위치 1800년대생은 남=9,여=0을 사용.
    int year = 0;
    if(i == 9|| i == 0)    year = 1800;
    else if (i==1 || i==2)    year = 1900;
    else if (i==3 || i==4)    year = 2000;
    else    error;

===================================
수업중 연습 문제 Ex1)

수를 입력하세요.
Su1 = 57        // 57 입력
Su2 = 23        // 23 입력
Su3 = 76        // 76 입력
76 > 57 > 23    // 큰 수부터 출력

해답 : Ex0102_01.java
===================================

프로그램 기법.
a) 문제를 분석해서 프로그램의 핵심을 찾는다.
b) 결과를 먼저 그려 놓고, 그 결과에 맞추어 프로그램을 채워가면 쉽게 만들수 있다.
c) 에러 방지를 위해서 초기화를 무조건 시켜라.


3. switch ~ case ~ break
1) if문과 유사하나 조건이 너무 많을 때 성능 향상을 위해서 사용한다.
  a)  if(i == 0)
      else if(i == 1)
      .
      .
      .
      else if(i == 9)
      else 
    의 문제.. 
     - 필요 없는 비교를 계속하게 된다.
     - i가 0일 때와 i가 9일 때의 속도차가 발생한다.
  b) int나 char 의 알려진 값일 경우에는 컴파일러가 알고 있다가 그 위치로 바로 이동할 수 있도록 만듬
  c) Switch Case 는 해당 위치로 이동만을 시켜 준다.

2) 형식
     switch(int 및 char의 데이타) {                // 이동 위치
       case 1:                                     // 해당 위치를 나타내는 예약어는 case 가 사용된다.
       case 2:
       case 3:
              ...
       defalt:                                     // 나머지 모든 것이 이동할 수 있는 위치
     }             
   a)  해당 블럭의 특정한 위치로만 이동한다.
   b) break : 
       - if 문의 블럭을 제외하고, switchforwhiledo while 등의 문장에서  
         하나의 블럭을 탈출하는 탈출 예약어 이다.

  switch(i) {
    case 0case 2case 4System.out.println("여성입니다."); break;
    case 9case 1case 3System.out.println("남성입니다."); break;
    defalt : --------
  }
  * 형태의 응용도 가능하다.

===================================
수업중 연습 문제 Ex2)

성적을 입력하세요!
국어 = 100         //100 입력
영어 = 90          // 90 입력
수학 = 80          // 80 입력
총점 = 270
평균 = 90.0
학점 = A

해답 : Ex0102_02.java
===================================


4. for : ~ 동안(수치와 밀접한 관련이 있음)
- 특정 수치에 의한 반복을 처리하는 loop 문 + 행위
1for(초기화 구문;조건식  ; 증감식 )  ;
  a) 초기화 : 임의의 변수를 선언하면서 초기화 할 수 있다.
    - for문의 블럭을 빠져나가면 사용할 수 없는 변수이다.(C와 동일)
    - C++는 블럭을 빠져 나가도 사용이 가능한 변수로 선언 된다.
    - 외부에서 선언하고 초기화 해서 사용할 수 있다.
    - 아무것도 적지 않을 수 있다.
    - 내부에서 선언 및 초기화 하고, 그대로 외부에서 사용할 수는 없다.

  b) 조건식
    - true 일 경우만 실행
    - 아무것도 적지 안으면. true 로 처리 된다.

  c) 증감식
    - 블럭의 마지막 다음에 증감식으로 이동한다.

  int i = 0;

2) 이중 for문 - 다중 for문은 안에 부터 생각하면 쉽다.
  a) 사용 예
   for(int i=0; i<5; i++) {
     for(int j=0; j<5; j++) {
       System.out.print("*");
     }
     System.out.println();
   }

-출력 :
   *****
   *****
   *****
   *****
   *****

  b) 사용 예
   for(int i=0; i<5; i++) {
     for(int j=0; j<5; j++) {
       if(j==2)
         break;
       System.out.print("*");
     }
     System.out.println();
   }

-출력:
   **
   **
   **
   **
   **

  c) 사용 예
   for(int i=0; i<5; i++) {
     for(int j=0; j<5; j++) {
       if(j==2)
         continue;             //if문으로 제외하고 가장 가까이 있는 블럭의 마지막을 맞났다고 생각한다.
       System.out.print("*");
     }
     System.out.println();
   }

-출력:   ****   ****   ****   ****   ****

3) for문은 라벨을 붙여서 사용할 수 있다.
  a) 사용 예 - up
    for(int i=0; i<5; i++) {
     down: for(int j=0; j<5; j++) {
       if(j==2)
         break down;             //down 이라는 라벨을 가진 for문을 break 해라
       System.out.print("*");
     }
     System.out.println();
   }
   //출력은 *이 10개 찍힘

  b) 사용 예
up:     for(int i=0; i<5; i++) {
down:     for(int j=0; j<5; j++) {
            if(j==2)
            continue down;             //down 이라는 라벨을 가진 for문을 continue 해라
            System.out.print("*");
          }
        }
        System.out.println();
        //출력은 *이 20개 찍힘

  c) 사용 예
up:    for(int i=0; i<5; i++) {
down:    for(int j=0; j<5; j++) {
           if(j==2)
             break up;             //up 이라는 라벨을 가진 for문을 빠져나가라
           System.out.print("*");
         }
         System.out.println();
       }
       // 출력은 *이 2개 찍힘

  d) 사용 예
up:     for(int i=0; i<5; i++) {
down:     for(int j=0; j<5; j++) {
            if(j==2)
            continue up;             //break down과는 차이점 알 것
            System.out.print("*");
        }
        System.out.println();
      }
      //출력은  *이 10개 찍힘(옆으로..)

===================================
수업중 연습 문제 Ex3)
수를 입력하세요.
Su1 = 10
Su2 = 40
배수 = 4

10~30 사이의 4의 배수의 합은 -- 입니다.
해답 : Ex0102_03.java
===================================

5. while : ~ 동안
  1while(조건식)  수행문장;
    a) 조건식이 참(true)인 동안 수행 문장을 반복해서 수행한다.

6. do while : 해라 ~ 하는 동안
  - 조건이 참이건 거짓이건 간에 무조건 한번은 실행하라는 명령어
  - 반드시 ; 이 붙는 제어문
1) 형식
   do {
        수행문장;
   } while (조건식);
   
   a) 최초 수행 문장을 한번 실행 후 조건식이 참(true)인 경우 
      수행문장을 반복하여 실행한다.
   
2) 예외 처리 방법.
  int kor = 0;
  do {
    System.out.println("국어 = ");
    kor = Integer.parseInt(br.readLine());
  } while(kor < 0 || kor > 100);

======================================
수업중 연습 문제 Ex4)

Ex2예제에서.. 0~100사이로 한정 시킬것.

해답 : Ex0102_02.java
======================================


오늘의 과제 :
1. A~Z까지 26번찍을껏.. 매개변수를.. 모두.. char을 쓴다.
  A-------------Z
  A-------------Z
  A-------------Z
  A-------------Z
  A-------------Z

2. 앞에서 부터 하나씩 줄여간다.
  A------------Z
  B-----------z
  C----------Z
  .
  .
  Z

3. A-------------Z
   A------------Y
   A-----------X
   .
   .
   A

4. A--------------Z
    B------------Y
     C----------X
       .      .
       .      .
          MN

5.
  *** TEXT 계산기 ***
  Su1 = 23                //   23입력
  yon(+,-,*,/,%) = a      //    a입력
  yon(---------) = /      //   / 입력
  Su2 = 0                 //   연산자가 /이나 % 일 경우 0을 입력하면 --> 입력 에러
  Su2 = 5                 // 5 입력  23/5 = 4
  계속(y/n)? a            // a 입력
  계속(y/n)? y            // y 입력



//---------------------------------------------------------------------------//
// 수업 중 예제 소스

// Ex0102_01.java
import java.io.*;

public class Ex0102_01 {
    public static void main(String [] ar) throws IOException {
        InputStreamReader is = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(is);
        
        System.out.println("수를 입력하세요. ");
        System.out.print("Su1 = ");
        int su1 = Integer.parseInt(br.readLine());
    
        System.out.print("Su2 = ");
        int su2 = Integer.parseInt(br.readLine());

        System.out.print("Su3 = ");
        int su3 = Integer.parseInt(br.readLine());
        
        if(su2 >= su1 && su2 >= su3) {
        //su1 <- su2;
            int imsi = 0;
            imsi = su1;
            su1 = su2;
            su2 = imsi;
        } else if(su3 > su1 && su3 > su2) {
        //su1 <- su3;
            int imsi = 0;
            imsi = su1;
            su1 = su3;
            su3 = imsi;
        }
        if (su3 >= su2) {
        //su2 <- su3;
            int imsi = 0;
            imsi = su2;
            su2 = su3;
            su3 = imsi;
        }
      System.out.println(su1 + " > " + su2 + " > " + su3);
    }
}


// Ex0102_02
import java.io.*;

public class Ex0102_02 {
    public static void main(String [] ar) throws IOException {
        InputStreamReader is = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(is);
        System.out.println("성적을 입력하세요");
        int su1 = 0;
        int su2 = 0;
        int su3 = 0;
        do {
          System.out.print("국어 = ");
          su1 = Integer.parseInt(br.readLine());
        } while (su1 > 100 || su1 < 0);
    
        do {
            System.out.print("영어 = ");
            su2 = Integer.parseInt(br.readLine());
        } while (su2 > 100 || su2 < 0);

        do {
            System.out.print("수학 = ");
              su3 = Integer.parseInt(br.readLine());
            } while (su3 > 100 || su3 < 0);
            
            int tot = su1 + su2 + su3;
            System.out.println("총점 = " + tot);
            
            float ave = tot / 3.0f;
            System.out.println("평균 = " + ave);
            
            System.out.print("학점 = " );
            switch((int)ave/10) {
            case 10case 9System.out.println("A"); break;
            case  8System.out.println("B"); break;
            case  7System.out.println("C"); break;
            case  6System.out.println("D"); break;
            defaultSystem.out.println("F"); break;
        }
    }
}


// Ex0102_03
import java.io.*;

public class Ex0102_03 {
    public static void main(String [] ar) throws IOException {
        InputStreamReader is = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(is);
        System.out.println("수를 입력하세요");
        System.out.print("Su1 = ");
        int su1 = Integer.parseInt(br.readLine());

        System.out.print("Su2 = ");
        int su2 = Integer.parseInt(br.readLine());

        System.out.print("배수 = ");
        int mul = Integer.parseInt(br.readLine());
        
        int sum = 0;
        
        if(su1 > su2) {
            sum = su1;
            su1 = su2;
            su2 = sum;
          sum = 0;
        }

        for(int i=su1; i <= su2; i++) {
            if(i%mul == 0)
               sum += i;
        }
        System.out.println(su1 + " ~ " + su2 + "의 배수의 합은 " + sum + " 입니다.");
    }
}

//===========================================================================//


제어문 관련 문제를 몇문제 올려봅니다. 한번 풀어보세요.

Q1. 구구단을 출력1.
출력 양식:
1단
2단
.
.
.
9단

Q2. 구구단을 출력2
출력 양식:
1단 2단 3단
4단 5단 6단
7단 8단 9단

Q3. 16진수의 값을 받아서 2진수로 표현하시오.


Q4."*" 를 이용하여 마름모 모양을 출력하시오.
*
***
*****
*******
*********
*********** 
*********
*******
*****
***
*

Q5. "*"를 이용하여 다음을 출력하시오.
*
**
***
****
*****
****** 
*******
********
*********
**********
*********
********
*******
******
*****
****
***
**
*

Q6. 입력받은 수의 약수들을 구하시오.

Q7. 1부터 입력받은 수까지 중 존재하는 모든 소수(약수가 1과 자신뿐인 수)를 구하시오.


Q8. 다음을 출력하시오. (단 2중 for문 사용 3중 X )
*
**
***
****
*****
******
*******
********
*********
**********
*
**
***
****
*****
******
*******
********
*********
**********
*
**
***
****
*****
******
*******
********
*********
**********

Q9. Bubble Sort 

Q10. 마방진(홀수)



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

1. 아래와 같은 결과를 출력하는 프로그램을 작성하시오
이 름 : 홍길동
나 이 : 15세
키 : 162.3cm
혈액형 : O형

2. 10진수 20을 8진수, 16진수로 변환하는 프로그램을 작성하시오.

3. 문자 'Q', 'Y'의 아스키 코드값을 변환하는 프로그램을 작성하시오.

4. 용돈 환폐단위 환산 프로그램

278970원(double 형변수로 지정)을 10000원권, 5000원권, 1000원권, 500원권, 100원권, 50원권, 10원권 단위로 환산하여 각각의 개수를 출력하시오.
(출력결과)
10000원권 => 27개
5000원권 => 1개
1000원권 => 3개
500원권 => 1개
100원권 => 4개
50원권 => 1개
10원권 => 2개

5. 초수를 시, 분, 초 단위로 환산하는 프로그램을 작성하시오
54321초를 시, 분, 초 단위로 환산하시오.

(출력결과)
54321초는 15시간 5분 21초 입니다.

 

6. 1년은 일, 시, 분, 초로 환산하는 프로그램
1년은 365.2422일이다. 이는 몇 일, 몇시간, 몇분, 몇초인가를 출력하시오.
(단,초수는 소수점 이하 둘째 자리까지 출력하시오)

(출력결과)
365.2422일은 365일 5시간 48분 46.08초 입니다.

7. 주행거리와 시속은 입력 받아 주행시간을 계산하시오.
주행거리의 단위는 Km, 시속은 km/h, 주행시간은 시, 분, 초 단위로 출력하시오(단, 초수는 소수점 이하 세째자리까지 출력하시오.)

(출력결과)
xxxxx km => xx시간 xx분 xx.xxx초 소요됨.

8. 두 정수를 입력받아 합, 차, 곱, 몫의 값을 출력하는 프로그램을 작성하시오.
(입력형태)
두개의 정수를 입력하시오 : 10 20

(출력결과)
10+20 = 30
10-20 = -10
10*20 = 200
10/20 - 0.05



9. 이름, 국어점수 영어점수를 입력받아 아래와 같이 출력하시오.
(입력)
이름 : 홍길동
국어점수 : 80
영어점수 : 87

(출력)
이름 국어 영어 총점 평균
홍길동 80 87 167 83.50

10. 입력받은 정수의 2배의 값과 제곱의 값을 출력하시오.
(입력형태)
한 개의 정수를 입력하시오 : 7

(출력결과)
7의 2배수 => 14
7의 제곱 => 47