반응형
#include <stdio.h>
// 문제1 포인터를 이용한 배열의 요소 뒤집기
void Practice1();
void ReverseArray(int*, int);

// 문제2 포인터를 이용한 배열의 최대값과 최소값 찾기
void Practice2();
void FindMaxMin(int*, int, int*, int*);

// 문제3 포인터를 이용한 배열의 중간값 찾기
void Practice3();
void Sort(int* ,int);
double FindMedian(int*, int);

// 문제4 포인터를 이용한 배열의 모드 계산
void Practice4();
int FindMode(int*, int);

// 문제5 포인터를 이용한 배열의 두 요소의 거리 계산
void Practice5();
int calculateDistance(int*, int, int, int);

// 문제6 포인터를 이용한 배열의 두 요소 교환
void Practice6();
void SwapElements(int*, int, int, int);

// 문제7 포인터를 이용한 배열의 특정 값 찾기
void Practice7();
int Contains(int*, int, int);

// 문제8 포인터를 이용한 배열의 특정 값의 개수 계산
void Practice8();
int CountElement(int*, int, int);

// 문제9 포인터를 이용한 배열의 특정 범위의 합 계산
void Practice9();
int CalculateRangeSum(int*, int, int, int);

// 문제10 포인터를 이용한 배열의 특정 값 제거
void Practice10();
int RemoveElement(int*, int, int);
void RemoveSort(int* arr, int size);


int main()
{
	Practice10();

	return 0;
}

// 문제1 포인터를 이용한 배열의 요소 뒤집기
void Practice1()
{
	int arr[5] = { 1,2,3,4,5 };
	int arrLen = sizeof(arr) / sizeof(int);
	ReverseArray(arr, arrLen);
	for (int i = 0; i < arrLen; i++)
	{
		printf("%d", arr[i]);
	}
}
void ReverseArray(int* input, int inputLen)
{
	for (int i = 0; i < inputLen - 1; i++)
	{
		for (int j = 0; j < (inputLen - i - 1); j++)
		{
			if (input[j] < input[j + 1])
			{
				int temp = input[j];
				input[j] = input[j + 1];
				input[j + 1] = temp;
			}
		}
	}
}

// 문제2 포인터를 이용한 배열의 최대값과 최소값 찾기
void Practice2()
{
	int arr[10] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
	int arrLen = sizeof(arr) / sizeof(int);
	int max = 0;
	int min = arr[0];
	FindMaxMin(arr, arrLen, &max, &min);
	printf("최대값 : %d 최소값 : %d", max, min);
}
void FindMaxMin(int* arr, int size, int* max, int* min)
{
	*max = *min = arr[0];

	for (int i = 1; i < size; i++)
	{
		*max = *max < arr[i] ? arr[i] : *max;
		*min = *min < arr[i] ? *min : arr[i];
	}

}

