복습: 구조체 수정 - 포인터
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 49번째.
챌린지
쉬움동적 메모리 할당, 구조체 포인터 및 함수를 사용하는 완전한 직원 관리 시스템을 보여주는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다.
- 다음 멤버를 포함하는
Employee라는 이름의struct를 정의합니다.- 직원 ID를 저장할 정수형
id - 직원 이름을 저장할 크기 50의 문자 배열
name - 부서 이름을 저장할 크기 30의 문자 배열
department - 직원 급여를 저장할 실수형
salary - 근속 연수를 저장할 정수형
yearsOfService
- 직원 ID를 저장할 정수형
- 다음과 같은 기능을 수행하는
fillEmployeeData함수를 작성합니다.Employee구조체에 대한 포인터를 매개변수로 받습니다.- 입력으로부터 ID, 이름, 부서, 급여, 근속 연수 순서대로 직원 정보를 읽습니다.
- 화살표 연산자를 사용하여 구조체 멤버에 값을 할당합니다.
- 근속 연수에 따른 보너스를 계산합니다: 근속 연수가 5년 이상이면 보너스는 급여의 10%, 그렇지 않으면 급여의 5%입니다.
- 급여에 보너스를 더합니다:
empPtr->salary += bonus;
- 다음과 같은 기능을 수행하는
displayEmployee함수를 작성합니다.Employee구조체에 대한 포인터를 매개변수로 받습니다.- 다음과 같은 정확한 형식으로 직원 정보를 출력합니다.
Employee Details:ID: [id]Name: [name]Department: [department]Salary: [salary]Years of Service: [yearsOfService]
- 다음과 같은 기능을 수행하는
promoteEmployee함수를 작성합니다.Employee구조체에 대한 포인터를 매개변수로 받습니다.- 화살표 연산자를 사용하여 급여를 15% 인상합니다.
- 근속 연수를 1 증가시킵니다.
Employee promoted successfully!를 출력합니다.
- 메인 함수에서 다음을 수행합니다.
empPtr이라는 이름의Employee구조체 포인터를 선언합니다.malloc()을 사용하여 하나의Employee구조체에 대한 메모리를 동적으로 할당합니다.- 메모리 할당이 성공했는지 확인합니다.
- 만약
empPtr이NULL이면,Memory allocation failed를 출력하고 프로그램을 종료합니다. - 성공하면,
Memory allocated successfully를 출력합니다.
- 만약
fillEmployeeData를 호출하여 직원 데이터를 채웁니다.Initial employee data:를 출력합니다.displayEmployee를 호출하여 초기 직원 정보를 보여줍니다.promoteEmployee를 호출하여 직원을 승진시킵니다.After promotion:을 출력합니다.displayEmployee를 다시 호출하여 업데이트된 정보를 보여줍니다.free(empPtr)를 사용하여 동적으로 할당된 메모리를 해제합니다.Memory freed successfully를 출력합니다.
이 챌린지는 구조체 정의, malloc()을 이용한 동적 메모리 할당, 할당 실패 확인, 함수에 구조체 포인터 전달, 화살표 연산자를 사용한 구조체 멤버 접근 및 수정, free()를 이용한 적절한 메모리 정리 등 이번 장의 모든 핵심 개념을 결합합니다. 함수들은 포인터가 어떻게 원래 구조체 데이터의 직접적인 수정을 가능하게 하는지 보여줍니다.
직접 해보기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// TODO: 여기에 Employee 구조체를 정의하세요
// TODO: 여기에 fillEmployeeData 함수를 구현하세요
// TODO: 여기에 displayEmployee 함수를 구현하세요
// TODO: 여기에 promoteEmployee 함수를 구현하세요
int main() {
// TODO: empPtr을 선언하고 메모리를 할당하세요
// TODO: 메모리 할당이 성공했는지 확인하세요
// TODO: 직원 데이터를 채우고, 초기 데이터를 표시하고, 승진시킨 후, 승진 후 데이터를 표시하세요
// TODO: 메모리를 해제하고 성공 메시지를 출력하세요
return 0;
}