코딩일기/자격증

[정보처리기사] [ C ] 구조체와 포인터 활용 | 복리 알고리즘 | 2024년 1회 정보처리기사 실기 기출문제

jhy_2023 2025. 4. 3. 14:41
728x90
반응형

2024년 1회 정보처리기사 실기 기출문제

문제

다음 C 프로그램의 실행결과를 쓰시오.

#include <stdio.h>

struct BankAcc {
    int accNum;
    double bal;
};

double sim_pow(double base, int year) {
    double r = 1.0;
    for (int i = 0; i < year; i++) {
        r = r * (1.0 + base);
    }
    return r;
}

void initAcc(struct BankAcc *acc, int x, double y) {
    acc->accNum = x;
    acc->bal = y;
}

void test01(struct BankAcc *acc, double en) {
    if (en > 0 && en < acc->bal) {
        acc->bal -= en;
    } else {
        acc->bal += en;
    }
}

void test02(struct BankAcc *acc) {
    acc->bal = acc->bal * sim_pow(0.1, 3);
}

int main() {
    struct BankAcc myAcc;
    initAcc(&myAcc, 9981, 2200.0);
    test01(&myAcc, 100.0);
    test02(&myAcc);
    printf("%d and %0.2f", myAcc.accNum, myAcc.bal);
    return 0;
}

정답

9981 and 2795.10

반응형

해설

[참고]
🔎 복리 : 원금과 원금에서 생기는 이자를 더한 합계가 다음 기간의 원금으로 되어 이자를 계산하는 방법

▼응용 문제도 같이 풀어보세요 ▼

 

[정보처리기사] [ C ] 구조체와 포인터를 활용한 복리 계산 문제 | 복리 알고리즘 | 2024년 1회 정보

2024년 1회 정보처리기사 실기 기출문제문제다음 C 프로그램의 실행결과를 쓰시오.#include typedef struct{ int accNum; double bal;} BankAcc; double sim_pow(double base, int year){ int i; double r = 1.0; for(i = 0; i accNum = x; ac

august-jhy.tistory.com


📌 기본 개념

1️⃣ 구조체(struct)

  • struct는 여러 개의 변수를 하나의 그룹으로 묶을 때 사용된다. 즉, 구조체란 서로 다른 데이터 타입의 묶음이다.
  • struct BankAcc는 은행 계좌 정보를 저장하는 구조체로, accNum(계좌번호)와 bal(잔액) 두 개의 멤버 변수를 포함한다.

2️⃣ 포인터와 구조체

  • 구조체를 함수의 매개변수로 전달할 때, 값이 아닌 주소(포인터) 를 전달하면 함수 내부에서 구조체 값을 직접 수정할 수 있다.
  • struct BankAcc *acc는 구조체 포인터를 가리키며, acc->bal과 같은 방식(화살표 연산자)으로 구조체 멤버에 접근한다.
  • 구조체 포인터 변수가 구조체 멤버에 접근할 때 사용하는 연산자를 화살표 현산자라 한다,
728x90

📌 문제 해설

int main() {
    struct BankAcc myAcc;
    initAcc(&myAcc, 9981, 2200.0);
    test01(&myAcc, 100.0);
    test02(&myAcc);
    printf("%d and %0.2f", myAcc.accNum, myAcc.bal);
    return 0;
}

1️⃣ main 함수