// 문제3 포인터를 이용한 배열의 중간값 찾기
void Practice3()
{
	int arr[5] = { 2,1,1,8,4 };
	int arrLen = sizeof(arr) / sizeof(int);
	Sort(arr, arrLen);
	printf("%lf", FindMedian(arr, arrLen));

}
void Sort(int* arr, int arrLen)
{
	for (int i = 0; i < arrLen-1; i++)
	{
		for (int j = 0; j < arrLen-i-1; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
double FindMedian(int* arr, int size)
{
	if (size % 2 == 0)
	{
		double sum = arr[size / 2] + arr[(size / 2) - 1];
		sum = sum / 2;
		return sum;
	}
	else
	{
		return arr[size / 2];
	}
}

// 문제4 포인터를 이용한 배열의 모드 계산
void Practice4()
{
	int arr[15] = { 1,2,2,3,3,3,4,4,4,4,5,5,5,5,5 };
	int arrLen = sizeof(arr) / sizeof(int);
	printf("%d", FindMode(arr, arrLen));
}
int FindMode(int* arr, int size)
{
	int mode = arr[0];
	int maxCount = 0;
	for (int i = 0; i < size; i++)
	{
		int count = 0;
		for (int j = 0; j < size; j++)
		{
			if (arr[i] == arr[j])
			{
				++count;
			}
		}
		if (maxCount < count)
		{
			maxCount = count;
			mode = arr[i];
		}
	}
	return mode;
}

// 문제5 포인터를 이용한 배열의 두 요소의 거리 계산
void Practice5()
{
	int arr[10] = { 11, 2, 3, 4, 5, 6, 10, 8, 1, 0 };
	int arrLen = sizeof(arr) / sizeof(int);
	printf("%d", calculateDistance(arr, arrLen, 8, 1));
}
int calculateDistance(int* arr, int size, int element1, int element2)
{
	int* dist1 = 0;
	int* dist2 = 0;
	int* result = 0;
	for (int i = 0; i < size; i++)
	{
		if (*(arr + i) == element1 && dist1 != 0)
			return -1;
		else if (*(arr + i) == element2 && dist2 != 0)
			return -1;

		if (*(arr + i) == element1 && dist1 == 0)
			dist1 = arr + i;
		else if (*(arr + i) == element2&& dist2 == 0)
			dist2 = arr + i;
	}
	if (dist2 > dist1)
	{
		int* temp = dist2;
		dist2 = dist1;
		dist1 = temp;
	}
	result = dist1 - dist2;
	return result;
}

// 문제6 포인터를 이용한 배열의 두 요소 교환
void Practice6()
{
	int arr[5] = { 1,2,3,4,5 };
	int arrLen = sizeof(arr) / sizeof(int);
	SwapElements(arr, arrLen, 0, 2);
	
	for (int i = 0; i < arrLen; i++)
	{
		printf("%d ", arr[i]);
	}
}
void SwapElements(int* arr, int size, int index1, int index2)
{
	if ((index1 < 0 || index1 >= size ||
		index2 < 0 || index2 >= size))
	{
		printf("아무것도 하지 않는다\n");
		return;
	}
	int temp = arr[index1];
	arr[index1] = arr[index2];
	arr[index2] = temp;
}

// 문제7 포인터를 이용한 배열의 특정 값 찾기
void Practice7()
{
	int arr[5] = { 1,2,3,4,5 };
	int arrLen = sizeof(arr) / sizeof(int);
	printf("0 : 포함X 1 : 포함O\n");
	printf("%d", Contains(arr, arrLen, 1));
}
int Contains(int* arr, int size, int element)
{
	for (int i = 0; i < size; i++)
	{
		if (arr[i] == element)
			return 1;
	}
	return 0;
}

// 문제8 포인터를 이용한 배열의 특정 값의 개수 계산
void Practice8()
{
	int arr[15] = { 1,2,2,3,3,3,4,4,4,4,5,5,5,5,5 };
	int arrLen = sizeof(arr) / sizeof(int);
	printf("특정 값의 개수 : %d\n",CountElement(arr, arrLen, 5));
}
int CountElement(int* arr, int size, int element)
{
	int count = 0;
	for (int i = 0; i < size; i++)
	{
		if (arr[i] == element)
			count++;
	}
	return count;
}

// 문제9 포인터를 이용한 배열의 특정 범위의 합 계산
void Practice9()
{
	int arr[5] = {0,1,2,3,4};
	int arrLen = sizeof(arr) / sizeof(int);
	printf("합계 : %d\n", CalculateRangeSum(arr, 0, 4, arrLen));
}
int CalculateRangeSum(int* arr, int start, int end, int arrLen)
{
	int sum = 0;
	if (start > end || start < 0 || end < 0 ||
		start >= arrLen || end>= arrLen)
	{
		printf("인덱스 범위 재설정\n");
		return 0;
	}

	for (int i = start; i <= end; i++)
	{
		sum += arr[i];
	}
	return sum;
}

// 문제10 포인터를 이용한 배열의 특정 값 제거
void Practice10()
{
	int arr[5] = { 1,1,2,3,4 };
	int arrLen = sizeof(arr) / sizeof(int);
	int removeArray = RemoveElement(arr, arrLen, 1);
	for (int i = 0; i < arrLen- removeArray; i++)
	{
		printf("%d", arr[i]);
	}
}
int RemoveElement(int* arr, int size, int element)
{
	int removeCount = 0;
	for (int i = 0; i < size; i++)
	{
		if (arr[i] == element)
		{
			arr[i] = 0;
			removeCount++;
		}
	}
	RemoveSort(arr, size);

	//for (int i = 0; i < removeCount; i++)
	//{
	//	*(arr + 1) = NULL;
	//}
	return removeCount;
}
void RemoveSort(int* arr, int size)
{
	for (int i = 0; i < size-1; i++)
	{
		for (int j = 0; j < size-1-i; j++)
		{
			if (arr[j] == 0)
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

 

반응형

 

반응형

'연습문제' 카테고리의 다른 글

C언어 tictactoe  (0) 2023.05.19
C 포인터2 문제  (0) 2023.05.18
C언어 카드게임  (0) 2023.05.12
C언어 베이스볼 게임  (0) 2023.05.12
C언어 숫자 추측게임  (0) 2023.05.12

+ Recent posts