<C프로그래밍-새내기를 위한 첫 C 언어 책>연습문제 chapter 11(1번~10번)

목차

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;
}