코딩일기/자격증

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

jhy_2023 2025. 4. 4. 23:06
728x90
반응형

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

문제

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

#include <stdio.h>
 
typedef struct{
    int accNum;
    double bal;
} BankAcc;
 
double sim_pow(double base, int year){
    int i;
    double r = 1.0;
    for(i = 0; i < year; i++){
        r *= base;
    }
    return r;
} 
 
void initAcc(BankAcc *acc, int x, double y){
    acc->accNum = x;
    acc->bal = y;
}
 
void xxx(BankAcc *acc, double *en){
    if (*en > 0 && *en < acc->bal) {
        acc->bal -= *en;
    } else {
        acc->bal += *en;
    }
}
 
void yyy(BankAcc *acc){
    acc->bal *= sim_pow((1 + 0.1), 3);
}
 
int main(){
    BankAcc myAcc;
    initAcc(&myAcc, 9981, 2200.0);
    double amount = 100.0;
    xxx(&myAcc, &amount);
    yyy(&myAcc);
    printf("%d and %.2f", myAcc.accNum, myAcc.bal);
    return 0;
}

정답

9981 and 2795.10

반응형

해설

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

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

 

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

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

august-jhy.tistory.com

 

📌 문제 해설

이 코드는 은행 계좌를 관리하는 구조체(BankAcc)와 함수들을 활용하여 계좌의 출금/입금 및 이자 계산을 수행하는 프로그램입니다.

1️⃣ main 함수

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

2️⃣ 구조체(struct) 정의

typedef struct {
    int accNum;   // 계좌 번호
    double bal;   // 잔액
} BankAcc;

위 코드는 BankAcc라는 이름의 구조체 자료형을 정의한 것입니다.

🔶 구조체(struct)의 의미

구조체(struct)는 C언어에서 서로 다른 자료형의 변수들을 하나로 묶어주는 사용자 정의 자료형입니다.

struct는 구조체(structure)의 약어로, 서로 관련 있는 데이터를 묶어서 하나의 집합으로 만들고자 할 때 사용합니다.
예를 들어, 하나의 은행 계좌에는 계좌 번호, 예금 잔액 등이 함께 존재하므로, 이를 구조체로 묶으면 하나의 논리적인 단위로 처리할 수 있습니다.

🔶 typedef의 의미

typedef는 "type definition"의 줄임말로, 복잡한 자료형에 새로운 이름을 붙여주는 키워드입니다.
즉, typedef struct { ... } BankAcc;는 구조체에 BankAcc라는 별칭을 붙여, 나중에 구조체 변수를 선언할 때 struct 키워드를 생략하고 BankAcc만으로 선언할 수 있도록 해줍니다.

🔶 구조체 사용 예시

// 구조제 사용 예시

BankAcc myAcc;
myAcc.accNum = 12345;
myAcc.bal = 10000.50;

위와 같이 BankAcc 타입의 구조체 변수를 선언하고, 각 멤버 변수에 값을 대입할 수 있습니다.
이 구조체는 하나의 계좌 정보를 표현하며, myAcc라는 변수에 해당 계좌의 번호와 잔액이 함께 저장됩니다.

728x90

🔶 코드 해설

멤버 변수 이름 자료형 설명
accNum int
정수(integer)를 저장하는 자료형
계좌 번호를 저장하는 정수형 변수입니다.
bal double
소수점이 있는 실수(double precision float)를 저장하는 자료형
계좌의 잔액을 저장하는 실수형 변수입니다.
  • 해당 구조체에는 두 개의 멤버 변수가 포함되어 있습니다.
BankAcc myAcc;
  • 이 코드는 BankAcc라는 구조체 자료형의 변수 myAcc를 선언하는 것입니다.
    즉, "계좌 정보(계좌번호와 잔액)를 저장할 수 있는 공간을 하나 만들겠다"는 뜻입니다.

3️⃣ 계좌 초기화 (initAcc)

initAcc(&myAcc, 9981, 2200.0);
  • &myAcc는 myAcc의 주소를 뜻합니다.
  • 그 주소를 initAcc() 함수에 넘기면, 함수 안에서 myAcc 구조체의 멤버에 직접 접근할 수 있습니다.
  • initAcc() 함수의 accNum과 bal 필드에 각각 9981, 2200.0 값을 넣게 됩니다
