본문 바로가기
흔한 학교 생활/든든한 C 프로그래밍

[C언어] 든든한 C 프로그래밍 3판 11장 연습문제 답 풀이

by 흔한 학생 2023. 7. 10.
반응형

[11-4] 

sizeof(emps)는 112
sizeof(struct EMP) 는 28
이므로 답은 4
 

[11-5]

//1번
struct A {
	int age;
	char name[20] //세미콜론 없음
}st;
age=20; //st.age로 접근해야 함

//2번
struct A {
	int age;
	char name[20] //세미콜론 없음
}st,*ptr;
ptr=st; //구조체 변수는 포인터가 아니므로 주소 연산자 & 를 붙여야 함

//3번
struct A {
	int age;
	char name[20] //세미콜론 없음
}st, *ptr;

ptr=&st;
ptr.age=25; //포인터 변수에는 (*ptr).age 혹은 ptr->age 사용해야함

 

11-6

 
학번 문자 크기가 6이라서 이상하게 나오는 것일텐데 왜 의료공학이 붙는지 모르겠

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning(disable:4996)

struct student {
	char st_no[6], subject[20], name[10], entry, telno[15];
};
void main()
{
	struct student st1;
	printf("학번 ? ");
	scanf("%s", st1.st_no);
	printf("학과 ? ");
	scanf("%s", st1.subject);
	printf("성명 ? ");
	scanf("%s%*c", st1.name);
	printf("등록여부<1:등록, 0:미등록> ? ");
	scanf("%c", &st1.entry);
	printf("전화번호 ? ");
	scanf("%s", st1.telno);

	printf("\n\n\n%s, %s, %s, %c, %s", st1.st_no, st1.subject, st1.name, st1.entry, st1.telno);
}

결과

학번 ? 2007123
학과 ? 의료공학
성명 ? 안병욱
등록여부<1:등록, 0:미등록> ? 1
전화번호 ? 010-001-0123


200712의료공학, 의료공학, 안병욱, 1, 010-001-0123

 
 
해결방법

주어진 코드에서 출력 결과가 원하는 대로 나오지 않는 이유는 scanf 함수를 사용할 때 %s 포맷 지정자를 사용하여 문자열을 입력받을 때 공백 문자가 문자열에 포함되지 않도록 처리해야 합니다. 현재 코드에서는 공백 문자가 입력된 후에 다음 입력으로 넘어가므로 문제가 발생합니다.

해결 방법은 scanf("%s", st1.subject);와 같은 코드를 scanf(" %[^\n]", st1.subject);로 수정하여 공백을 포함한 문자열을 입력받을 수 있도록 하여야 합니다. %[^\n]는 개행 문자 \n이 나올 때까지 모든 문자를 입력받는 형식 지정자입니다.

아래는 수정된 코드입니다:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning(disable:4996)

struct student {
	char st_no[6], subject[20], name[10], entry, telno[15];
};

void main()
{
	struct student st1;
	printf("학번? ");
	scanf("%s", st1.st_no);
	printf("학과? ");
	scanf(" %[^\n]", st1.subject);
	printf("성명? ");
	scanf(" %[^\n]", st1.name);
	printf("등록여부<1:등록, 0:미등록>? ");
	scanf(" %c", &st1.entry);
	printf("전화번호? ");
	scanf("%s", st1.telno);

	printf("\n\n\n%s, %s, %s, %c, %s", st1.st_no, st1.subject, st1.name, st1.entry, st1.telno);
}

 

11-7

 
width에 넓이를 저장

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct point {
	int x;
	int y;
}POINT;
struct rectangle {
	int width;
	POINT p[2];
};

int main()
{
	struct rectangle rect;
	POINT rightTop = { 7,10 }; //변수에 7, 10 저장
	POINT leftDown = { 3,5 }; //변수에 3, 5 저장

	rect.p[0] = rightTop;  
	rect.p[1] = leftDown;

	rect.width = (rect.p[0].x - rect.p[1].x) * (rect.p[0].y - rect.p[1].y);
	printf("가로:%d, 세로:%d, 사각형의 넓이 : %d 이다.",
		rect.p[0].x - rect.p[1].x, rect.p[0].y - rect.p[1].y, rect.width);

	return 0;
}

 
결과

가로:4, 세로:5, 사각형의 넓이 : 20 이다.

 

11-8

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)

struct A {
	char dept[20];
	char name[20];
	enum B {
		manager1 = 1, manager2, manager3, employee1,
		employee2
	} position;
	int salary;
	int sudang;
} emps[10];

int main()
{
	int i, count;
	char tmp[20];

	for (i = 0; i < 10; i++)
	{
		printf("%d, 부서 ?(종료:end) ", i + 1);
		gets(emps[i].dept); //dept에 부서 저장
		if (!strcmp(emps[i].dept, "end"))
			break;
		printf("   성명 ? ");
		gets(emps[i].name); //name에 성명 저장
		printf("   직급 =>");
		do {
			printf(" 1:사장,2:부장,3:과장,4:대리,5:사원 ? ");
			scanf("%d", &emps[i].position); //position에 직급 저장
		} while (emps[i].position < 1 || emps[i].position>5);
		printf("   월급 ? ");
		scanf("%d%*c", &emps[i].salary); //salary에 월급 저장

		if (emps[i].position >= manager2) //수당 계산
			emps[i].sudang = 70000;
		else
			emps[i].sudang = 50000;
	}

	count = i;

	printf("----------------------------------\n");
	printf("   부서  성명   직급   실수령액 \n");
	printf("----------------------------------\n");
	
	//삼항 연산자 이용
	for (i = 0; i < count; i++)
	{
		printf("%6s, %6s, %5s,%10d \n",emps[i].dept,emps[i].name,
			emps[i].position == 1 ? "사장" : 
			emps[i].position == 2 ? "부장" : 
			emps[i].position == 3 ? "과장" : 
			emps[i].position == 4 ? "대리" : "사원",emps[i].salary+emps[i].sudang);
	}

	return 0;

}

결과

1, 부서 ?(종료:end) 영업부
   성명 ? 홍길동
   직급 => 1:사장,2:부장,3:과장,4:대리,5:사원 ? 2
   월급 ? 3700000
2, 부서 ?(종료:end) 인사부
   성명 ? 까꿍이
   직급 => 1:사장,2:부장,3:과장,4:대리,5:사원 ? 5
   월급 ? 2700000
3, 부서 ?(종료:end) end
----------------------------------
   부서  성명   직급   실수령액
----------------------------------
영업부, 홍길동,  부장,   3770000
인사부, 까꿍이,  사원,   2770000

 

11-9

구조체 포인터 변수를 이용해 출력하라 
답지에서는 while 사용하였고 여기서는 for 사용

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)

struct EMP {
	char name[20];
	int age;
	int salary;
};

int main()
{
	int i;
	struct EMP emps[4] = {
	{"진달래", 20, 500000},
	{"개나리", 23, 600000},
	{"까꿍이", 27, 700000},{NULL} };
	struct EMP* ptr;
	ptr = emps;

	for (i = 0; i < 4; i++)
	{
		if (emps[i].name[0] == '\0')
			break;
		printf("%s, %d, %d\n", (ptr + i)->name, (ptr + i)->age, (ptr + i)->salary);
	}
	return 0;

결과

진달래, 20, 500000
개나리, 23, 600000
까꿍이, 27, 700000

 

11-10

ptr을 증가시키지 않았다면 1번과 같은 답이 나왔겠지만
ptr의 주소가 증가했기 때문에 개나리, 23, 950000이 나올 것이다.
정답: 2

반응형