코딩일기/자격증
[정보처리기사] [ 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
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
📌 문제 요약 정리
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
728x90
반응형