1-1 n! 구하기 

문제설명

입력한 숫자의 팩토리얼을 재귀함수로 계산하는 프로그램을 작성하세요. 팩토리얼은 다음과 같이 계산합니다.

  • 5! = 5 × 4 × 3 × 2 × 1
  • 4! = 4 × 3 × 2 × 1

목표

  • 종료 조건과 재귀 호출을 직접 작성할 수 있다.
  • 재귀함수를 사용하여 반복되는 계산을 구현할 수 있다.

요구사항

  • n!을 구할 n값을 입력받으세요.
  • factorial() 함수를 재귀함수로 작성하세요.
  • 입력값이 1이면 1을 반환하세요.
  • 그렇지 않으면 자기 자신을 다시 호출하여 계산하세요.
  • main()에서 factorial(5)를 호출하여 결과를 출력하세요.

출력예시

n값을 입력하세요:5
120

 

코드예시

더보기
더보기
더보기
#include <stdio.h>

int factorial(int n) {
    if (n == 1) {
        return 1;
    }

    return n * factorial(n - 1);
}

int main() {
    int num, result ;

    printf("n값을 입력하세요:");
    scanf("%d", &num );
    
    result = factorial(num);
    printf("%d\n", result);

    return 0;
}

 

1-2. 1부터 n까지 합 구하기

 

문제설명

정수 n을 입력받아 1부터 n까지의 합을 재귀함수로 계산하는 프로그램을 작성하세요. 예를 들어 n이 5이면 다음과 같이 계산됩니다.

1 + 2 + 3 + 4 + 5 = 15


목표

  • 가장 기본적인 재귀함수를 직접 작성할 수 있다.
  • 종료 조건과 자기 자신을 다시 호출하는 구조를 이해한다.

요구사항

  • sum_recursive(int n) 함수를 작성하세요.
  • n이 1이면 1을 반환하세요.
  • 그렇지 않으면 n + sum_recursive(n - 1)을 반환하세요.
  • main()에서 sum_recursive(5)를 호출하여 결과를 출력하세요.

출력예시

정수를 입력하세요:5
15
 

 

코드예시

더보기
더보기
더보기
#include <stdio.h>

int sum_recursive(int n) {
    if (n == 1) {
        return 1;
    }

    return n + sum_recursive(n - 1);
}

int main() {
    int num;

    printf("정수를 입력하세요:");
    scanf("%d", &num);
    printf("%d\n", sum_recursive(num));

    return 0;
}

 

1-3. 숫자 역순 출력하기

 

문제설명

정수 n을 입력받아 n부터 1까지의 숫자를 재귀함수로 출력하는 프로그램을 작성하세요. 예를 들어 n이 5이면 다음과 같이 출력됩니다.

5 4 3 2 1
 

목표

  • 재귀함수에서 출력 위치에 따라 결과가 달라짐을 이해한다.
  • 반환값이 없는 void 재귀함수를 작성할 수 있다.

요구사항

  • print_reverse(int n) 함수를 작성하세요.
  • n이 0이면 함수를 종료하세요.
  • 그렇지 않으면 현재 숫자를 출력한 뒤 자기 자신을 호출하세요.
  • main()에서 print_reverse(5)를 호출하세요.

출력예시

정수를 입력하세요:6
6 5 4 3 2 1

 

코드예시

더보기
더보기
더보기
#include <stdio.h>

void print_reverse(int n) {
    if (n == 0) {
        return;
    }

    printf("%d ", n);
    print_reverse(n - 1);
}

int main() {
    int num;

    printf("정수를 입력하세요:");
    scanf("%d", &num);
    print_reverse(num);

    return 0;
}
 

1-1. 포인터가 가리키는 값 읽기

문제설명
정수 변수 num과 포인터 변수 p_num이 있다. p_num이 num을 가리키도록 한 뒤, num, p_num, *p_num을 출력하는 코드이다. printf문에서 출력될 결과가 왜 그렇게 되는지를 설명하시오. 

 

목표

  • &와 *의 의미를 이해한다.
  • p_num == &num; 와  *p_num == num 관계를 이해한다.

요구사항

  • num을 10으로 초기화한다.
  • p_num이 num을 가리키도록 한다.
  • 아래 값을 출력한다.
    • num
    • p_num
    • *p_num

코드

#include <stdio.h>

int main(void)
{
    int num = 10;
    int *p_num = &num;

    printf("num = %d\n", num);
    printf("p_num = %p\n", p_num);
    printf("*p_num = %d\n", *p_num);

    return 0;
}
 

 

출력예시

더보기
더보기
num = 10
p_num = 0x61ff1c
*p_num = 10
 

 

