본문 바로가기
연습 문제

[연두] Warming-up C Programming Chapter 5 : 연습 문제 풀이

by 알기 쉬운 코딩 사전 2022. 12. 26.
반응형

연습문제와 소스코드는 제가 직접 풀어 작성한 것이므로 오타, 오답 이 존재할 수 있습니다.

참고 부탁드립니다.

 

Quiz(p.153)

 

1. 조건식이 참이면 지정된 문장을 수행하는 제어문은?

 

[답]

① if

 

2. if else와 비슷한 기능을 제공하는 연산자는?

 

[답]

④ 조건 연산자

 

3. 정수식의 값에 따라 여러가지 case 중 하나를 선택하여 문장을 수행하는 제어문은?

 

[답]

② switch

 

4. switch에서 일치하는 case가 없을 때는 수행할 문장을 적어주기 위한 키워드는?

 

[답]

④ default

 

Quiz(p.168)

 

1. 특정 횟수만큼 반복해서 수행할 문장이 있을 때 주로 사용되는 제어문은?

 

[답]

③ for

 

2. for문에서 반드시 한번은 수행되는 것을 모두 고르시오.

 

[답]

① 초기식

②조건식

 

3. 조건식과 반복할 문장으로 구성되며 루프의 시작 부분에서 조건식을 검사하는 제어문은?

 

[답]

④ while

 

4. while문으로 무한 루프를 만드는 방법은?

 

[답]

②while (1) {…}

 

5. 다음 중 무한 루프를 모두 고르시오.

 

[답]

①for ( ; ; ) a += 2;

②whule (1) a += 2;

 

Quiz(p.176)

 

1. 루프의 시작 부분으로 이동해서 조건문 검사부터 다시 계속하도록 만드는 분기문은?

 

[답]

① continue

 

2. 조건이 만족할 때 루프를 탈출하기위한 목적으로 사용되는 분기문은?

 

[답]

② break

 

연습문제(p.177~181)

 

1. if에 대한 설명 중 잘못된 것을 모두 고르시오.

 

[답]

② if에는 반드시 else가 필요하다.

⑤ if의 조건식을 생략할 수 있다.

⑥ if의 조건식이 참일 때 수행할 문장이 여러 개여도 {}로 묶어줄 필요가 없다.

 

2. if의 조건식이 거짓일 때 수행할 문장을 기술하기 위해서 필요한 키워드를 쓰시오.

 

[답]

else

 

3. 다음 코드에서 조건 연산자를 이용한 문장을 if로 다시 작성하시오.(빨간색 박스 부분)

 

[답]

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void){
    int x, y, max;
    
    printf("두 수를 입력하세요: ");
    scanf("%d %d", &x, &y);
    
    //max = x > y ? x : y;
    //정답
    
    if( x > y)
    	max = x;
    else
    	max = y;
    
    printf("큰 수: %d\n", max);
}

 

4. switch에 대한 설명 중 잘못된 것을 모두 고르시오.

 

[답]

③ case문을 빠져나가기 위한 break는 생략할 수 없다.

④ case 다음에 실수 값이나 문자열을 지정할 수 있다.

⑧ case문에서 수행할 문장이 여러개여고 {}로 묶어줄 필요 없다.

 

5. 다음의 switch문을 if else로 다시 작성하시오. (빨간색 박스 부분)

 

[답]

#include <stdio.h>

int main(void){
    int month;
    int fee;
    
    printf("몇 월? ");
    scanf("%d", &month);
    
    /*
    switch(month){
        case 7:
        case 8:
            fee = 7000;
            break;
        case 6:
        case 9:
            fee = 55000;
            break;
        default:
            fee = 40000;
        break;
    }
    */
    
    if (month == 7 || month == 8)
        fee = 70000;
    else if (month == 6 || month == 9)
        fee = 55000;
    else
        fee = 4000;
        
    printf("입장료 : %d\n", fee);
}

 

6. for에 대한 설명 중 잘못된 것을 모두 고르시오.

 

[답]

② for의 초기식, 조건식, 증감식은 생략할 수 없다.

③ for의 반복할 문장은 반드시 한번은 수행된다.

⑥ for에서 반복할 문장이 여러 개면 {}로 묶어준다.

⑦ for에서 루프 제어 변수를 여러개 사용할 수 있다.

