본문 바로가기
컴퓨터/코딩

(제3판)C언어 콘서트 CHAPTER 11. Programming 문제 개인풀이

by 혼란한물범 2022. 8. 5.
반응형

개정3판 11장 프로그래밍 문제

개인풀이이기 때문에 출제자가 의도한 정답과 다를 수 있다.

 

 

Visual Studio로 실행해보고 싶은 사람들은 아래 링크에서 해당 문제를 찾아 복사 - 붙여넣기 하자 (다운받지 않아도 된다)

https://mega.nz/file/RekmnCjS#QcwVahIsVPgQHEHfwECuX8UM-03UjsUtgdq6PJrBPQM

 

 

1. 학생을 나타내는 구조체 student를 정의하고 테스트한다. student는 주민등록번호(문자열), 이름(문자열), 전화번호(문자열)로 구성된다. 구조체 안에서 공용체를 사용하여 주민등록번호 또는 학번 중에서 하나를 사용할 수 있도록 구조체를 정의해보자.

#include <stdio.h>

struct student {
union {
char number[30];
char stu_number[30];
};
char name[20];
char phone[20];
};

int main(void)
{
struct student s[10] = {
{"123456-678901", "홍길동", "123-4567"},
{"123456-678901", "홍길동2", "123-4567"},
{"123456-678901", "홍길동3", "123-4567"},
{"123456-678901", "홍길동4", "123-4567"},
{"123456-678901", "홍길동5", "123-4567"},
{"123456-678901", "홍길동6", "123-4567"},
{"123456-678901", "홍길동7", "123-4567"},
{"123456-678901", "홍길동8", "123-4567"},
{"123456-678901", "홍길동9", "123-4567"},
{"123456-678901", "홍길동10", "123-4567"}
};

for (int i = 0; i < 10; i++) {
printf("%s\n", s[i].name);
}

return 0;
}

 

 

2. 구조체를 이용하여 이메일을 표현할 수 있는 구조체를 정의하고, 적당한 초기값을 부여하고 출력하는 프로그램을 작성하라. 구조체의 멤버는 제목, 수신자, 발신자, 내용, 날짜, 우선순위 등으로 구성된다.

#include <stdio.h>

struct email {
char title[50];
char sender[30];
char receiver[30];
char content[1000];
char date[30];
char priority[5];
};

int main(void)
{
struct email s[10] =
{"안녕하세요, 홍길동입니다.", "to 아무개 ", "from 홍길동", "앞으로도 잘 부탁드리겠습니다.\n", "2022.08.05 금요일\n", "1"};

for (int i = 0; i < 10; i++) {
printf("%s\n%s%s\n%s%s%s", s[i].title, s[i].sender, s[i].receiver, s[i].content, s[i].date, s[i].priority);
}

return 0;
}

 

 

3. 두 개의 복소수를 더하는 프로그램을 작성하여 보자. 복소수 a+bi와 c+di의 덧셈은 다음과 같다. 복소수는 구조체를 사용하여 표현하여 보자. 복소수의 덧셈을 수행하는 함수 add_complex()를 정의하여 사용한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct complex {
double a;
double b;
};

void get_input(struct complex* px) {
scanf("%lf", &px->a);
scanf("%lf", &px->b);
}

struct complex add_complex(struct complex a, struct complex b) {
struct complex z;
z.a = a.a + b.a;
z.b = a.b + b.b;

return z;
}

int main(void)
{
struct complex c1, c2;
struct complex result = { 0.0, 0.0 };

printf("첫번째 복소수를 입력하시오(a, b):");
get_input(&c1);

printf("두번째 복소수를 입력하시오(a, b):");
get_input(&c2);

result = add_complex(c1, c2);

printf("%.1lf + %.1lfi", result.a, result.b);

return 0;
}

 

 

4. 구조체를 이용하여서 현재 시간을 표현한다. 사용자로부터 2개의 시간을 입력받아서 두 시간 사이의 차이를 계산하여 출력하는 프로그램을 작성한다. 2개의 시간을 받아서 시각 차이를 계산하는 diff_time() 함수를 작성하여 사용한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct time {
int hour;
int minute;
int second;
};
void receive(struct time* px) {
scanf("%d", &px->hour);
scanf("%d", &px->minute);
scanf("%d", &px->second);
}
struct time diff_time(struct time* px, struct time* qx) {
struct time z;

z.hour = qx->hour - px->hour;
if (qx->minute < px->minute) {
z.hour -= z.hour;
z.minute = (60 - px->minute) + qx->minute;
}
else
z.minute = qx->minute - px->minute;
if (qx->second < px->second) {
z.minute -= z.minute;
if (z.minute < 0) {
z.hour -= z.hour;
z.minute = 60 - z.minute;
}
z.second = (60 - px->second) + qx->second;
}
else
z.second = qx->second - px->second;

return z;
}

