01. 실수를 받아서 정수부와 소수부로 분리하는 함수  get_frac(double f, int *pi, double *pd) ;을 작성하고 테스트해보자.

 

#include <stdio.h>

void get_frac(double f, int* pi, double* pd) {
	*pi = (int)f;
	*pd = f - *pi; 
	// *pf = f % 1 불가능 (실수형은 % 연산자 사용 불가)
}

int main() {
	int a;
	double n, b;
	printf("실수를 입력하시오: ");
	scanf("%lf", &n);

	get_frac(n, &a, &b);
	printf("get_frac(%.2lf)이 호출되었습니다.\n", n);
	printf("정수부는 %d입니다. \n", a);
	printf("소수부는 %.2lf입니다. \n", b);

}

02. 크기가 3인  int형 배열을 생성하고 사용자로부터 정수를 받아서 배열을 채운다. 배열 요소의 주소와 값을 다음과 같이 출력하는 프로그램을 작성해보자.

 

#include <stdio.h>

int main() {
	int a[3];
	int size = sizeof(a) / sizeof(a[0]);

	for (int i = 0; i < size; i++) {
		printf("정수를 입력하시오: ");
		scanf("%d", &a[i]);
	}

	printf("====================== \n");
	printf(" 주소      값 \n");
	printf("====================== \n");

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

03. 정수 배열을 받아서 요소들을 난수로 채우는 함수 array_fill()를 작성하고 테스트하라. 난수는 라이브러리 함수인  rand()를 사용하여 생성한다.

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

void array_fill(int A[], int size) {
	for (int i = 0; i < size; i++) {
		A[i] = rand();
	}
}

int main() {
	srand((unsigned)time(NULL));
	int arr[10];
	int size = sizeof(arr) / sizeof(arr[0]);
	array_fill(arr, size);
	for (int i = 0; i < size; i++) {
		printf("%d ", arr[i]);
	}
}

04. 문자형 배열을 생각해보자. 배열의 요소에는 문자 H, E, L, L, O R가 저장되어 있고 맨 끝에는 0을 저장시킨다. 저장된 문자들의 개수를 세어서 반환하는 함수 my_strlen(char *p)를 작성하고 테스트해보자. 이것은 실제로  C언어가 문자열을 저장하는 방법이다.

#include <stdio.h>

int strlen(char *p){
	int i = 0;
	while (*p != '\0') {
		i++;
		p++;
	}
	return i;
}

int main() {
	char a[] = "HELLO";
	printf("저장된 문자열 = %s \n", a);
	printf("문자열의 길이 = %d", strlen(a));
}

05. 큰 배열을 할당받아서 우리 마음대로 메모리를 사용하고자 한다. 크기가 1000인 char형 배열을 생성한다. 배열의 첫 번재 바이트에는 'a'를 저장하고, 다음 4바이트에는 정수 100을 저장하고, 다음 4바이트에는 float형 실수 3.14를 저장할 수 있는가? 다시 꺼내서 출력해보자.

 

#define _CRT_SECURE_NO_WARNINGS	
#include <stdio.h>

int main() {
	char buffer[1000];
	char* p;
	int* pi;
	float* pf;

	p = buffer;
	*p = 'a';

	pi = (int*)(p + 4);
	*pi = 100;

	pf = (float*)(pi + 1);
	*pf = 3.14;

	printf("%c ", *p);
	printf("%d" , *pi);
	printf("%f ", *pf);
}

06. 정수 배열의 요소들을 화면에 출력하는 함수 array_print()를 작성하고 테스트하라. 출력 형식은 다음과 같은 형식이 되도록 하라.

 

#include <stdio.h>

void array_print(int* A, int size) {
	printf("A[] = { ");
	for (int i = 0; i < size; i++) {
		printf("%d, ", A[i]);
	}
	printf("}");
}

int main() {
	int A[10] = { 1,2,3,4,5 };
	int size = sizeof(A) / sizeof(A[0]);
	array_print(A, size);
}

07. 배열에 저장된 값을 역순으로 출력하는 프로그램을 작성하라. 단 인덱스를 사용하지 않고 포인터만을 사용해보자.

#include <stdio.h>

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

void array_print_reverse(int* A, int size) {
	printf("A[] = ");
	for (int i = size - 1; i >= 0; i--) {
		printf("%d ", *(A+i));
	}
	printf("\n");
}

int main() {
	int A[10];
	int size = sizeof(A) / sizeof(A[0]);
	for (int i = 0; i < size; i++) {
		A[i] = i;
	}
	array_print(A, size);
	array_print_reverse(A, size);
}

08. 배열에 double형의 실수값들이 저장되어 있다. 이 실수값 중에서 최대값이 저장된 요소를 찾아서 요소와 주소를 반환하는 다음과 같은 함수를 구현하고 테스트해보자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


double* find_max(double* arr, int size) {
	double* max = arr;
	for (int i = 1; i < size; i++) {
		if (*max < arr[i])
			max = arr + i;
	}
	return max;
}

int main() {
	double A[] = { 1.23, 3.14, 9.16, 100.9 };
	printf("%.2lf", *find_max(A, sizeof(A) / sizeof(A[0])));
}

09. 학생들의 평점은 4.3점이 만점이라고 하자. 배열 grades[ ]에 학생 10명의 학점이 저장되어 있다. 이것을 100점 만점으로 변환하여서 배열 scores[ ]에 저장하는 함수를 작성하고 테스트하라.

#include <stdio.h>

void print_array(double* arr, int size) {
	for (int i = 0; i < size; i++) {
		printf("%.2lf ", arr[i]);
	}
	printf("\n");
}

void convert(double* grades, double* scores, int size) {
	for (int i = 0; i < size; i++) {
		scores[i] = grades[i] / 4.3 * 100;
	}
}

int main() {
	double grades[] = { 0,0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.3 };
	double scores[10];
	
	print_array(grades, 10);
	convert(grades, scores, 10);
	print_array(scores, 10);
}

10. 정수 배열 A[]를 다른 정수 배열 B[]에 복사하는 함수를 작성하고 테스트하라.

#include <stdio.h>

void array_copy(int* A, int* B, int size) {
	for (int i = 0; i < size; i++) {
		B[i] = A[i];
	}
}

void print_array(int* arr, int size) {
	for (int i = 0; i < size; i++) {
		printf("%d ", *(arr + i));
	}
	printf("\n");
}

int main() {
	int A[10] = { 1,2,3 };
	int B[10];
	array_copy(A, B, 10);
	printf("A[] = ");
	print_array(A, 10);
	printf("B[] = ");
	print_array(B, 10);
}

11. 직원들의 기본급이 배열 A[ ]에 저장되어 있다. 배열 B[ ]에는 직원들의 보너스가 저장되어 있다. 기본급과 보너스를 합하여 이번 달에 지급할 월급의 총액을 계산하고자 한다. A[ ] 와 B[ ]를 더하여 배열 C[ ]에 저장하는 함수를 작성하고 테스트하라. 즉 모든 i에 대하여 C[ i ] = A[ i ] + B[ i ]가 된다.

#include <stdio.h>

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

void array_add(int* A, int* B, int* C, int size) {
	for (int i = 0; i < size; i++) {
		C[i] = A[i] + B[i];
	}
}

int main() {
	int A[10] = { 1,2,3 };
	int B[10] = { 4,5,6 };
	int C[10];

	array_add(A, B, C, 10);
	printf("A[] = ");
	print_array(A, 10);
	printf("B[] = ");
	print_array(B, 10);
	printf("C[] = ");
	print_array(C, 10);
}

12. 직원들의 월급이 배열 A[ ] 에 저장되어 있다고 가정하자. 이번 달에 회사에서 지급할 월급의 총액을 계산하고자 한다/ 정수형 배열 요소들의 합을 구하여 반환하는 함수를 작성하고 테스트하라.

#include <stdio.h>

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

int array_sum(int* A, int size) {
	int sum = 0;
	for (int i = 0; i < size; i++) {
		sum += A[i];
	}
	return sum;
}

int main() {
	int A[10] = { 1,2,3 };
	printf("A[] = ");
	print_array(A, 10);
	printf("월급의 합: %d", array_sum(A, 10));
}

13. 직원들의 월급이 저장된 배열에서 월급이 200만원인 사람을 찾고 싶을 때가 있다. 주어진 값을 배열 A[]에서 탐색하여 배열 요소의 인덱스를 반환하는 함수를 작성하고 테스트하라.

#include <stdio.h>

int search(int* A, int size,int search_value) {
	for (int i = 0; i < size; i++) {
		if (A[i] == search_value) {
			return i;
		}
	}
	
}

int main() {
	int A[10] = {0, 100,300,200,400,500,600,700,800,900};
	printf("월급 200만원인 사람의 인데스=%d", search(A, 10, 200));
}

14. 2개의 정수의 합과 차를 동시에 반환하는 함수를 작성하고 테스트하라. 포인터 매개 변수를 사용한다.

#include <stdio.h>

void get_sum_diff(int x, int y, int* p_sum, int* p_diff) {
	*p_sum = x + y;
	*p_diff = x - y;
}

int main() {
	int x = 100, y = 200;
	int p_sum, p_diff;
	get_sum_diff(x, y, &p_sum, &p_diff);
	printf("원소들의 합 = %d \n", p_sum);
	printf("원소들의 차 = %d \n", p_diff);
}

15. 우리가 프로그램을 하다 보면 사용자로부터 2개의 정수를 받아오는 경우가 많다. 이것을 함수로 구현해두고 필요할 때마다 사용하면 편리할 것이다. 하지만 한 가지 문제가 있다. C에서 함수는 하나의 값만 반환할 수 있다. 2개 이상의 값을 반환하려면 다른 방법을 사용해야 하는데 다음과 같이 포인터도 사용할 수 있다.

void get_two_int(int *px, int *py);

위와 같은 원형을 가지는 함수를 작성하고 이것을 이요해서 정수의 합을 계산하는 프로그램을 작성해보자.

#include <stdio.h>

void get_two_int(int* px, int* py) {
	printf("정수 2개를 입력하시오: ");
	scanf("%d %d", px, py);
}

int sum(x, y) {
	return x + y;
}


int main() {
	int x, y;
	get_two_int(&x, &y);
	printf("정수의 합은 %d", sum(x, y));
}

16. 2개의 정렬된 정수 배열 A[ ]와 B[ ]가 있다고 가정하자. 이 2개의 배열을 합쳐서 하나의 정렬된 배열 C[]로 만드는 함수를 작성하고 테스트한다. 다음과 같은 함수 원형을 가진다고 가정하라.

void merge(int *A,int *B, int *C, int size){ }

여기서 배열 A[ ], B[ ]는 똑같은 크기로 정의되어 있다고 가정한다. 배열 C[ ]에는 충분한 공간이 확보되어 있다고 가정하자. 합치는 알고리즘은 다음과 같다. 먼저 A[0]와 B[0]를 비교한다. 만약 A[0]가 B[0]보다 작으면 A[0]를 C[0]에 복사한다.  다음에는 A[1]과 B[0]를 비교한다. 이번에는 B[0]가 A[1]보다 작다면 B[0]를 C[1]에 저장한다. 똑같은 방식으로 남아있는 요소들을 비교하여 더 작은 요소를 C[ ]로 복사한다. 만약 A[ ]나 B[ ] 중에서 어느 하나가 먼저 끝나게 되면 남아있는 요소들을 전부 C[ ]로 이동한다.

#include <stdio.h>

void array(int* A, int* B, int* C, int size) {

	int j = 0;
	int k = 0;

	for (int i = 0; i < size; i++) {
		if (j < size / 2 && k < size / 2) {
			if (A[j] < B[k]) C[i] = A[j++];

			else C[i] = B[k++];
		}
		else if (j == size / 2)
			C[i] = B[k++];

		else if (k == size / 2)
			C[i] = A[j++];
	}
}

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

int main() {
	int A[4] = { 2,5,7,8 };
	int B[4] = { 1,3,4,6 };
	int C[10];
	array(A, B, C, 8);

	printf("A[] = ");
	print_arr(A, 4);
	printf("B[] = ");
	print_arr(B, 4);
	printf("C[] = ");
	print_arr(C, 8);
}

+ Recent posts