⑧ for 안에 for를 중첩할 수 없다.

 

7. 다음의 for문으로 작성된 코드를 while로 다시 작성하시오. (빨간색 박스 부분)

 

[답]

#include <stdio.h>

int main(void){
    int i;
    int sum = 0;
    int times = 1;
    
    /*
    for (i = 1; i <= 10; i++){
        sum += i;
        times *= i;
    }
    */
    
    i =1;
    while ( i<= 10){
        sum += i;
        times *= i;
        i++;
    }
    
    printf("합:%d, 곱:%d\n", sum, times);
}

 

8. while과 do while에 대한 설명 중 잘못된 것을 모두 고르시오.

 

[답]

③ do while문의 조건식은 루프의 시작 부분에서 검사한다.

④ while은 반복할 문장을 반드시 한번은 수행한다.

⑥ while과 do while의 조건식은 생략할 수 없다.

⑦ while은 for에 비해 정형화된 루프를 구현하는 데 적당하다.

 

9. 분기문과 분기문의 역할을 찾아서 연결하시오.

 

[답]

(1) break >> ② switch나 반복문을 탈출한다.

(2) continue >> ① 루프의 시작이나 끝부분으로 이동한다.

(3) goto >> ④ 레이블이 지정한 위치로 이동한다.

(4) return >> ③ 함수를 호출한 곳으로 돌아간다.

 

10. 분기문에 대한 설명 중 잘못된 것을 모두 고르시오.

 

[답]

① return문에는 반드시 값을 지정해야 한다.

② break는 if문을 탈출한다.

④ for문 안에서 continue를 만나면 루프의 시작 부분으로 제어의 흐름을 이동한다.

⑥ 반복문 안에 switch문이 포함된 경우에 break를 이용해서 switch문과 반복문을 한번에 탈출할 수 있다.

⑧ continue를 이용하면 루프의 시작 부분이나 끝부분이 아닌 위치에서 루프를 탈출할 수 있다.

 

11. 다음 중 무한 루프를 모두 고르시오.

 

[답]

① for( ; ; ) {printf("a");}

② for(i=0; i>1; i++) {printf("%d", i);}

④ while (2){printf("a");}

⑥ do{printf("a");} while (1);

 

12. 다음 프로그램의 실행 결과는?

 

#include <stdio.h>

int main(void){
    int n = 1;
    
    if (n > 0){
        n *= 2;
        if(n < 5)
            n += 5;
        else
            n -= 5;
    }
    else
        n++;
        
    printf("n = %d\n", n);
}

 

[답]

n = 7

 

13. 다음 프로그램의 실행 결과는?

 

#include <stdio.h>

int main(void){
    int i;
    int n = 0;
    
    for (i=1; i<10; i+=2){
        if (i % 3 == 0)
        continue;
        n+=i;
    }
    
    printf("n = %d\n", n);
}

[답]

n = 13

 

프로그래밍과제(p.182~183)

 

1. 절대 평가로 학점을 계산하려고 한다. 시험점수(0~100점)를 입력받아서 90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 60점 미만은 F로 학점을 계산하는 프로그 램을 작성하시오.

 

[답]

#include <stdio.h>

int main(void){
    int score;
    
    printf("점수? ");
    scanf("%d", &score);
    printf("학점 : ");
    
    if (score <= 100 && score >= 90)
        printf("A");
    else if (score < 90 && score >= 80)
        printf("B");
    else if (score < 80 && score >= 70)
        printf("C");
    else if (score < 70 && score >= 60)
        printf("D");
    else
        printf("F");
        
    return 0;
}

 

2. 상대 평가로 학점을 계산하려고 한다. 등수와 전체 인원수를 입력받아서 성적 상위 10% 까지는 A, 상위 30%까지는 B, 상위 60%까지는 C, 상위 90%까지는 D, 하위 10%는 F로 학점을 계산하는 프로그램을 작성하시오.

 

[답]

#include <stdio.h>

int main(void){
    int rank, cnt;
    
    printf("등수? ");
    scanf("%d", &rank);
    printf("전체 인원 수? ");
    scanf("%d", &cnt);
    printf("학점 : ");
    
    if (rank > 0 && rank <= cnt * 0.1)
		printf("A");
    else if (rank > cnt * 0.1 && rank <= cnt * 0.3)
    	printf("B");
    else if (rank > cnt * 0.3 && rank <= cnt * 0.6)
    	printf("C");
    else if (rank > cnt * 0.6 && rank <= cnt * 0.9)
    	printf("D");
    else
    	printf("F");
        
    return 0;
}

 

