[자료구조] : 배열 요소 역순 출력(C)

지환·2022년 2월 10일
0

자료구조

목록 보기
4/38
post-thumbnail

출처 | DO IT C언어 자료구조

배열의 요소 역순 출력

이번 시간에는 배열의 요소를 역순으로 출력하는 프로그램 및 아이디어를 살펴 볼 예정이다.

예를 들어,
1. 배열 P의 요소 개수가 7
2. 첫 번째 순서대로 {22, 57, 11, 32, 91, 68, 70}이 들어 있다고 가정
3. 순서를 뒤바꾸게 된다면, p[0] = 22와 | p[6] = 70을 바꾼다.
4. 그렇게 되면 교환 횟수를 구할 수 있게 되는데, "교환 횟수 = 요소개수 / 2 이다 "

for(int i = 0; i < n/2; i++) 로 표현가능
1. a[i]와 a[n-i-1]의 값을 교환한다.
  • 두 값이 교환을 하기 위해선, 새로운 변수가 필요하다.
  1. t = x
  2. x = y
  3. y = t 순서로 진행된다.
  • 배열 요소를 역순으로 정렬하는 과정에서 교환하는 값은 x와 y가 아니라 배열 a의 두 요소 a[i]와 a[n-i-1]이다.
int i = 0;
for(i = 0; i < n/2; i++)
{
   int t = p[i];
   p[i] = p[n-i-1];
   a[n-i-1] = t; 
 //a[i]와 a[n-i-1]의 값을 교환했다.
}

이런 형식을 매크로로 구현해보겠다. 우선 매크로와 관련된 얘기를 해보자.

매크로 정의 및 예제

참고 > [c언어 코딩 도장] : https://dojang.io/mod/page/view.php?id=652

#define은 함수 모양의 매크로도 정의할 수 있다.
#define 매크로이름(x) 함수(x)
#define 매크로이름(x) 코드조합

#include <stdio.h>

#define PRINT_NUM(x) printf("%d\n", x)    // printf("%d\n", x)를 PRINT_NUM(x)로 정의

int main()
{
    PRINT_NUM(10);    // 10: printf("%d\n", 10)

    PRINT_NUM(20);    // 20: printf("%d\n", 20)

    return 0;
}

이와 같이 풀이된다.

이 부분을 이해한 후에 매크로 함수로 배열의 요소를 역순으로 출력해보자,

#include <stdio.h>
#include <stdlib.h>
#define swap(type, x, y) do{type t = x; x = y; y = t;} while(0)

void t_reverse(int a[], int n)
{
	int i;
	for (i = 0; i < n / 2; i++)
	{
		swap(int, a[i], a[n - i - 1]);
	}
}
int main()
{
	int i;
	int* x;
	int nx;

	printf("요소 개수 : ");
	scanf_s("%d", &nx);
	x = calloc(nx, sizeof(int));// 10개의 배열을 생성하는 역할을 한다.
	printf("%d개의 정수를 입력하세요\n", nx);
	for (int i = 0; i < nx; i++)
	{
		printf("x[%d] : ", i);
		scanf_s("%d", &x[i]); // 사용자가 콘솔 화면에서 값을 입력한다.
	}
	t_reverse(x, nx); // t_reverse 함수를 호출해서 값을 바꾼다.
	printf("배열의 요소를 역순으로 정렬했다. \n");
	for (int i = 0; i < nx; i++) // 값을 순서대로 입력한다.
	{
		printf("x[%d] = %d\n", i, x[i]);
		
	}
	free(x);
	return 0;

}
  • swap은 type형 변수 x,y의 값을 교환하는 함수 형식의 매크로다.
  • t_reverse 함수는 함수 형식 매크로 swap을 n/2회 호출해서 배열의 요소를 역순으로 정렬한다.

자세한 과정을 살펴보자.

for(int i = 0; i < n/2; i++)
      do{ int t = a[i]; a[i] = a[n-i-1]; a[n-i-1] = t;} while(0); == 
      {int t = a[i]; a[i] = a[n-i-1]; a[n-i-1] = t;}

<결과>

다음 시간엔 기수변환에 대해서 알아보겠다.

profile
아는만큼보인다.

0개의 댓글