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;
}
'프로그래밍 > C언어' 카테고리의 다른 글
[쉽게 풀어쓴 C언어 Express 개정4판] 15장 Exercise & Programming (3) | 2024.10.17 |
---|---|
[쉽게 풀어쓴 C언어 Express 개정4판] 14장 Exercise & Programming (1) | 2024.10.17 |
[쉽게 풀어쓴 C언어 Express 개정4판] 13장 Exercise & Programming (10) | 2024.02.12 |
[쉽게 풀어쓴 C언어 Express 개정4판] 12장 Exercise & Programming (4) | 2024.02.12 |
[쉽게 풀어쓴 C언어 Express 개정4판] 11장 Exercise & Programming (5) | 2024.02.12 |
댓글