728x90
반응형
배열의 전환(swap 함수)
함수를 이용한 매개변수로 배열을 사용하는 예제 코드는 다음과 같다.
#include <stdio.h>
#define Max_ele 100
#define Sentinel 0 // 종료 입력값
#define True 1
#define False 0
int GetIntArr();
int GetInt();
void PrintIntArr();
void RevPintIntArr();
void Swap();
int GetInt() {
int ipt;
scanf("%d", &ipt);
return ipt;
}
int GetIntArr(int arr[], int max, int end) {
//인자: 수정할 배열/ 배열의 최대값 / 입력 종료값
// 배열을 입력받는 함수
int cnt = 0, num, val;
while (True) {
printf("=> ");
val = GetInt();
if (val == end)
break;
arr[cnt] = val;
cnt++;
}
return cnt;
}
void PrintIntArr(int arr[], int max) {
for (int i = 0; i < max; i++)
printf("%d\n", arr[i]);
}
void RevPintIntArr(int arr[], int num) {
for (int i = 0; i < num / 2; i++)
Swap(arr, i, num - i - 1);
// (i,num-i-1) 인 이유는 반복문의 반복은 배열의 크기의 절반이고, 짝수인 경우는
// 중간값을 바꿀 필요가 없음. 따라서 배열의 크기의 반만 반복하되 처음과 끝을
// 순서대로 변환하면 반전시킬 수 있다.
}
void Swap(int arr[], int n, int m) {
int cnt = arr[n];
arr[n] = arr[m];
arr[m] = cnt;
}
int main() {
int arr[Max_ele], n;
printf("임의의 정수값을 입력하세요.\n");
printf("0을 입력하면 입력을 종료합니다.\n");
n = GetIntArr(arr, Max_ele, Sentinel);
RevPintIntArr(arr, n);
PrintIntArr(arr, n);
}
일반적으로 함수를 사용하여 코드를 작성하는 것이 오류 수정이나 가독성에 있어서 장점을 가지지만 더 짧게 표현할 수 있다면 굳이 사용할 필요는 없다. 다음 코드는 위의 코드를 응용하여 짧게 표현하여 보자.
위의 예제코드는 배열의 한도가 정해져 있으므로 동적할당이 아닌 배열의 크기를 선언하고 Swap 할 수 있도록 코딩해 보자.
#include<stdio.h>
#define Max_ele 100
#define Sentinel 0 // 종료 입력값
#define True 1
#define False 0
int main(){
int arr[Max_ele],ipt,cnt = 0;
printf("임의의 정수값을 입력하세요.\n");
printf("0을 입력하면 입력을 종료합니다.\n");
while(1){
printf("=> ");scanf("%d",&ipt); if(ipt == Sentinel) break;
arr[cnt] = ipt; cnt++;
}
int *new_arr;
new_arr = (int*)malloc((cnt)*sizeof(int));
for(int j=0;j<cnt;j++) new_arr[j] = arr[cnt - j -1];
for(int i = 0; i < cnt; i++) printf("%d\n", new_arr[i]);
}
for(int j=0;j<cnt;j++) new_arr[j] = arr[cnt - j -1]; |
이때 위의 표 내의 표시한 코드처럼 -1을 한 이유는 새로 동적할당한 배열에 기존의 배열을 뒤로 반복한 것을 저장해야 하는데, cnt는 '인간의 기준'으로 배열의 인덱스 수를 센 것이기 때문에 배열이 저장돼있는 인덱스 값으로 변환하기 위해 1을 빼는 것이다. 이 부분에 주의하자.
위의 코드는 앞선 예제와는 다르게 동적할당을 사용했는데, 입력받은 배열의 인덱스값을 알기 때문이다. 효율적인 메모리 관리를 위해서는 동적할당한 배열을 free 선언으로 해제해야 하지만 이 정도의 메모리 소요는 미미하기 때문에 제외했다.
728x90
반응형
'Datastructure > [Algorithm problem]' 카테고리의 다른 글
#1-6. 포인터의 활용 (0) | 2023.09.04 |
---|---|
#1-5. 포인터 배열과 포인터 연산 (0) | 2023.09.03 |
#1-4. 배열과 포인터 (0) | 2023.09.03 |
#1-3. 포인터 (0) | 2023.08.31 |
#1-1. 자료형의 크기 (0) | 2023.08.30 |