
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라는 변수에 해당 계좌의 번호와 잔액이 함께 저장됩니다.
🔶 코드 해설
멤버 변수 이름 | 자료형 | 설명 |
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

- 따라서 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
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'코딩일기 > 자격증' 카테고리의 다른 글
[정보처리기사] SQL | 서브쿼리(Subquery) & IN 연산자 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.04.05 |
---|---|
[정보처리기사] [Python] 리스트와 for in문 활용 | 문자열 인덱싱 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.04.04 |
[정보처리기사] [ C ] 구조체와 포인터 활용 | 복리 알고리즘 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.04.03 |
[정보처리기사] [Java] 상속과 super 키워드 실행 순서 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.04.02 |
[정보처리기사] 페이지 교체 알고리즘 | LRU와 LFU 비교 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.04.02 |