본문 바로가기
IT/프로그래밍

쉽게 풀어 쓴 C언어 Express 17장 프로그래밍 문제 해설

by nutrient 2020. 12. 10.
728x90
728x170

쉽게 풀어 쓴 C언어 Express 17장 프로그래밍 문제 해설

 

쉽게 풀어 쓴 C언어 Express 17장 프로그래밍 문제 해설

 

1.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(void) {

int count, i;

int value, sum;

int *darray;

printf("정수의 개수: ");

scanf("%d", &count);

darray = (int *)malloc(count*sizeof(int));

if( darray == NULL ) {

printf("동적 메모리 할당 오류");

exit(1);

}

for (i=0;i<count;i++) {

printf("양의 정수를 입력하시오: ");

scanf("%d", &darray[i]);

}

sum = 0;

for (i=0;i<count;i++) {

sum += darray[i];

}

printf("합은 %d입니다.\n", sum);

return 0;

}

2. 

문자열의 개수: 10

10개의 문자열을 저장할 수 있는 공간이 할당되었습니다. HINT 오타!

HINT 문자열은 char*로 가리킬 수 있다. 문자열의 배열은 char**로 가리킬 수 있다. 다음

의 코드를 참조하라. char** A = NULL;

if ((A = malloc(n*sizeof(char*))) != NULL) {

// 먼저 n개의 포인터를 위한 공간을

할당한다.

 for (i=0;i<n;i++)

 A[i] = (char*)malloc(100);

// 100개의 문자를 저장할 수 있는 공간 할당

}

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(void) {

int n, i;

char **A;

printf("문자열의 개수: ");

scanf("%d", &n);

if ((A = (char **)malloc(n*sizeof(char*))) != NULL) {

for (i=0;i<n;i++)

A[i] = (char*)malloc(100);

}

for (i=0;i<n;i++)

sprintf(A[i] ,"%d", i);

for (i=0;i<n;i++)

printf("%s \n", A[i]);

for (i=0;i<n;i++)

free(A[i]);

free(A);

return 0;

}

3.

#include <stdio.h>

#include <stdlib.h>

typedef struct contacts {

// 구조체 타입 정의

char name[100];

char mobile_phone[100];

}

CONTACTS;

int main(void) {

CONTACTS *contacts;

// 동적 메모리 공간을 가리키는 포인터

int size, i;

printf("주소의 개수: ");

scanf("%d", &size);

contacts = (CONTACTS *)malloc(sizeof(CONTACTS)* size);

// 동적 메모리 할당

if( contacts == NULL ) {

printf("동적 메모리 할당 오류");

exit(1);

}

for (i=0; i<size ;i++) {

printf("이름을 입력하시오: ");

fflush(stdin);

// 입력 버퍼를 비운다. gets(contacts[i].name);

printf("휴대폰 번호를 입력하시오: ");

gets(contacts[i].mobile_phone);

}

printf("========================\n");

printf("이름 휴대폰 번호\n");

printf("========================\n");

for (i=0;i<size;i++)

printf("%s %s \n", contacts[i].name, contacts[i].mobile_phone);

printf("\n========================\n");

free(contacts);

// 동적 메모리 공간 해제

return 0;

}

4.

#include <stdio.h>

#include <stdlib.h>

char* get_word() {

char* s = (char *)malloc(50);

if (s == NULL) {

printf("메모리 할당 오류\n");

exit( 1 );

}

printf("단어를 입력하시오(최대 50글자):");

scanf("%s", s);

return s;

}

int main(void) {

char *p;

p = get_word();

free(p);

return 0;

}

5.

#include <stdio.h>

#include <malloc.h>

typedef int DATA;

typedef struct NODE {

DATA data;

struct NODE *link;

}

NODE;

void print_list(NODE *plist);

int get_integer();

int main(void) {

NODE *plist;

NODE *curr = NULL, *prev = NULL;

int i;

plist = NULL;

while(1) {

i = get_integer();

if(i < 0)

break;

curr = (NODE *)malloc(sizeof(NODE));

curr->data = i;

curr->link = NULL;

if(prev == NULL)

plist = curr; else prev->link = curr;

prev = curr;

}

print_list(plist);

return 0;

}

void print_list(NODE *plist) {

NODE *p;

p = plist;

while(p) {

printf("%d->",p->data);

p = p->link;

}

printf("NULL\n");

}

int get_integer() {

int num;

printf("양의 정수를 입력하세요(종료 -1): ");

scanf("%d",&num);

return num;

}

6.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define TRUE 1

#define FALSE 0

typedef struct {

char name[30];

char phone[20];

}

DATA;

typedef struct NODE {

DATA data;

struct NODE *link;

}

NODE;

NODE *search_pos(NODE *plist, char name[]);

NODE *search(NODE *plist, char name[]);

NODE *create_node(char *name, char* phone, NODE *link);

void insert_node(NODE **phead, NODE *node, NODE *prev);

void print_menu();