3. 이차원 평면에 있는 점의 좌표 (x,y)를 입력받아 어느 사분면의 점인지 출력하는 프로그 램을 작성하시오.

 

1) if else 사용

 

[답]

#include <stdio.h>

int main(void){
    int x, y;
    
    printf("점의 좌표 (x,y)? ");
    scanf("%d %d", &x, &y);
    
    if(x < 0 && y > 0)
    	printf("2사분면에 있습니다.");
    else if(x > 0 && y > 0)
    	printf("1사분면에 있습니다.");
    else if(x < 0 && y < 0)
    	printf("3사분면에 있습니다.");
    else
    	printf("4사분면에 있습니다.");
    
    return 0;
}

 

2) 다중 if 사용

 

[답]

#include <stdio.h>

int main(void){
    int x, y;
    
    printf("점의 좌표 (x,y)? ");
    scanf("%d %d", &x, &y);
    if (x > 0 && y > 0)
    	printf("1사분면에 있습니다.");
    if (x < 0 && y > 0)
    	printf("2사분면에 있습니다.");
    if (x < 0 && y < 0)
    	printf("3사분면에 있습니다.");
    if (x > 0 && y < 0)
    	printf("4사분면에 있습니다.");
    
    return 0;
}

 

4. 연도를 입력받아 윤년인지 검사하는 프로그램을 작성하시오. 윤년이 되는 조건은 다음과 같다.

4로나누어떨어지는해는윤년이다.

4로나누어떨어지는해중에서100으로나누어떨어지는해는윤년이아니다.

100으로 나누어 떨어지는 해 중에서 400으로 나누어 떨어지는 해는 윤년이다.

 

[답]

#include <stdio.h>

int main(void){
    int year;
    
    printf("연도? ");
    scanf("%d", &year);
    
    if((year%4==0&&year%100!=0)||year%400==0)
    	printf("%d년은 윤년입니다.", year);
    else
    	printf("%d년은 윤년이 아닙니다.", year);
        
	return 0;
}

 

5. 온도를 입력받아 섭씨 온도는 화씨 온도로, 화씨 온도는 섭씨 온도로 변환하는 프로그램 을 작성하시오." 27C " 또는 " 27F" 처럼 섭씨인지 화씨인지 구분할 수 있는 문자를 함께 입력받는다.함께 입력된 문자가 'C'면 섭씨 온도 이므로 화씨 온도를 구해서 출력하고, 입력 된 문자가 'F'면 화씨 온도이므로 섭씨온도를 구해서 출력한다.

섭씨 온도 = (화씨 온도 - 32) * 5/9

화씨 온도= (섭씨 온도* 9/5) + 32

 

[답]

#include <stdio.h>

int main(void){
    double temperature;
    char sign;
    
    printf("온도? ");
    scanf("%lf %c", &temperature, &sign);
    
    if(sign == 'C')
    	printf("%.2lf %c == %.2lf F", temperature, sign, (temperature*9/5)+32);
    else if(sign == 'F')
    	printf("%.2lf %c == %.2lf C", temperature, sign, (temperature-32)*5/9);
    else
    	printf("섭씨인지 화씨인지 구분해주시오.");
        
    return 0;
}

 

6. 전기 요금은 기본 요금과 월 사용량에 의한 요금의 합으로 계산된다. 월 사용량에 따라 누진제가 적용되어 단계별로 적용되는 기본 요금과 월 사용량 요금이 달라진다. 다음의 누 진제 요금표를 참고하여 입력받은 월 사용량으로 전기 요금을 계산하는 프로그램을 작성하시오.

기본 요금 (원/호)
300kWh 이하 사용 1,000
300kWh 초과 사용 5,000

 

[답]

#include <stdio.h>

int main(void){
    int kwh, basic, ebasic;
    
    printf("월 사용량(kWh)? ");
    scanf("%d", &kwh);
    
    if(kwh<=300){
    	basic = 1000;
        ebasic = kwh * 100;}
    else{
    	basic = 5000;
        ebasic = 300 * 100 + (kwh-300) * 200;}
        
        
    printf("전기 요금 합계: %5d원\n", basic + ebasic);
    printf(" - 기본요금: %5d원\n", basic);
    printf(" - 전력량요금: %5d원", ebasic);
    
    return 0;
}

 

