목차
- 1. 구조체 템플릿 정의와 구조체 변수 선언의 차이를 설명하시오.
- 2. 다음 코드는 두 사각형 중 면적이 큰 사각형의 가로, 세로, 면적 정보를 larger에 구하는 프로그램이다. 밑줄 친 곳에서 잘못된 것을 찾아 그 이유를 설명하시오.
- 3. 인터넷 카페 회원 1명의 아이디(smartC), 비밀번호(sm8448), 나이(20), 이름(신세대)정보를 변수를 선언함과 동시에 초기화한 후 출력하고자 한다. 회원의 정보를 구조체를 사용하지 않고 처리하는 프로그램과 구조체를 사용하는 프로그램 두 개를 작성한 후 구조체와 배열의 같은 점과 차이점을 비교 설명하시오.
- 4. 다음과 같은 프로그램을 작성하기 위해 필요한 구조체를 정의하시오.
- 5. 다음 그림과 같이 직원의 사원번호, 이름, 자녀수, 기본급을 저장하기 위한 employee_info 구조체를 정의하시오.
- 6. 5번 문제에서 정의한 employee_info형 구조체 변수 employee에 직원의 정보를 입력하는 코드 부분을 적으시오.
- 7. 자녀수당은 자녀 1명은 10만원, 2명 이상은 20만원일 때 6번 문제에서 입력된 직원에 대해 자녀수당을 구하여 다음과 같이 출력하는 코드 부분을 적으시오.
- 8. 5번 문제의 employee_info 구조체에 자녀수당을 위한 extra_pay 멤버와 최종 급여를 위한 total 멤버를 추가한 후 직원 5명의 사원번호, 이름, 기본급, 자녀수를 입력받은 후 직원의 급여 명세서를 출력하는 프로그램을 작성하시오. 최종 급여는 기본급여 + 자녀수당이며 자녀수당 게산방법은 7번 문제와 같다.
- 9. 8번 문제의 프로그램 결과에 '최고 급여자: 나경대 4200000원'을 추가로 출력하는 코드 부분을 적으시오.
- 10. 7장 [프로그램 7-9] 학생 정보 조회 시스템을 구조체를 사용하여 수정하시오.
1. 구조체 템플릿 정의와 구조체 변수 선언의 차이를 설명하시오.
구조체 템플릿은 사용자 정의 자료형을 만드는 것이다. 구조체를 위한 기억 장소를 할당받기 위해서는 구조체 변수를 선언해야 한다.
2. 다음 코드는 두 사각형 중 면적이 큰 사각형의 가로, 세로, 면적 정보를 larger에 구하는 프로그램이다. 밑줄 친 곳에서 잘못된 것을 찾아 그 이유를 설명하시오.
struct rectangle
{
int width = 5, height = 2, area; //구조체 템플릿을 정의할 때 변수 내용을 초기화할 수 없음
}
int main()
{
rectangle r1 = { 3, 7 }, r2 = { 2, 5 }; //구조체임을 명시해야 함
int larger; //구조체로 정의해야 함
r1.area = r1.width * r1.height;
r2.area = r2.width * r2.height;
if (r1 > r2) //구조체 명으로 비교할 수 없음
larger = r1;
else
larger = r2;
printf("더 큰 사각형의 면적은 %d입니다.", larger.area);
return 0;
}
3. 인터넷 카페 회원 1명의 아이디(smartC), 비밀번호(sm8448), 나이(20), 이름(신세대)정보를 변수를 선언함과 동시에 초기화한 후 출력하고자 한다. 회원의 정보를 구조체를 사용하지 않고 처리하는 프로그램과 구조체를 사용하는 프로그램 두 개를 작성한 후 구조체와 배열의 같은 점과 차이점을 비교 설명하시오.
<구조체 사용>
#include <stdio.h>
struct member {
char id[7];
char password[7];
int age;
char name[10];
};
int main(void)
{
struct member m = { "smartC", "sm8448", 20, "신세대" };
printf("아이디:%s\n", m.id);
printf("비밀번호:%s\n", m.password);
printf("나이:%d\n", m.age);
printf("이름:%s\n", m.name);
return 0;
}
<구조체 미사용>
#include <stdio.h>
int main(void)
{
char id[7] = "smartC";
char password[7] = "sm8448";
int age = 20;
char name[10] = "신세대";
printf("아이디:%s\n", id);
printf("비밀번호:%s\n", password);
printf("나이:%d\n", age);
printf("이름:%s\n", name);
return 0;
}
구조체에는 여러가지 자료형을 담을 수 있지만, 배열에는 한 가지 자료형만 담을 수 있다.
4. 다음과 같은 프로그램을 작성하기 위해 필요한 구조체를 정의하시오.
① 전화번호부 관리 프로그램을 위해 개인의 이름, 집 전화번호, 휴대폰번호를 저장할 구조체
struct telephone {
char name[20];
char homeNumber[20];
char phoneNumber[20];
};
② 체중관리 프로그램을 위해 각 음식의 이름과 칼로리 정보를 저장할 구조체
struct manageWeight {
char foodName[20];
double kcal;
};
③ 은행계좌 입출금 관리 프로그램을 위해 은행계좌의 계좌번호, 고객명, 잔액, 이자율을 저장할 구조체
struct manageAccount {
char account[20];
char name[20];
int balance;
double rate;
};
5. 다음 그림과 같이 직원의 사원번호, 이름, 자녀수, 기본급을 저장하기 위한 employee_info 구조체를 정의하시오.
struct employee_info {
char no[8]; //사원번호(7자리 수수자와 문자의 조합)
char name[10]; //이름(최대 한글 4자)
int children; //자녀수
int pay; //기본급
};
6. 5번 문제에서 정의한 employee_info형 구조체 변수 employee에 직원의 정보를 입력하는 코드 부분을 적으시오.
struct employee_info e = { "abc1234", "Alice", 2, 3000000 };
7. 자녀수당은 자녀 1명은 10만원, 2명 이상은 20만원일 때 6번 문제에서 입력된 직원에 대해 자녀수당을 구하여 다음과 같이 출력하는 코드 부분을 적으시오.
int childrenPay;
if (e.children < 2)
childrenPay = 100000;
else
childrenPay = 200000;
printf("사원번호 이름\t\t기본급\t자녀수\t자녀수당\n");
printf("%-10s%-5s\t%d\t%d\t%d", e.no, e.name, e.children, e.pay, childrenPay);
8. 5번 문제의 employee_info 구조체에 자녀수당을 위한 extra_pay 멤버와 최종 급여를 위한 total 멤버를 추가한 후 직원 5명의 사원번호, 이름, 기본급, 자녀수를 입력받은 후 직원의 급여 명세서를 출력하는 프로그램을 작성하시오. 최종 급여는 기본급여 + 자녀수당이며 자녀수당 게산방법은 7번 문제와 같다.
#include <stdio.h>
struct employee_info {
char no[8]; //사원번호(7자리 수수자와 문자의 조합)
char name[10]; //이름(최대 한글 4자)
int children; //자녀수
int pay; //기본급
int extra_pay; //자녀수당
int total; //최종 급여
};
int main(void)
{
struct employee_info e[5];
for (int i = 0; i < 5; i++) {
printf("사원번호: ");
scanf_s("%s", e[i].no, 8);
printf("이름: ");
scanf_s("%s", e[i].name, 10);
printf("자녀수: ");
scanf_s("%d", &e[i].children);
printf("기본급: ");
scanf_s("%d", &e[i].pay);
if (e[i].children < 2)
e[i].extra_pay = 100000;
else
e[i].extra_pay = 200000;
e[i].total = e[i].pay + e[i].extra_pay;
}
printf("사원번호 이름\t\t최종급여\n");
for (int i = 0; i < 5; i++)
printf("%-10s%-5s\t\t%d\n", e[i].no, e[i].name, e[i].total);
return 0;
}
9. 8번 문제의 프로그램 결과에 '최고 급여자: 나경대 4200000원'을 추가로 출력하는 코드 부분을 적으시오.
#include <stdio.h>
struct employee_info {
char no[8]; //사원번호(7자리 수수자와 문자의 조합)
char name[10]; //이름(최대 한글 4자)
int children; //자녀수
int pay; //기본급
int extra_pay; //자녀수당
int total; //최종 급여
};
int main(void)
{
struct employee_info e[5];
for (int i = 0; i < 5; i++) {
printf("사원번호: ");
scanf_s("%s", e[i].no, 8);
printf("이름: ");
scanf_s("%s", e[i].name, 10);
printf("자녀수: ");
scanf_s("%d", &e[i].children);
printf("기본급: ");
scanf_s("%d", &e[i].pay);
if (e[i].children < 2)
e[i].extra_pay = 100000;
else
e[i].extra_pay = 200000;
e[i].total = e[i].pay + e[i].extra_pay;
}
//최고 급여자를 구하는 부분
char highestPerson[20];
int highest = 0;
for (int i = 0; i < 5; i++) {
if (e[i].total > highest)
strcpy(highestPerson, e[i].name);
highest = e[i].total;
}
printf("사원번호 이름\t\t최종급여\n");
for (int i = 0; i < 5; i++)
printf("%-10s%-5s\t\t%d\n", e[i].no, e[i].name, e[i].total);
printf("최고 급여자: %s %d원\n", highestPerson, highest);
return 0;
}
10. 7장 [프로그램 7-9] 학생 정보 조회 시스템을 구조체를 사용하여 수정하시오.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h> // strcmp 함수를 위한 헤더 파일
#define N 10
struct student {
char name[9];
char phone[14];
double grade;
};
int main()
{
struct student s[N] = {
{"홍길동", "010-5210-1234", 4.2},
{"이몽룡", "010-523-1628", 4.0},
{"성춘향", "010-5210-1234", 3.2},
{"제갈공명", "010-1235-8765", 4.4},
{"주몽", "010-345-1676", 3.7},
{"배장화", "010-523-7979", 2.9},
{"배홍련", "010-5210-1472", 4.0},
{"홍길동", "010-8255-8255", 3.8},
{"연흥부", "010-516-3483", 3.2},
{"연놀부", "010-8282-8282", 2.7},
};
char who[9]; // 사용자가 정보를 찾고 싶은 학생의 이름을 저장할 배열
int cnt, i; // who와 같은 이름의 학생 수를 저장할 변수
// 사용자로부터 정보를 검색하고 싶은 학생의 이름을 입력받기
printf("정보를 찾고 싶은 학생 이름은? ");
scanf("%s", who);
printf("\n\n");
printf("=======================================\n");
printf(" 이름 전화번호 평점 \n");
printf("=======================================\n");
/* 사용자가 찾는 문자열 who와 name 배열에 저장된 문자열 name[i]를 차례로 비교하면서
같은 이름을 찾을 때마다 카운터를 1 증가하고 그 학생의 이름, 전화번호, 평점을 출력하기 */
cnt = 0;
for (i = 0; i < N; i++)
if (strcmp(who, s[i].name) == 0) // who와 name[i]가 같은 문자열이면
{
cnt++;
printf(" %-10s %-14s %5.1lf \n", s[i].name, s[i].phone, s[i].grade);
}
printf("=======================================\n");
// 조회를 마친 후 몇 명을 찾았는지 또는 조회에 실패하였는지 안내문 출력하기
if (cnt == 0)
printf(" %s(이)라는 학생은 없습니다. \n", who);
else
printf("총 %d명의 학생을 찾았습니다. \n", cnt);
return 0;
}