IT/C언어

[쉽게 풀어쓴 C언어 Express 개정4판] 17장 Exercise & Programming

곰탱이들 2024. 2. 13.

17장 Exercise & Programming

17장 Exercise

 

1. 3번
2. 1번
3

char* p; 
p = (char *)malloc(1000); 
printf(“텍스트를 입력하시오: “); 
gets(p); 
printf(“입력된 텍스트는 %s입니다. \n”, p);

4. a) malloc(), free()
    b) void *
    c) size_t

 

5. a) int *pi;
        pi = (int *)malloc(sizeof(int)*10);
    b) char *pi;
        pi = (char *)calloc(10, sizeof(char));
    c) char *pc;
        pc = (char *)malloc(10*sizeof(char));
        또는 
        double *pc;
        pc = (double *)malloc(10*sizeof(double));

 

6.a) double *pd;
        pd = (double *)malloc(sizeof(double));
        *pd = 3.14;
    b) int *pi;
        pi = (int *)malloc(sizeof(int)*5);
        pi[0] = 1;
        pi[1] = 2;
        pi[2] = 3;
        pi[3] = 4;
        pi[4] = 5;

 

7. B가 가리키고 있었던 메모리 주소가 사라진다. 

8. a) 포인터 p가 다음 노드를 가리키도록 함
    b) 현재 노드의 다음, 다음 노드
    c) plist가 NULL이 아니라면 반복이 끝난 후에 p는 모두 연결 리스트의 마지막 노드를 가
        리킨다.

 

9. 2번

17장 Programming

 

1

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

int main(void) {
	int* int_ptr;
	char* char_ptr;
	float* float_ptr;

	int_ptr = (int*)malloc(sizeof(int));
	char_ptr = (char*)malloc(sizeof(char));
	float_ptr = (float*)malloc(sizeof(float));

	printf("정수를 입력하시오: ");
	scanf("%d", int_ptr);

	printf("문자를 입력하시오: ");
	scanf(" %c", char_ptr);

	printf("실수를 입력하시오: ");
	scanf("%f", float_ptr);

	printf("입력된 값은 %d, %c, %f 입니다.", *int_ptr, *char_ptr, *float_ptr);

	free(int_ptr);
	free(char_ptr);
	free(float_ptr);

	return 0;
}

 

2

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

int main(void) {
	int n;
	float* numbers, sum = 0.0;

	printf("실수의 개수: ");
	scanf("%d", &n);
	numbers = (float*)malloc(n * sizeof(float));
		for (int i = 0; i < n; i++) {
			printf("실수를 입력하시오: ");
			scanf("%f", &numbers[i]);
			sum += numbers[i];
		}
	printf("합은 %.1f입니다.", sum);
	free(numbers);

	return 0;
}

 

3

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100

int main(void) {
	int i, * ptr;
	int max;
	ptr = (int*)malloc(N * sizeof(int));

	if (ptr == NULL) {
		printf("메모리 할당 실패\n");
		exit(1);
	}
	srand(time(NULL));
	for (i = 0; i < N; i++) {
		*(ptr + i) = rand() % 100;
	} max = *ptr;
	for (i = 1; i < N; i++) {
		if (*(ptr + i) > max) {
			max = *(ptr + i);
		}
	}
	printf("난수 중에서 최대 값은 %d입니다.\n", max);
	free(ptr);

	return 0;
}

 

4

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

int main(void) {
	int max_length;
	char* str;

	printf("문자열의 최대 길이를 입력하시오: ");
	scanf("%d", &max_length);

	str = (char*)malloc(max_length * sizeof(char));
	if (str == NULL) {
		printf("메모리 할당 실패\n");
		return 1;
	}

	printf("문자열을 입력하시오: ");
	scanf("%s", str);

	printf("입력된 문자열은 %s 입니다.\n", str);
	free(str);

	return 0;
}

 

5

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

int main(void) {
	char* str;
	str = (char*)malloc(20 * sizeof(char));
	if (str == NULL) {
		printf("메모리 할당 실패");
		return 1;
	}

	strcpy(str, "hangookuniv");
	printf("문자열 = %s, 주소 = %p\n", str, str);

	str = (char*)realloc(str, 30 * sizeof(char));
	if (str == NULL) {
		printf("메모리 할당 실패");
		return 1;
	}

	strcat(str, ".com");
	printf("문자열 = %s, 주소 = %p\n", str, str);
	free(str);

	return 0;
}

 

6

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

typedef struct rec {
	int i;
	float PI;
	char A;
} my_record;

int main(void) {
	my_record* ptr;
	ptr = (my_record*)malloc(sizeof(my_record));
	if (ptr == NULL) {
		printf("메모리 할당 실패");
		return 1;
	}

	ptr->i = 10;
	ptr->PI = 3.14;
	ptr->A = 'a';

	printf("i = %d\n PI = %.2f\n A = %c\n", ptr->i, ptr->PI, ptr->A);
	free(ptr);

	return 0;
}

 

7

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

struct course {
	char subject[30]; // 과목 이름
	double marks; // 학점
};

int main(void) {
	int n, i;
	struct course* ptr;

	printf("구조체의 개수: ");
	scanf("%d", &n);
	ptr = (struct course*)malloc(n * sizeof(struct course));

	if (ptr == NULL) {
		printf("동적 메모리 할당 실패");
		exit(1);
	}
	for (i = 0; i < n; i++) {
		printf("과목 이름과 성적: "); scanf("%s %lf", (ptr + i)->subject, &(ptr + i)->marks);
	}
	printf("\n");
	for (i = 0; i < n; i++) {
		printf("%s\t\t%.1f\n", (ptr + i)->subject, (ptr + i)->marks);
	}
	free(ptr);

	return 0;
}

 

8

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

9

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

	printf("연결 리스트를 이용한 전화 번호부 메뉴\n");
	while (TRUE)
	{
		fflush(stdin);
		print_menu();

		printf("번호를 입력하세요 : ");
		scanf("%c", &cmenu);

		getchar();
		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;
	}
}

 

10

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

int main(void) {
	char* str;
	int length = 100;

	str = (char*)malloc(length * sizeof(char));
	if (str == NULL) {
		printf("메모리 할당 실패");
		exit(1);
	}

	printf("문자열을 입력하시오: ");
	fgets(str, length, stdin);

	FILE* fp;
	fp = fopen("sample.txt", "w");
	if (fp == NULL) {
		printf("파일 열기 실패");
		exit(1);
	}

	fprintf(fp, "%s", str);
	fclose(fp); // 동적 메모리 해제
	free(str);

	printf("파일 sample.txt로 저장되었습니다.\n");

	return 0;
}

 

댓글