1-2. 포인터로 값 변경하기

 

문제설명
포인터를 이용하여 변수 num의 값을 20에서 50으로 변경하시오.

 

목표

  • *p_num을 통해 원래 변수의 값을 바꿀 수 있음을 이해한다.

요구사항

  • num을 20으로 초기화한다.
  • p_num이 num을 가리키게 한다.
  • *p_num = 50;을 수행한다.
  • 변경 전과 후의 num 값을 출력한다.

출력예시

변경 전 num = 20
변경 후 num = 50
 
 
코드예시
더보기
더보기
#include <stdio.h>

int main(void)
{
    int num = 20;
    int *p_num = &num;

    printf("변경 전 num = %d\n", num);

    *p_num = 50;

    printf("변경 후 num = %d\n", num);

    return 0;
}​
 

1-3. (*p_num)++ 와 p_num++ 차이

 

문제설명
(*p_num)++ 와 p_num++ 의 차이를 확인하는 프로그램을 작성하고 그 차이를 설명하시오. 

 

목표

  • (*p_num)++ 는 가리키는 값을 증가시키고,
  • p_num++ 는 포인터가 다음 주소를 가리키게 함을 이해한다.

요구사항

  • 배열 arr[3] = {10, 20, 30} 을 선언한다.
  • p_num이 arr[0]을 가리키도록 한다.
  • 먼저 (*p_num)++ 를 수행한 뒤 값을 출력한다.
  • 이후 p_num++ 를 수행한 뒤 *p_num을 출력한다.
 

출력예시

처음 *p_num = 10
(*p_num)++ 후 *p_num = 11
p_num++ 후 *p_num = 20
 

코드예시

더보기
더보기
#include <stdio.h>

int main(void)
{
    int arr[3] = {10, 20, 30};
    int *p_num = arr;

    printf("처음 *p_num = %d\n", *p_num);

    (*p_num)++;
    printf("(*p_num)++ 후 *p_num = %d\n", *p_num);

    p_num++;
    printf("p_num++ 후 *p_num = %d\n", *p_num);

    return 0;
}

 

2-1. NULL 포인터 검사

 

문제설명
포인터가 아무 곳도 가리키지 않을 때 NULL로 초기화하고, 사용 전에 검사하는 프로그램을 작성하시오.

 

목표

  • NULL 포인터의 의미를 이해한다.
  • 포인터를 사용하기 전에 NULL인지 검사해야 함을 이해한다.

요구사항

  • int *p_num = NULL; 로 초기화한다.
  • if (p_num == NULL) 조건으로 검사한다.
  • "포인터가 아무 것도 가리키지 않습니다." 를 출력한다.

출력예시

포인터가 아무 것도 가리키지 않습니다.
 
코드예시 
더보기
더보기
#include <stdio.h>

int main(void)
{
    int *p_num = NULL;

    if (p_num == NULL)
    {
        printf("포인터가 아무 것도 가리키지 않습니다.\n");
    }

    return 0;
}

 

2-2. 어떤 변수의 주소를 가리키는가?

문제설명
포인터가 다른 변수의 주소를 가리키도록 바꾸면서 값을 출력하시오.

 

목표

  • 포인터 변수의 값(주소)을 바꾸면 다른 변수를 가리킬 수 있음을 이해한다.

요구사항

  • num1 = 100, num2 = 200 으로 초기화한다.
  • p_num이 먼저 num1을 가리키게 한다.
  • *p_num += 10;
  • 이후 p_num = &num2;
  • *p_num += 10;
  • 마지막에 num1, num2를 출력한다.
출력예시
num1 = 110
num2 = 210

 

 

코드예시 

더보기
더보기
#include <stdio.h>

int main(void)
{
    int num1 = 100;
    int num2 = 200;
    int *p_num;

    p_num = &num1;
    *p_num += 10;

    p_num = &num2;
    *p_num += 10;

    printf("num1 = %d\n", num1);
    printf("num2 = %d\n", num2);

    return 0;
}

 

2-3. 아래 코드의 출력 결과를 쓰시오

 

문제설명
다음 코드를 읽고 출력 결과를 예측하시오.

 

목표

  • 포인터가 어떤 변수를 가리키는지 추적하는 연습을 한다.

코드

#include <stdio.h>

int main(void)
{
    int num1 = 3;
    int num2 = 7;

    int *p_num = &num1;

    *p_num += 2;
    p_num = &num2;
    *p_num *= 3;

    printf("%d %d\n", num1, num2);

    return 0;
}
 

출력


3-1. 포인터를 이용한 값 교환

문제설명
두 정수의 값을 포인터를 이용하여 교환하는 프로그램을 작성하시오.

 

