반응형
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;
}
반응형
'프로그래밍 > C, C++' 카테고리의 다른 글
[C++] 변수를 초기화하는 세 가지 방법 (0) | 2022.11.18 |
---|---|
[C++] 입출력(cin, cout)과 네임스페이스(namespace) (0) | 2022.11.17 |
<C프로그래밍-새내기를 위한 첫 C 언어 책>연습문제 chapter 10(16번~21번) (0) | 2020.11.26 |
c언어 콘솔에서 음악 동시에 재생하기(mcisendCommand, playsound) (3) | 2020.11.18 |
<C프로그래밍-새내기를 위한 첫 C 언어 책>연습문제 chapter 10(11, 12, 13, 14, 15) (0) | 2020.10.18 |