AR삽질러

C로 시작하는 컴퓨터 프로그래밍4판 - 10장 Pointer 본문

C

C로 시작하는 컴퓨터 프로그래밍4판 - 10장 Pointer

아랑팡팡 2023. 4. 25. 12:16
728x90

혼자해보기 10-1

 다음 프로그램의 실행결과를 예측하시오(단, a의 주소번지를 1000번, p의 주소 번지를 1200번이라고 가정한다.)

#include<stdio.h>

int main (void) {

	int a = 10;
	int* p = &a;

	printf("%p\n", p);
	printf("%p\n", &p);
	printf("%d", *p);
	
	return 0;
}

1200

1000

10

 

혼자해보기 10-2

 다음 프로그램의 실행결과를 예측하시오.

#include<stdio.h>

int main (void) {

	int a[] = { 5, 10, 15, 20, 25 };
	int* p = a;
	int i;

	for (i = 0; i < 5; i++) 
		printf("*(p+%d) + %d = %d이다.\n", i, i, *(p + i) + i);
	
	
	return 0;
}

*(p+0) + 0 = 5이다.

*(p+1) + 1 = 11이다.

*(p+2) + 2 = 17이다.

*(p+3) + 3 = 23이다.

*(p+4) + 4 = 29이다.

 

혼자해보기 10-3

 [예제 10-8]에서 함수의 정의 부분을 다음과 같이 수정한 후 실행해보시오.

#include<stdio.h>

int SumArray(const int* pA, int Size);
int main(void) {
	int a[] = { 10, 5, 15, 26, 7 };
	int Sum;
	Sum = SumArray(a, 5);
	printf("배열의 합 : %d \n", Sum);

	return 0;
}

int SumArray(int* pA, int Size) {
	int result = 0, i;
	for (i = 0; i < Size; i++)
		result += (*pA)++;
	return result;
}

값이 60이 나온다 수정후

#include<stdio.h>

int SumArray(const int* pA, int Size);
int main(void) {
    int a[] = { 10, 5, 15, 26, 7 };
    int Sum;
    Sum = SumArray(a, 5);
    printf("배열의 합 : %d \n", Sum);
    return 0;
}

int SumArray(const int* pA, int Size) {
    int result = 0, i;
    for (i = 0; i < Size; i++)
        result += *(pA + i);
    return result;
}

 

01 다음 프로그램의 오류를 수정하시오.

1)

#include<stdio.h>

int main (void) {

	int a[] = { 1,2,3,4,5 };
	int* pA = &a;
	int i;

	for (int i = 0; i < 5; i++) {
		printf("a[%d] = %d\n", i pA);
	}

	return 0;
}

수정

#include<stdio.h>

int main (void) {

	int a[] = { 1,2,3,4,5 };
	int* pA = a;
	int i;

	for (int i = 0; i < 5; i++) {
		printf("a[%d] = %d\n", i, *(pA+i));
	}
	return 0;
}

 

2)

#include<stdio.h>

int main (void) {

	char* pAry[][5] = { "On", "Off", "Stay" };
	int i;

	for (i = 0; i < 3; a++) 
		printf("%s\n", pAry + i);
	

	return 0;
}

수정

#include<stdio.h>

int main (void) {

	char* pAry[][5] = { { "On"}, {"Off"}, {"Stay"} };
	int i;

	for (i = 0; i < 3; i++) {
		printf("%s\n", *(*(pAry + i)));
	}
	
	return 0;
}

 

02 값에 의해서 함수를 호출하는 방식보다 주소로 함수를 호출하는 방식이 가지는 장점을 적어보시오.

 - 값에의한 호출 : 함수가 호출될 때 인자로 전달되는 값을 복사하여 함수 내부에서 사용한다. 호출한 쪽에서 전달한 값을 함수 내부에서 변경하더라도 호출하는 쪽에 영향을 미치지 않는다는 장점이 있다.

 

 - 주소로 함수를 호출 : 함수 호출시마다 인자로 전달되는 값의 주소를 전달한다. 값에 의한 호출 방식보다 메모리와 시간적인 측면에서 효율적이다. 