7. 비트 연산을 수행하는 계산기를 프로그래밍하시오. &는 비트 AND, |는 비트 OR, ^는 비트 XOR 연산을 처리한다."0xAB & 0xCC" 처럼 연산식을 입력받아 연산 결과를 구해서 출력한다.비트 연산이므로 16진수로 입력을 받고, 연산 결과도 16진수로 출력한다.

 

[답]

#include <stdio.h>

int main(void){
    int x, y, result;
    char op;
    
    printf("비트 연산식? ");
    scanf("%x %c %x", &x, &op, &y);
    
    if(op == '&')
    	result = x & y;
    else if(op == '|')
    	result = x | y;
    else if(op == '^')
    	result = x ^ y;
    else
    	printf("올바른 연산자를 입력해주십시오.");
    
    printf("%x %c %x = %x", x, op, y, result);
    
    return 0;
}

 

8. ASCII 코드를 이용해서 문자를 출력하는 프로그램을 작성하시오. ASCII 코드 중 0~31 번, 127번은 제어 문자이므로, 32~126번에 할당된 문자들만 출력하는데, 한 줄에 24개씩 출력하시오.

 

[답]

#include <stdio.h>

int main(void){
    for(char i = 32; i < 127; i++){
        printf("%c ", i);
        if((i-31)%24 == 0)
        	printf("\n");
    }
    
    return 0;
}

 

9. 정수의 배수를 출력하는 프로그램을 작성하시오. 양의 정수와 배수의 개수를 입력받아 정 수의 배수를 입력받은 개수만큼 출력하는 프로그램을 작성하시오.

 

[답]

#include <stdio.h>

int main(void){
    int plus, multiple
    
    printf("양의 정수? ");
    scanf("%d", &plus);
    printf("배수의 개수? ");
    scanf("%d", &multiple);
    
    for(int i = 1; i <= multiple; i++)
    	printf("%d ", plus * i);
        
    return 0;
}

 

10. 6번의 전기 요금 계산 프로그램을 월 사용량으로 0이 입력될 때까지 반복 수행 하도록 수정하시오.

 

[답]

#include <stdio.h>

int main(void){
    int kwh, basic, ebasic;
    
    while(1){
        printf("월 사용량(kWh)? ");
        scanf("%d", &kwh);
        
        if(kwh == 0)
        	break;
        if(kwh<=300){
            basic = 1000;
        	ebasic = kwh * 100;}
        else{
            basic = 5000;
            ebasic = 300 * 100 + (kwh-300) * 200;}
            
        printf("전기 요금 합계: %5d원\n", basic + ebasic);
        printf(" - 기본요금: %5d원\n", basic);
        printf(" - 전력량요금: %5d원\n", ebasic);
    }
    
    return 0;
}

 

11. 소수는 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수이다. 정수를 입력받아 정수가 소수인지 검사하는 프로그램을 작성하시오.

 

[답]

#include <stdio.h>

int main(void){
    int plus, cnt;
    int prime = 0;
    
    printf("양의 정수? ");
    scanf("%d", &plus);
    
    for(cnt = 2; cnt <= plus; cnt++){
        if(plus % cnt == 0)
        	prime ++;
    }
    if (prime == 1 )
    	printf("%d는(은) 소수입니다.", plus);
    else
    	printf("%d는(은) 소수가 아닙니다.", plus);
        
    return 0;
}

 

12. 정수 N을 입력받아 1~N 사이의 소수를 모두 구해서 출력하는 프로그램을 작성하시오. 소수는 한 줄에 10개씩 출력한다.

 

[답]

#include <stdio.h>

int main(void) {
    int num = 0, cnt = 0;
    int i, j;
    
    printf("양의 정수? ");
    scanf("%d", &num);
    
    for(i = 2; i < num; i++){
        for(j=2; j< i; j++){
            if(i%j==0)
            	break;
    	}
    	if(i==j){
        	printf("%3d", i);
        	cnt++;}
    	if(cnt % 10 == 0)
    		printf("\n");
    }
  }

 

 

반응형

댓글