목표

  • 포인터를 함수 매개변수로 사용할 수 있음을 이해한다.
  • 함수 안에서 원래 변수의 값을 바꿀 수 있음을 이해한다.

요구사항

  • swap 함수를 작성한다.
  • 함수의 매개변수는 int *a_ptr, int *b_ptr 로 한다.
  • 두 값의 내용을 교환한다.

 

 

출력예시

교환 전: 10 20
교환 후: 20 10
 

코드예시

더보기
더보기
#include <stdio.h>

void swap(int *a_ptr, int *b_ptr)
{
    int temp = *a_ptr;
    *a_ptr = *b_ptr;
    *b_ptr = temp;
}

int main(void)
{
    int num1 = 10;
    int num2 = 20;

    printf("교환 전: %d %d\n", num1, num2);

    swap(&num1, &num2);

    printf("교환 후: %d %d\n", num1, num2);

    return 0;
}

 

3-2. 배열과 포인터 이동

 

문제설명
배열을 포인터로 순회하며 모든 값을 출력하시오.

 

목표

  • 배열 이름은 첫 번째 원소의 주소임을 이해한다.
  • p_num++ 가 다음 원소를 가리키게 함을 이해한다.

요구사항

  • scores[5] = {80, 90, 70, 100, 85} 를 선언한다.
  • p_num = scores;
  • 반복문을 이용하여 모든 값을 출력한다.
출력예시
80 90 70 100 85
 
코드예시 
더보기
더보기
#include <stdio.h>

int main(void)
{
    int scores[5] = {80, 90, 70, 100, 85};
    int *p_num = scores;

    for (int i = 0; i < 5; i++)
    {
        printf("%d ", *p_num);
        p_num++;
    }

    return 0;
}​

 

3-3. 포인터 연산 추적하기

 

문제설명
다음 코드의 출력 결과를 쓰시오.

 

목표

  • 포인터 이동과 역참조의 순서를 이해한다.
출력예시
5
10
11
15
 

 

코드예시
#include <stdio.h>

int main(void)
{
    int arr[4] = {5, 10, 15, 20};
    int *p_num = arr;

    printf("%d\n", *p_num);

    p_num++;
    printf("%d\n", *p_num);

    (*p_num)++;
    printf("%d\n", *p_num);

    p_num++;
    printf("%d\n", *p_num);

    return 0;
}​

 

3-1 로그인 실패 3회 시 계정 잠금 프로그램

문제설명

로그인 시스템에서 사용자가 비밀번호를 틀릴 때마다 실패 횟수를 저장해야 합니다. 실패 횟수는 함수가 여러 번 호출되어도 유지되어야 하며, 실패가 3회가 되면 계정을 잠금 처리해야 합니다. 올바른 비밀번호가 입력되면 실패 횟수는 다시 0으로 초기화됩니다.

 

목표

  • static 지역변수를 실제로 활용할 수 있다.
  • 함수가 여러 번 호출될 때 상태를 기억해야 하는 상황을 구현할 수 있다.
  • 단순 카운트가 아니라 조건 분기와 상태 초기화를 함께 사용할 수 있다.

요구사항

  • void login(int password) 함수를 작성하세요.
  • 실제 비밀번호는 1234라고 가정합니다.
  • 비밀번호가 틀리면 "로그인 실패"를 출력합니다. 
  • 실패 횟수가 3회가 되면 "계정이 잠겼습니다."를 출력하세요.
  • 올바른 비밀번호가 입력되면 "로그인 성공"을 출력하고 실패 횟수를 0으로 초기화하세요.
  • 계정이 잠긴 뒤에는 더 이상 로그인할 수 없고 "잠긴 계정입니다."를 출력하세요.

출력예시

 
로그인 실패!(1회)
로그인 실패!(2회)
로그인 성공!
로그인 실패!(1회)
로그인 실패!(2회)
로그인 실패!(3회)
계정이 잠겼습니다.!
잠긴계정입니다.

 

 

코드예시

더보기
#include <stdio.h>

void login(int password){
    const int PW = 1234;
    const int MAX_FAILE_COUNT = 3;
    static int fail_count = 0;
    static int account_locked = 0;

    if (account_locked){
        printf("잠긴계정입니다.\n");
        return;
    }

    if (password == PW){
        printf("로그인 성공!\n");
        fail_count = 0;
    }    
    else {
        if (fail_count < MAX_FAILE_COUNT){
            fail_count++;
            printf("로그인 실패!(%d회)\n", fail_count);
            
            if (fail_count == MAX_FAILE_COUNT){
                printf("계정이 잠겼습니다.!\n");
                account_locked = 1;
            }
        }
    }

}