- 인자의 크기가 작은 경우에는 값에 의한 호출이 편리하지만 인자의 크기가 크거나 변경된 값을 확인해야 하는 경우 주소로 호출하는 방식이 효율적이다.

 

03 배열값을 인자로 받아서 내림차순으로 정렬하는 함수를 만드시오. 함수명은 Sorting()이고 1차원 포인터와 배열의 크기를 인자로 받는다. 내림차순 정렬의 예는 다음과 같다.

[정렬전 배열] 10, 20, 3, 7, 4, 30, 11, 21, 8

[내림차순 정렬 후 배열] 30, 21, 20, 11, 10, 8, 7, 4, 3

#include<stdio.h>

void Sorting(int* arr, int size);
int main(void) {

	int arr[] = {10, 20, 3, 7, 4, 30, 11, 21, 8};
	int size = sizeof(arr) / sizeof(int);

	printf("[정렬 전 배열]\n");
	for (int i = 0; i < size; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");

	Sorting(arr, size);

	printf("[내림차순 정렬 후 배열]\n");
	for (int i = 0; i < size; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");

	return 0;
}

void Sorting(int* arr, int size) {
	int temp;
	for (int i = 0; i < size; i++) {
		for (int j = 0; j < size; j++) {
			if (arr[i] < arr[j]) {
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}
}

 

04 int형 1차원 배열(a[5]. b[5])의 값을 바꾸는 SwapArray()함수를 만드시오. 함수의 반환형은 void이며 1차원 포인터 2개와 배열의 크기 1개(총3개)를 인자로 받는다.

#include<stdio.h>

void SwapArray(int* arr1, int* arr2, int size);
int main(void) {

	int num1[] = { 3, 5, 10, 39, 69 };
	int num2[] = { 9, 30, 2, 9, 77 };
	int size = sizeof(num1) / sizeof(int);
	
	printf("[기존배열]\n");
	printf("num1[] = ");
	for (int i = 0; i < size; i++) {
		printf("%d ", num1[i]);
	}

	printf("\n");
	printf("num2[] = ");
	for (int i = 0; i < size; i++) {
		printf("%d ", num2[i]);
	}
	printf("\n\n");

	SwapArray(num1, num2, size);
	printf("[배열의 값을 바꾼 후]\n");
	printf("num1[] = ");
	for (int i = 0; i < size; i++) {
		printf("%d ", num1[i]);
	}

	printf("\n");
	printf("num2[] = ");
	for (int i = 0; i < size; i++) {
		printf("%d ", num2[i]);
	}
	return 0;
}

void SwapArray(int* arr1, int* arr2, int size) {
	int temp;
	for (int i = 0; i < size; i++) {
		temp = arr1[i];
		arr1[i] = arr2[i];
		arr2[i] = temp;
	}
}

 

05 문자열 한 줄을 입력받아 각 단어를 구성하는 문자를 대문자로 바꾸고 역순으로 출력하는 프로그램을 작성하시오. 문자를 역순으로 출력하는 부분은 문자열을 인자로 받는 함수인 ReverseCharacter()로 구현하시오.

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

void ReverseCharacter(char* arr);

int main(void) {
    char arr[50];
    printf("문자열 입력: ");
    // fgets() : 문자열 입력
    fgets(arr, sizeof(arr), stdin);  

    int len = strlen(arr);
    if (arr[len - 1] == '\n') {
        arr[len - 1] = '\0';
    }

    char* word = strtok(arr, " ");
    // 공백을 기준 단어 분리
    while (word != NULL) {
        for (int i = 0; i < strlen(word); i++) {
            word[i] = toupper(word[i]);  
        }
        ReverseCharacter(word);  
        // 단어 역순 출력
        printf(" ");
        word = strtok(NULL, " ");  // 다음 단어로 이동
    }
    printf("\n");

    return 0;
}

void ReverseCharacter(char* arr) {
    int len = strlen(arr);
    for (int i = len - 1; i >= 0; i--) {
        printf("%c", arr[i]);
    }
}

 

06 이름과 나이 그리고 직업을 문자열로 입력받아 하나의 문자열로 저장한 후에 문자열을 출력하는 프로그램을 작성하시오. 각각의 문자열 사이는 '/'로 구분한다.

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

int main(void) {

	char name[20], age[10], job[50], output[85];

	printf("이름 입력 : ");
	scanf("%s", name);

	printf("나이 입력 : ");
	scanf("%s", age);

	printf("직업 입력 : ");
	scanf("%s", job);

	// 문자열 합치기
	strcpy(output, name);
	strcat(output, "/");
	strcat(output, age);
	strcat(output, "/");
	strcat(output, job);

	printf("이름, 나이, 직업 : %s\n", output);

	return 0;
}

 

07 1차원 정수형 배열을 입력으로 받아 최대값을 출력하는 Max() 함수를 작성하되 인자를 포인터를 이용하여 프로그램을 작성하시오.

#include<stdio.h>
#pragma warning(disable:4996)
#define MAX 100

void Max(int* arr, int size, int* max);
int main(void) {
	
	int arr[MAX];
	int size, maxnum;

	printf("배열의 크기입력 : ");
	scanf("%d", &size);

	printf("배열의 숫자입력 : ");
	for (int i = 0; i < size; i++) {
		scanf("%d", &arr[i]);
	}
	
	Max(arr, size, &maxnum);
	printf("최대값 : %d\n", maxnum);
	

	return 0;
}

void Max(int* arr, int size, int* max) {
	*max = arr[0];
	for (int i = 1; i < size; i++) {
		if (arr[i] > *max) {
			*max = arr[i];
		}
		
	}
}

 

08 1차원 정수형 배열을 입력으로 받아 최소값을 출력하는 Min()함수를 작성하되 인자를 포인터를 이용하여 프로그램을 작성하시오.

#include<stdio.h>
#pragma warning(disable:4996)
#define MIN 100

void Min(int* arr, int size, int* min);
int main(void) {
	
	int arr[MIN];
	int size, minnum;

	printf("배열의 크기입력 : ");
	scanf("%d", &size);

	printf("배열의 숫자입력 : ");
	for (int i = 0; i < size; i++) {
		scanf("%d", &arr[i]);
	}
	
	Min(arr, size, &minnum);
	printf("최소값 : %d\n", minnum);
	

	return 0;
}

void Min(int* arr, int size, int* min) {
	*min = arr[0];
	for (int i = 1; i < size; i++) {
		if (arr[i] < *min) {
			*min = arr[i];
		}
		
	}
}

 

09 1차원 정수형 배열을 입력으로 받아 평균(실수형)을 출력하는 Average() 함수를 작성하되 인자를 포인터를 이용하여 프로그램을 작성하시오.

#include<stdio.h>
#pragma warning(disable:4996)
#define AVG 100

void Avg(int* arr, int size, double* avgnum);
int main(void) {
	
	int arr[AVG];
	int size;
	double avgnum;

	printf("배열의 크기입력 : ");
	scanf("%d", &size);

	printf("배열의 숫자입력 : ");
	for (int i = 0; i < size; i++) {
		scanf("%d", &arr[i]);
	}
	
	Avg(arr, size, &avgnum);
	printf("평균값 : %2.f\n", avgnum);
	

	return 0;
}

void Avg(int* arr, int size, double* avgnum) {
	int temp = 0;
	for (int i = 0; i < size; i++) {
		temp += arr[i];
	}
	*avgnum = (double)temp / size;
}

 

 

 

 

728x90
반응형
LIST