int main() {
  • 프로그램 실행 시작점. main()에서 순서대로 호출되며, 실행 흐름을 따라가면서 결과를 예측해야 한다.

2️⃣ BankAcc 구조체 변수 선언

struct BankAcc myAcc;
  • myAcc라는 구조체 변수를 선언한다.
struct BankAcc {
    int accNum;
    double bal;
};
  • BankAcc라는 구조체를 정의한다.
  • accNum: 계좌번호를 저장하는 정수형 변수.
  • bal: 계좌 잔액을 저장하는 실수형 변수.

3️⃣ 계좌 초기화 (initAcc)

initAcc(&myAcc, 9981, 2200.0);
  • myAcc의 주소를 넘겨서 초기화 실행.
  • 여기서 &myAcc는 myAcc 구조체 변수의 주소값을 의미합니다.
void initAcc(struct BankAcc *acc, int x, double y) {
    acc->accNum = x;
    acc->bal = y;
}
  • struct BankAcc *acc를 입력받아 accNum과 bal을 초기화하는 함수.
  • initAcc() 함수의 매개변수로 struct BankAcc *acc가 선언되어 있습니다.
    이 함수에서 acc는 struct BankAcc 타입의 구조체 변수를 가리키는 포인터입니다.
    즉, initAcc() 함수의 매개변수인 acc는 myAcc의 주소를 가리키는 포인터가 되는 것입니다.
  • -> 연산자는 포인터를 이용해 구조체 멤버에 접근하는 연산자입니다.
    initAcc() 함수 내에서 acc를 이용해 accNum과 bal을 초기화하는 부분을 보면, -> 연산자 (화살표 연산자)를 사용해 멤버 변수에 접근하고 있습니다
  • myAcc.accNum = 9981
    myAcc.bal = 2200.0

4️⃣ 입출금 처리 함수 (test01)

test01(&myAcc, 100.0);
void test01(struct BankAcc *acc, double en) {
    if (en > 0 && en < acc->bal) {
        acc->bal -= en;
    } else {
        acc->bal += en;
    }
}

 

  • bal: 계좌 잔액을 저장하는 실수형 변수
  • en > 0 && en < acc->bal 조건이 참이면 acc->bal -= en;
    • 출금을 의미하는 식 (잔액에서 en을 뺌)
  • 조건이 거짓이면 acc->bal += en;
    • 입금을 의미하는 식 (잔액에 en을 더함)
  • test01(&myAcc, 100.0); 실행
    • myAcc.bal = 2200.0 => 초기 잔액
    • 100.0 > 0 && 100.0 < 2200.0 => 조건 만족 출금 수행
    • myAcc.bal = 2200.0 - 100.0 = 2100.0 => 출금 후 잔액

 

5️⃣ 이자 계산 함수 (test02)

test02(&myAcc);
void test02(struct BankAcc *acc) {
    acc->bal = acc->bal * sim_pow(0.1, 3);
}

 

  • sim_pow(0.1, 3)의 결과값을 구해서
  • 현재 계좌 잔액 (acc->bal) 에 곱하여 업데이트
    • bal: 계좌 잔액을 저장하는 실수형 변수

 

double sim_pow(double base, int year) {
    double r = 1.0;
    for (int i = 0; i < year; i++) {
        r = r * (1.0 + base);
    }
    return r;
}
  • [참고] 복리 이자 공식

복리 이자 공식

 

  • base: 이자율 (0.1 → 10%) / year: 기간 (3년) / r: 누적된 복리 값 (최종적으로 반환될 값)
  • 초기값: r = 1.0
  • 첫 번째 반복 (i = 0) → r = 1.0 * (1.0 + 0.1) = 1.1
  • 두 번째 반복 (i = 1) → r = 1.1 * (1.0 + 0.1) = 1.21
  • 세 번째 반복 (i = 2) → r = 1.21 * (1.0 + 0.1) = 1.331
  • 반환값: 1.331

for 반복문 실행 과정

 


5️⃣ 출력 실행 ()

printf("%d and %0.2f", myAcc.accNum, myAcc.bal);

 

  • 형식 지정
    • %d → 정수형 (int) 출력
    • %0.2f → 소수점 둘째 자리까지 실수형 (double) 출력
    • " and " → 문자열 그대로 출력
  • myAcc.accNum = 9981
  • myAcc.bal = 2795.10
  • 출력값 : 9981 and 2795.10

 

📌 문제 요약 정리

코드 흐름
myAcc 구조체의 accNum 과 bal 변화 과정


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형