int main(void){
    login(1111);
    login(1112);
    login(1234);
    login(1113);
    login(1114);
    login(1113);
    login(1114);

    return 0;
}
 
 
 

3-2. 게임 전체 점수와 보너스 계산 프로그램

문제설명

간단한 게임 프로그램을 작성하세요.

  • 게임의 전체 점수는 프로그램 전체에서 공유되어야 합니다.
  • 한 라운드가 실행될 때마다 보너스 점수는 항상 5점부터 시작해야 합니다.
  • play_round() 함수가 호출될 때:
    • 보너스 점수 5점을 출력하고
    • 전체 점수에 10점을 더한 뒤
    • 현재 전체 점수를 출력하세요.

이 기능을 3번 반복하도록 프로그램을 작성하세요.

 

목표

  • 전역변수와 auto 지역변수의 역할 차이를 구분할 수 있다.
  • 문제 설명만 보고 적절한 변수 위치를 설계할 수 있다.

요구사항

  • 전체 점수는 함수 밖에서 선언하세요.
  • 보너스 점수는 함수 안에서 선언하세요.
  • main()에서 play_round()를 3번 호출하세요.

출력예시

bonus = 5
total score = 10
bonus = 5
total score = 20
bonus = 5
total score = 30
 

코드예시

더보기
#include <stdio.h>

int total_score = 0;

void play_round() {
    int bonus = 5;
    total_score += 10;

    printf("bonus = %d\n", bonus);
    printf("total score = %d\n", total_score);
}

int main() {
    play_round();
    play_round();
    play_round();

    return 0;
}
 

 

3-3. 키오스크 주문 누적 및 품절 처리 프로그램

 

문제설명

카페 키오스크에서 음료 주문과 재고 조회를 처리하는 프로그램을 작성하세요. 단, 판매제품은 drink 1개로 제한합니다.

현재 음료의 재고는 3개입니다. 사용자가 주문하면 재고는 1개 감소합니다. 또한 사용자는 언제든지 현재 남은 재고를 확인할 수 있어야 합니다. 따라서 재고는 주문 함수와 재고 조회 함수가 함께 사용할 수 있어야 합니다. 재고가 0개가 되면 더 이상 주문을 받을 수 없으며 "품절되었습니다."를 출력하세요.

 

목표

  • 여러 함수가 함께 사용해야 하는 값은 전역변수로 관리해야 함을 이해한다.
  • 전역변수와 함수의 역할을 구분할 수 있다.

요구사항

  • order_drink() 함수를 작성하세요.
    • 재고가 있으면 재고를 1 감소시키고 "주문 완료"를 출력하세요.
    • 재고가 없으면 "품절되었습니다."를 출력하세요.
  • print_inventory() 함수를 작성하세요.
    • 현재 남은 재고를 출력하세요.
  • main()에서 아래 순서대로 함수를 호출하세요.
    1. 재고 출력
    2. 주문
    3. 재고 출력
    4. 주문
    5. 주문
    6. 재고 출력
    7. 주문

출력예시

현재 재고: 3
주문 완료
현재 재고: 2
주문 완료
주문 완료
현재 재고: 0
품절되었습니다.
 
 
코드예시
더보기
#include <stdio.h>

int stock = 3;

void order_drink() {
    if (stock > 0) {
        stock--;
        printf("주문 완료\n");
    } else {
        printf("품절되었습니다.\n");
    }
}

void print_inventory() {
    printf("현재 재고: %d\n", stock);
}

int main() {
    print_inventory();

    order_drink();
    print_inventory();

    order_drink();
    order_drink();
    print_inventory();

    order_drink();

    return 0;
}​
 
 
 

2-1. auto 지역변수로 점수 증가 확인하기

문제설명

함수 안에서 지역변수를 선언하고 값을 10 증가시켜 출력하는 프로그램을 작성하세요. 함수를 3번 호출하더라도 항상 같은 값이 출력되도록 만드세요.

 

목표

  • auto 지역변수는 함수 호출마다 새로 생성된다는 점을 코드로 확인한다.

요구사항

  • show_score() 함수를 작성하세요.
  • 함수 안에서 지역변수 score를 0으로 선언하세요.
  • score를 10 증가시킨 뒤 출력하세요.
  • main()에서 이 함수를 3번 호출하세요.

출력예시

score = 10
score = 10
score = 10
 
코드예시
더보기
#include <stdio.h>

void show_score() {
    int score = 0;
    score += 10;
    printf("score = %d\n", score);
}

int main() {
    show_score();
    show_score();
    show_score();

    return 0;
}
 
 

 

2-2. static 지역변수로 방문 횟수 누적하기

 