int main(void) {

char name_t[30]= {

'\0'

}

;

char phone_t[20]= {

'\0'

}

;

char cmenu=1;

int bEscape = FALSE;

NODE* List = NULL;

NODE* Temp = NULL;

while(TRUE) {

fflush(stdin);

print_menu();

printf("번호를 입력하세요 : ");

scanf("%c", &cmenu);

switch(cmenu) {

case '1':

break;

case '2':

printf("이름 : ");

scanf("%s", name_t);

printf("번호 : ");

scanf("%s", phone_t);

insert_node(&List, create_node(name_t, phone_t, NULL),

search_pos(List, name_t));

printf("추가되었습니다.\n");

break;

case '3':

printf("찾을 이름을 입력하세요 : ");

scanf("%s", name_t);

Temp = search(List, name_t);

if(Temp!=NULL) {

printf("전화 번호부를 찾았습니다.\n");

printf("이름 : %s\n번호 : %s\n", Temp->data.name,

Temp->data.phone);

} else

printf("데이터를 찾지 못했습니다.\n");

break;

case '4':

printf("찾을 이름을 입력하세요 : ");

scanf("%s", name_t);

Temp = search(List, name_t);

printf("변경할 이름을 입력하세요 : ");

scanf("%s", name_t);

printf("변경할 번호를 입력하세요 : ");

scanf("%s", phone_t);

strcpy(Temp->data.name, name_t);

strcpy(Temp->data.phone, phone_t);

printf("데이터가 변경되었습니다.\n");

break;

case '5':

bEscape = TRUE;

break;

default:

printf("잘못 입력 하셨습니다. 다시입력해주세요.\n");

break;

}

if(bEscape)

break;

}

return 0;

}

void print_menu() {

printf("------------------------------\n");

printf("1. 초기화\n");

printf("2. 전화 번호 추가\n");

printf("3. 전화 번호 탐색\n");

printf("4. 전화 번호 변경\n");

printf("5. 종료\n");

printf("------------------------------\n");

}

NODE *search_pos(NODE *plist, char name[]) {

NODE *curr, *prev;

prev = NULL;

curr = plist;

while(curr != NULL) {

if(strcmp(curr->data.name, name) > 0)

break;

prev = curr;

curr = curr->link;

}

return prev;

}

NODE *search(NODE *plist, char name[]) {

NODE *curr;

curr = plist;

while(curr != NULL) {

if(strcmp(curr->data.name, name) == 0)

break;

curr = curr->link;

}

return curr;

}

NODE *create_node(char *name, char* phone, NODE *link) {

NODE *new_node;

new_node = (NODE *)malloc(sizeof(NODE));

if( new_node == NULL ) {

fprintf(stderr, "메모리 할당 에러\n");

exit(1);

}

strcpy(new_node->data.name, name);

strcpy(new_node->data.phone, phone);

new_node->link = link;

return(new_node);

}

void insert_node(NODE **phead, NODE *node, NODE *prev) {

if( *phead == NULL ) {

*phead = node;

node->link = NULL;

} else if(prev == NULL) {

node->link = (*phead)->link;

(*phead) = node;

} else {

node->link = prev->link;

prev->link = node;

}

}

7.

#include <stdio.h>

#include <stdlib.h>

#define INSERT 1

#define PRINT 2

#define QUIT 3

#define S_SIZE 50

typedef struct data {

char title[S_SIZE];

int year;

}

DATA;

typedef struct NODE {

DATA data;

struct NODE *link;

}

NODE;

NODE *insert_node(NODE *plist,NODE *pprev,DATA item) {

NODE *pnew = NULL;

if(!(pnew = (NODE*)malloc(sizeof(NODE)))) {

printf("메모리 동적 할당 오류\n");

exit(1);

}

pnew->data = item;

if(pprev == NULL) {

pnew->link = plist;

plist = pnew;

} else {

pnew->link = pprev->link;

pprev->link = pnew;

}

return plist;

}

void display_menu() {

printf("-------------------------------------\n");

printf("1. 영화 정보 추가\n");

printf("2. 영화 정보 출력\n");

printf("3. 종료\n");

printf("-------------------------------------\n");

}

int get_selectde_menu() {

int selmenu = 0;

printf("번호를 선택하시오 : ");

scanf("%d", &selmenu);

return selmenu;

}

DATA get_input() {

DATA input;

printf("영화의 제목을 입력하시오 : ");

scanf("%s", input.title);

printf("영화의 개봉 연도를 입력하시오 : ");

scanf("%d", &input.year);

return input;

}

void print_list(NODE *plist) {

NODE *ptr;

for (ptr=plist;ptr;ptr=ptr->link) {

printf("-------------------------------------\n");

printf("제 목 : %s\n", ptr->data.title);

printf("개봉 연도 : %d\n", ptr->data.year);

}

printf("-------------------------------------\n");

}

void destroy_nodes(NODE *plist) {

NODE *temp;

while(plist) {

temp = plist;

plist = plist->link;

free(temp);

}

}

int main(void) {

NODE *plist = NULL;

int selected = 0;

DATA d;

while(selected != QUIT) {

display_menu();

selected = get_selectde_menu();

switch(selected) {

case INSERT:

d = get_input();

plist = insert_node(plist,NULL,d);

break;

case PRINT:

print_list(plist);

break;

case QUIT:

destroy_nodes(plist);

break;

}

}

return 0;

}
728x90
그리드형

댓글