int main(void)
{
struct time t1, t2;
struct time result = { 0, 0, 0 };

printf("시작시간(시, 분, 초): ");
receive(&t1);

printf("종료시간(시, 분, 초): ");
receive(&t2);

result = diff_time(&t1, &t2);

printf("소요시간 %d:%d:%d", result.hour, result.minute, result.second);

return 0;
}

 

 

5. 직원을 나타내는 구조체 employee가 사번(정수), 이름(문자열), 전화번호(문자열), 나이(정수) 등으로 구성된다. 구조체의 배열을 선언하고 10명의 데이터로 초기화하라. 이중에서 나이가 20 이상 30 이하인 직원을 찾아서 출력하라.

#include <stdio.h>

struct employee {
int number;
char name[20];
char phone[30];
int age;
};

int main(void)
{
struct employee e[10] = {
{1, "홍길동", "1234-5670", 20},
{2, "홍길동2", "1234-5671", 35},
{3, "홍길동3", "1234-5672", 28},
{4, "홍길동4", "1234-5673", 45},
{5, "홍길동5", "1234-5672", 24},
{6, "홍길동6", "1234-5672", 27},
{7, "홍길동7", "1234-5672", 53},
{8, "홍길동8", "1234-5672", 57},
{9, "홍길동9", "1234-5672", 12},
{10, "홍길동10", "1234-5672", 29},
};

for (int i = 0; i < 10; i++) {
if (e[i].age >= 20 && e[i].age <= 30) {
printf("%s\n", e[i].name);
}
}

return 0;
}

 

 

6. 상품 재고 관리 시스템을 작성하여 보자. 재고는 상품의 이름, 가격, 개수, 총재고액으로 이루어진다. 총재고액은 (가격*개수)로 계산할 수 있다. 입력이 끝나면 재고를 검색할 수 있도록 한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
#define SIZE 100

struct employee {
char name[20];
int price;
int number;
int f_price;
};
void get_name(struct employee* e) {
scanf("%s", &e->name);
getchar();
}
void question(char *reply) {
while (*reply != 'y' && *reply != 'Y') {
printf("계속 검색하시겠습니까?(y/n) ");
scanf("%c", reply);

if (*reply == 'n' || *reply == 'N')
break;
else if (*reply != 'y' && *reply != 'Y')
printf("잘못된 입력입니다.\n");
}
}

int main(void)
{
struct employee e[SIZE];
int x = 0, result = 0, number = 0;
char reply;

while ( 1 ) {
printf("상품의 이름을 입력하세요(종료 = end 입력): ");
get_name(&e[x]);
if (strcmp(e[x].name, "end") == 0 || strcmp(e[x].name, "END") == 0 || strcmp(e[x].name, "End") == 0)
break;
printf("상품의 가격을 입력하세요: ");
scanf("%d", &e[x].price);
printf("상품의 개수를 입력하세요: ");
scanf("%d", &e[x].number);
getchar();

e[x].f_price = e[x].price * e[x].number;
x++;
}

while (1) {
reply = 'n';
system("cls");
printf("몇 번째의 상품을 검색하시겠습니까?(정수로 입력) ");
scanf("%d", &number);
getchar();
if (number == x) {
printf("%d번은 end 번호입니다.\n", number);
question(&reply);
if (reply == 'n' || reply == 'N')
break;
}

printf("===================\n");
printf("상품의 이름: %s\n", e[number].name);
printf("상품의 가격: %d\n", e[number].price);
printf("상품의 개수: %d\n", e[number].number);
printf("===================\n");
printf("총재고액: %d\n\n", e[number].f_price);
question(&reply);
if (reply == 'n' || reply == 'N')
break;
}
printf("\n프로그램을 종료합니다.");

return 0;
}

 

 

7. 열거형을 사용하여 사람과 컴퓨터 사이의 가위, 바위, 보 게임을 구현하여 보자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <windows.h>

enum rsp { rock, sissors, paper };

int main(void) {
enum rsp computer;
enum rsp user;
char replay;

while (1) {
system("cls");
srand(time(NULL));

printf("가위(0), 바위(1), 보(2)를 입력하세요: ");
scanf("%d", &user);

computer = rand() % 3;

if (user == computer) {
printf("컴퓨터: %d     플레이어: %d\n", computer, user);
printf("비겼습니다\n\n");
}
else if ((user + 1) == computer) {
printf("컴퓨터: %d     플레이어: %d\n", computer, user);
printf("졌습니다\n\n");
}
else if (user == (computer - 2) || user == (computer + 1)) {
printf("컴퓨터: %d     플레이어: %d\n", computer, user);
printf("이겼습니다\n\n");
}
else {
continue;
}

printf("다시 하시려면 R키를 입력해주세요.\n");
replay = _getch();

if (replay == 'r' || replay == 'R') {
continue;
}
else {
printf("게임을 종료합니다.\n");
return 0;
}
}
}

반응형

댓글