문제설명

함수가 호출될 때마다 방문 횟수가 1씩 증가하는 프로그램을 작성하세요.

 

목표

  • static 지역변수의 값 유지 특성을 활용할 수 있다.

요구사항

  • visit() 함수를 작성하세요.
  • 함수 안에서 static 지역변수 count 를 정의하고 0으로 초기화 하세요.  
  • 함수가 호출될 때마다 count를 1 증가시키고 출력하세요.
  • main()에서 함수를 5번 호출하세요.

출력예시

visit count = 1
visit count = 2
visit count = 3
visit count = 4
visit count = 5
 
 

코드예시

더보기
#include <stdio.h>

void visit() {
    static int count = 0;
    count++;
    printf("visit count = %d\n", count);
}

int main() {
    visit();
    visit();
    visit();
    visit();
    visit();

    return 0;
}
 
 

 

2-3. 전역변수로 총 주문 수 관리하기

 

문제설명

카페 키오스크에서 주문이 들어올 때마다 전체 주문 수가 증가하는 프로그램을 작성하세요.

 

목표

  • 전역변수를 여러 함수에서 함께 사용할 수 있음을 이해한다.

요구사항

  • 전역변수 order_count를 선언하세요.
  • add_order() 함수에서 주문 수를 1 증가시키세요.
  • print_order_count() 함수에서 현재 주문 수를 출력하세요.
  • main()에서 주문을 3번 추가하고 중간중간 출력하세요.

출력예시

total orders = 0
total orders = 1
total orders = 2
 
코드예시
더보기
#include <stdio.h>

int order_count = 0;

void add_order() {
    order_count++;
}

void print_order_count() {
    printf("total orders = %d\n", order_count);
}

int main() {
    print_order_count();
    add_order();
    print_order_count();
    add_order();
    add_order();
    print_order_count();

    return 0;
}

1-1. auto 지역변수의 특성 이해

문제설명

다음 코드는 함수가 호출될 때마다 지역변수가 어떻게 생성되는지 확인하는 예제입니다. 먼저 출력 결과를 예상한 뒤, 실제 실행 결과와 비교해 보세요.

 

목표

  • 일반 지역변수(auto)가 함수가 끝나면 사라진다는 점을 이해한다.
  • 함수가 다시 호출되면 지역변수가 새로 만들어진다는 점을 이해한다.

요구사항

  • 코드를 읽고 출력 결과를 먼저 예상해 보세요.
  • 왜 그런 결과가 나오는지 설명해 보세요.

 

코드

#include <stdio.h>

void count_auto() {
    int num = 0;
    num++;
    printf("num = %d\n", num);
}

int main() {
    count_auto();
    count_auto();
    count_auto();

    return 0;
}

 

 

출력결과

num = 1
num = 1
num = 1
 
 

 

1-2. static 지역변수의 특성 이해

문제설명

다음 코드는 함수 안에 static 지역변수를 선언한 예제입니다. 출력 결과를 예상한 뒤 실제 실행 결과와 비교해 보세요.

 

목표

  • static 지역변수는 함수가 끝나도 값이 유지된다는 점을 이해한다.
  • 일반 지역변수와의 차이를 비교한다.

요구사항

  • 코드를 읽고 출력 결과를 예상해 보세요.
  • 왜 값이 누적되는지 설명해 보세요.

코드

#include <stdio.h>

void count_static() {
    static int num = 0;
    num++;
    printf("num = %d\n", num);
}

int main() {
    count_static();
    count_static();
    count_static();

    return 0;
}

 

출력결과

 
num = 1
num = 2
num = 3
 

 

1-3. 전역변수의 특성 이해

문제설명

다음 코드는 전역변수를 여러 함수에서 함께 사용하는 예제입니다. 출력 결과를 예상한 뒤 실제 실행 결과와 비교해 보세요.

 

목표

  • 전역변수는 여러 함수에서 공통으로 사용할 수 있음을 이해한다.
  • 값이 한 곳에서 바뀌면 전체 프로그램에 영향을 줄 수 있음을 이해한다.

요구사항

  • 코드를 읽고 출력 결과를 예상해 보세요.
  • 왜 main()에서도 바뀐 값이 출력되는지 설명해 보세요.

코드

#include <stdio.h>

int count = 0;

void increase() {
    count++;
}

void print_count() {
    printf("count = %d\n", count);
}

int main() {
    print_count();
    increase();
    print_count();
    increase();
    print_count();

    return 0;
}
출력결과
count = 0
count = 1
count = 2
 

3-1. 카페 주문 프로그램

문제설명