void initAcc(BankAcc *acc, int x, double y){
    acc->accNum = x;
    acc->bal = y;
}
  • initAcc() 함수는 구조체 변수의 값을 초기화하는 함수입니다.
    이 함수는 구조체 변수 myAcc의 주소, 계좌 번호 9981, 잔액 2200.0을 전달받아, 해당 구조체의 멤버 변수들을 초기화합니다.
  • acc는 구조체의 포인터입니다. 즉, 구조체 변수 myAcc의 주소를 가리키고 있습니다.
    -> 연산자는 포인터가 가리키는 구조체의 멤버에 접근할 때 사용하는 연산자입니다.
  • acc->accNum = x; 는 acc가 가리키는 구조체의 accNum에 x 값을 대입 ( 9981 )
  • acc->bal = y; 는 acc가 가리키는 구조체의 bal에 y 값을 대입 ( 2200.0 )

4️⃣ double amount = 100.0;

double amount = 100.0;
  • amount라는 이름의 실수형(double) 변수를 만들고, 그 변수에 100.0이라는 실수값을 저장합니다. 

5️⃣ 입출금 처리 함수 (xxx)

xxx(&myAcc, &amount);
  • 구조체 변수 myAcc와 실수형 변수 amount의 주소(포인터)를 xxx() 함수에 전달합니다.
void xxx(BankAcc *acc, double *en){
    if (*en > 0 && *en < acc->bal) {
        acc->bal = acc->bal - *en;
    } else {
        acc->bal = acc->bal + *en;
    }
}
  • acc는 구조체 포인터이며, 구조체 변수 myAcc의 주소를 받습니다.
    *acc는 acc 포인터가 가리키는 구조체 전체를 의미하며, acc->bal, acc->accNum와 같이 멤버에 접근할 수 있습니다.
  • en은 실수형 포인터이며, 실수형 변수 amount의 주소를 받습니다.
    *en은 en 포인터가 가리키는 실수값(즉, 금액)을 의미합니다.
  • if문
    • *en은 amount의 값이므로 100.0
    • acc->bal은 bal의 값이므로 2200.0
    • *en > 0 && *en < acc->bal 비교하면,
      100.0 > 0 참
      100.0 < 2200.0 참
      따라서 참 && 참 => 참 (True)
    • 조건이 참이므로 if 블록이 실행됩니다.
      • acc->bal = acc->bal - *en; 실행
      • acc->bal = 2200.0 - 100.0
      • acc->bal = 2100.0

6️⃣ 이자 계산 함수 (yyy)

yyy(&myAcc);
  • 구조체 변수 myAcc의 주소를 yyy() 함수에 넘깁니다.
void yyy(BankAcc *acc){
    acc->bal *= sim_pow((1 + 0.1), 3);
}
  • BankAcc *acc는 구조체 포인터이며, myAcc의 주소가 이 포인터 변수에 전달됩니다.
    즉, acc는 myAcc를 가리키는 포인터가 되며, 이를 통해 구조체의 멤버인 acc->accNum 또는 acc->bal에 직접 접근하거나 값을 변경할 수 있습니다.
  • yyy() 함수는 (1 + 0.1)과 3을 sim_pow() 함수에 인자로 전달합니다.
double sim_pow(double base, int year){
    int i;
    double r = 1.0;
    for(i = 0; i < year; i++){
        r *= base;
    }
    return r;
}
  • base는 (1+0.1), year은 3을 받습니다.
  • for 반복문
    • 초기값: 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

for 반복문

  • 따라서 sim_pow(1.1, 3)의 반환값은 1.331입니다.
void yyy(BankAcc *acc){
    acc->bal *= sim_pow((1 + 0.1), 3);
}
  • 식을 풀면,
    acc->bal = acc->bal * sim_pow((1 + 0.1), 3);
    따라서 2100.0 × 1.331 값을  acc->bal에 저장합니다
  • 2100.0 × 1.331 = 2795.1

7️⃣ 출력 실행 

printf("%d and %.2f", myAcc.accNum, myAcc.bal);
  • "%d and %.2f"은 출력할 형식(서식)을 지정하는 문자열입니다.
    %d는 정수형 데이터를 출력할 때 사용합니다.
    %.2f는 소수점 이하 2자리까지 실수형 데이터를 출력할 때 사용합니다.
    and는 단순 문자열로, 그대로 출력됩니다.
  • myAcc.accNum = 9981
  • myAcc.bal = 2795.1
    소수점 둘째 자리까지 맞추기 위해 %.2f가 사용되었기 때문에 0까지 채워져 2795.10으로 출력됩니다.
  • 출력값 : 9981 and 2795.10

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

728x90
반응형