음료 종류와 수량을 입력받아 총 금액을 계산하는 카페 주문 프로그램을 작성하세요. 단, 메뉴 번호로 0을 입력하면 프로그램이 종료되도록 하세요. 프로그램은 종료 전까지 계속 주문을 받으며, 주문할 때마다 주문 결과를 출력해야 합니다.

 

제공메뉴의 예시는 아래와 같으며 항목은 변경 가능하다. 

  • 아메리카노: 3000원
  • 라떼: 4000원
  • 모카: 4500원

목표

  • 여러 개의 함수를 조합하여 프로그램을 설계할 수 있다.
  • 반복문과 함수를 함께 사용할 수 있다.
  • 기능의 추상화와 역할 분리를 연습할 수 있다.

요구사항

  • 반드시 여러 개의 함수로 나누어 구현할 것
  • 다음 기능을 각각 함수로 나눌 것
    • 메뉴 안내 출력
    • 메뉴 번호 입력
    • 수량 입력
    • 가격 계산
    • 주문 결과 출력
  • 메뉴 번호는 다음과 같이 처리
    • 1: 아메리카노
    • 2: 라떼
    • 3: 모카
    • 0: 프로그램 종료
  • 0이 입력되기 전까지 계속 주문을 받도록 구현할 것
  • 주문 1건이 끝나면 다시 메뉴를 출력하고 다음 주문을 받도록 할 것
  •  

출력예시

========= (메뉴) ==========
1. 아메리카노 (3000원)
2. 라떼 (4000원)
3. 모카 (4500원)
0. 종료
==========================
메뉴 선택: 1
수량 입력: 2
주문 메뉴: 아메리카노
수량: 2
총 금액: 6000원
========= (메뉴) ==========
1. 아메리카노 (3000원)
2. 라떼 (4000원)
3. 모카 (4500원)
0. 종료
==========================
메뉴 선택: 2
수량 입력: 3
주문 메뉴: 라떼
수량: 3
총 금액: 12000원
========= (메뉴) ==========
1. 아메리카노 (3000원)
2. 라떼 (4000원)
3. 모카 (4500원)
0. 종료
==========================
메뉴 선택: 3
수량 입력: 2
주문 메뉴: 모카
수량: 2
총 금액: 9000원
========= (메뉴) ==========
1. 아메리카노 (3000원)
2. 라떼 (4000원)
3. 모카 (4500원)
0. 종료
==========================
메뉴 선택: 0
프로그램을 종료합니다.

 

코드예시

더보기
더보기
더보기
더보기
#include <stdio.h>

void print_menu(void)
{
    printf("========= (메뉴) ==========\n");
    printf("1. 아메리카노 (3000원)\n");
    printf("2. 라떼 (4000원)\n");
    printf("3. 모카 (4500원)\n");
    printf("0. 종료\n");
    printf("==========================\n");
}

int input_menu_number(void)
{
    int menu;
    scanf("%d", &menu);
    return menu;
}

int input_count(void)
{
    int count;
    scanf("%d", &count);
    return count;
}

int get_price(int menu)
{
    if (menu == 1)
        return 3000;
    else if (menu == 2)
        return 4000;
    else
        return 4500;
}

void print_order_result(int menu, int count, int total_price)
{
    if (menu == 1)
        printf("주문 메뉴: 아메리카노\n");
    else if (menu == 2)
        printf("주문 메뉴: 라떼\n");
    else if (menu == 3)
        printf("주문 메뉴: 모카\n");

    printf("수량: %d\n", count);
    printf("총 금액: %d원\n", total_price);
}

int main(void)
{
    int menu;
    int count;
    int price;
    int total_price;

    while (1)
    {
        print_menu();
        printf("메뉴 선택: ");
        menu = input_menu_number();

        if (menu == 0)
        {
            printf("프로그램을 종료합니다.\n");
            break;
        }

        printf("수량 입력: ");
        count = input_count();

        price = get_price(menu);
        total_price = price * count;

        print_order_result(menu, count, total_price);
    }

    return 0;
}

 

3-2. 학생 성적 관리 프로그램

문제설명

국어, 영어, 수학 점수를 입력받아 총점, 평균, 합격 여부를 출력하는 프로그램을 작성하세요. 단, 국어 점수 입력에서 0을 입력하면 프로그램이 종료되도록 하세요. 프로그램은 종료 전까지 계속 학생의 성적을 입력받아 처리해야 합니다.

  • 평균이 60 이상이면 합격
  • 평균이 60 미만이면 불합격

목표

  • 하나의 프로그램을 여러 기능으로 직접 나눌 수 있다.
  • 반환값이 있는 함수와 없는 함수를 함께 사용할 수 있다.
  • 반복문과 함수를 함께 사용할 수 있다.

요구사항

  • 최소 5개 이상의 함수를 정의할 것
  • 반드시 다음 기능을 각각 함수로 나눌 것
    • 점수 입력
    • 총점 계산
    • 평균 계산
    • 합격 여부 판별
    • 결과 출력
  • 국어 점수 입력 시 0을 입력하면 프로그램 종료
  • 종료 전까지 여러 학생의 성적을 계속 입력받아 처리할 것

출력예시

국어: 70
영어: 80
수학: 60
총점: 210
평균: 70.0
합격

국어: 50
영어: 40
수학: 55
총점: 145
평균: 48.3
불합격

국어: 0
프로그램을 종료합니다.

 

코드예시

더보기
더보기
더보기
더보기
#include <stdio.h>

int input_score(void)
{
    int score;
    scanf("%d", &score);
    return score;
}

int get_total(int kor, int eng, int math)
{
    return kor + eng + math;
}

double get_average(int total)
{
    return total / 3.0;
}

int is_pass(double average)
{
    if (average >= 60)
        return 1;
    else
        return 0;
}

void print_result(int total, double average, int pass)
{
    printf("총점: %d\n", total);
    printf("평균: %.1f\n", average);

    if (pass == 1)
        printf("합격\n");
    else
        printf("불합격\n");
}

int main(void)
{
    int kor, eng, math;
    int total;
    double average;
    int pass;

    while (1)
    {
        printf("\n국어: ");
        kor = input_score();

        if (kor == 0)
        {
            printf("프로그램을 종료합니다.\n");
            break;
        }

        printf("영어: ");
        eng = input_score();

        printf("수학: ");
        math = input_score();

        total = get_total(kor, eng, math);
        average = get_average(total);
        pass = is_pass(average);

        print_result(total, average, pass);
    }

    return 0;
}

 

 

2-1. 두 과목 평균 계산 프로그램

문제설명

두 과목의 점수를 입력받아 평균을 출력하는 프로그램을 작성하세요. 단, 기능별로 함수를 나누어 구현해야 합니다.

 

목표

  • 프로그램을 입력, 계산, 출력 기능으로 나눌 수 있다.

요구사항

다음 3개의 함수를 만들어 사용하세요.

  • int read_score(void);
  • double calculate_average(int score1, int score2);
  • void print_average(double average);

출력예시

첫 번째 점수: 80
두 번째 점수: 90
평균: 85.0

 

코드예시

더보기
더보기
#include <stdio.h>

int read_score(void)
{
    int score;
    scanf("%d", &score);
    return score;
}

double calculate_average(int score1, int score2)
{
    return (score1 + score2) / 2.0;
}

void print_average(double average)
{
    printf("평균: %.1f\n", average);
}

int main(void)
{
    int score1, score2;
    double average;

    printf("첫 번째 점수: ");
    score1 = read_score();

    printf("두 번째 점수: ");
    score2 = read_score();

    average = calculate_average(score1, score2);
    print_average(average);

    return 0;
}

 

 

2-2. 직사각형 넓이와 둘레 구하기

문제설명

가로와 세로를 입력받아 직사각형의 넓이와 둘레를 출력하는 프로그램을 작성하세요.

 

목표

  • 하나의 문제를 여러 함수로 나누어 해결할 수 있다.

요구사항

다음 함수를 정의하여 사용하세요.

  • int input_number(void);
  • int get_area(int width, int height);
  • int get_perimeter(int width, int height);
  • void print_result(int area, int perimeter);

출력예시

가로: 5
세로: 3
넓이: 15
둘레: 16

 

코드예시

더보기
더보기
#include <stdio.h>

int input_number(void)
{
    int num;
    scanf("%d", &num);
    return num;
}

int get_area(int width, int height)
{
    return width * height;
}

int get_perimeter(int width, int height)
{
    return 2 * (width + height);
}

void print_result(int area, int perimeter)
{
    printf("넓이: %d\n", area);
    printf("둘레: %d\n", perimeter);
}

int main(void)
{
    int width, height;
    int area, perimeter;

    printf("가로: ");
    width = input_number();

    printf("세로: ");
    height = input_number();

    area = get_area(width, height);
    perimeter = get_perimeter(width, height);

    print_result(area, perimeter);

    return 0;
}

 

2-3. 계산기 프로그램

문제설명

두 정수와 연산자(+, -, *)를 입력받아 결과를 출력하는 간단한 계산기 프로그램을 작성하세요.

 

목표

  • 입력, 계산, 출력 기능을 함수로 분리할 수 있다.
  • 조건문을 이용해 기능을 나눌 수 있다.

요구사항

다음 함수를 정의하세요.

  • int read_number(void);
  • char read_operator(void);
  • int calculate(int num1, int num2, char op);
  • void print_result(int result);

출력예시

첫 번째 수: 7
연산자: *
두 번째 수: 8
결과: 56

 

코드예시

더보기
더보기
#include <stdio.h>

int read_number(void)
{
    int num;
    scanf("%d", &num);
    return num;
}

char read_operator(void)
{
    char op;
    scanf(" %c", &op);
    return op;
}

int calculate(int num1, int num2, char op)
{
    if (op == '+')
        return num1 + num2;
    else if (op == '-')
        return num1 - num2;
    else
        return num1 * num2;
}

void print_result(int result)
{
    printf("결과: %d\n", result);
}

int main(void)
{
    int num1, num2, result;
    char op;

    printf("첫 번째 수: ");
    num1 = read_number();

    printf("연산자: ");
    op = read_operator();

    printf("두 번째 수: ");
    num2 = read_number();

    result = calculate(num1, num2, op);
    print_result(result);

    return 0;
}

 

 

1-1. 두 수의 합 구하기

문제설명

정수 2개를 전달받아 두 수의 합을 반환하는 함수를 작성하시오.

 

목표

  • 반환값이 있는 함수를 정의할 수 있다.
  • 매개변수와 전달인자를 구분할 수 있다.

요구사항

  • 함수 이름: add
  • 매개변수: 정수 2개
  • 반환값: 두 수의 합

Caller 코드에서 사용 예시

printf("%d", add(3, 5));

 

예상 출력

8
 

예상코드

더보기
더보기
#include <stdio.h>

int add(int num1, int num2)
{
    return num1 + num2;
}

int main(void)
{
    printf("%d\n", add(3, 5));
    return 0;
}

 

1-2. 정수의 제곱 출력하기

 

문제설명

정수 1개를 전달받아 그 수의 제곱을 출력하는 함수를 작성하시오.

 

목표

  • 반환값이 없는 void 함수를 정의할 수 있다.

요구사항

  • 함수 이름: print_square
  • 매개변수: 정수 1개
  • 반환값 없음
  • 전달받은 수의 제곱을 출력

Caller 코드에서 사용 예시

print_square(4);

 

예상 출력

16

 

예상코드

더보기
더보기
#include <stdio.h>

void print_square(int num)
{
    printf("%d\n", num * num);
}

int main(void)
{
    print_square(4);
    return 0;
}

 

1-3. 짝수인지 판별하기

 

문제설명

정수 1개를 전달받아 짝수이면 1, 홀수이면 0을 반환하는 함수를 작성하시오. 

 

목표

  • 조건문과 반환값을 함께 사용할 수 있다.

요구사항

  • 함수 이름: is_even
  • 매개변수: 정수 1개
  • 짝수이면 1, 홀수이면 0 반환

Caller 코드에서 사용 예시

printf("%d", is_even(7));

 

예상 출력

0

 

예상코드

더보기
더보기
#include <stdio.h>

int is_even(int num)
{
    if (num % 2 == 0)
        return 1;
    else
        return 0;
}

int main(void)
{
    printf("%d\n", is_even(7));
    return 0;
}

 

1-4. 문자 한 개 출력하기

 

문제설명

문자 1개를 전달받아 다음과 같이 출력하는 함수를 작성하시오.

 

목표

  • 문자형 매개변수를 사용할 수 있다.

요구사항

  • 함수 이름: print_char
  • 매개변수: 문자 1개
  • 다음 형식으로 출력  :  "입력한 문자: A"

Caller 코드에서 사용 예시

print_char('A');

 

예상 출력

입력한 문자: A

 

예상코드

더보기
더보기
#include <stdio.h>

void print_char(char ch)
{
    printf("입력한 문자: %c\n", ch);
}

int main(void)
{
    print_char('A');
    return 0;
}

 

 

1-5. 세 수 중 큰 수 반환하기

 

문제설명

정수 3개를 전달받아 가장 큰 수를 반환하는 함수를 작성하시오. 

 

목표

  • 여러 개의 매개변수와 조건문을 사용할 수 있다.

요구사항

  • 함수 이름: max3
  • 매개변수: 정수 3개
  • 가장 큰 수 반환

Caller 코드에서 사용 예시 

printf("%d", max3(10, 7, 25));

 

예상 출력

25

 

예상코드

더보기
더보기
#include <stdio.h>

int max3(int a, int b, int c)
{
    int max = a;

    if (b > max)
        max = b;
    if (c > max)
        max = c;

    return max;
}

int main(void)
{
    printf("%d\n", max3(10, 7, 25));
    return 0;
}

+ Recent posts