[C] 귀찮으니까 매크로 돌려

장세민·2022년 7월 30일
0

📝 TIL

목록 보기
14/40

매크로 상수

#define SIZE 5   // SIZE를 5로 정의
전처리기 지시를 통해 매크로 상수를 정의한다.

전처리기가 소스 파일에서 SIZE를 만나면 정의한 내용으로 바꾼다.

즉, 모두 5로 바꾼다.
→ 이후 컴파일러가 이 소스 파일을 기계어로 번역한다.

매크로 상수를 왜 쓰는데?

간단한 quiz 점수 소스 파일을 작성해보자.

#include <stdio.h>   
 
int main()
{
	int quiz[5] = {10, 9, 8, 9, 7};
	int i, sum;
	double average;
 
	for (sum = 0, i=0; i<5; i++)
		printf("%5d점", quiz[i]);
 
	for (i=0; i<5; i++)
		sum = sum + quiz[i];
 
	average = (double) sum / 5
 
 
	return 0;
}

매크로 상수를 사용하지 않았을 때 배열 원소수를 10으로 바꾸려면,
모두 10으로 직접 바꾸어야 한다.

또, 코드를 작성하다보면 5로 나누는 문장도 있고
5를 직접 정의해야 하는 상황도 올 수 있다.

그럼 매우 번거롭지 않을까?..

그러나, 매크로 상수를 사용하면

#include <stdio.h>   
#define SIZE 5
 
int main()
{
	int quiz[SIZE] = {10, 9, 8, 9, 7};
	int i, sum;
	double average;
 
	for (sum = 0, i=0; i < SIZE; i++)
		printf("%5d점", quiz[i]);
 
	for (i=0; i < SIZE; i++)
		sum = sum + quiz[i];
 
	average = (double) sum / SIZE;
 
 
	return 0;
}
 

SIZE 5를 10으로 수정하면 끝이다.

보통, 일반 변수와 구분하기 위해
대문자로 사용하는 것이 관습이고,

#define N 5
으로도 많이 사용한다.

배열의 최댓값 구하기

배열에서 최댓값은 어떻게 구할까?

배열의 최댓값을 구하기 위해서는
다음과 같은 알고리즘으로 설명된다.

  • 일단 원소 중 한 개를 최댓값 max로 가정
  • 나머지 배열 원소와 max를 비교하는 과정 반복

매크로 상수를 이용해서 한 번 해보자!

#include <stdio.h>
#define N 5   
 
int main()
{
	int i, max, bag[N] = {12, 13, 10, 17, 15};
 
	for (i=0; i < N; i++)     // 배열 원소 출력
	{
		printf("%d  ", bag[i]);
	}
	printf("\n\n");
 
	max = bag[0];           // max를 첫 원소로 초기화
	for (i=1; i < N; i++)
	{
		if (bag[i] > max)
			max = bag[i];   // 지금까지의 최댓값보다 더 큰 값으로 변경 
	}
 
	printf("최댓값은 %d입니다. \n", max);
 
 
	return 0;
}

👍

예시

순위 구하는 프로그램

5명의 키를 비교할 때, 나보다 큰 사람은 2명이 있다고 가정하면 키 큰 순서로 나는 3위 이다.

딱 봐도 배열 최댓값 문제 같다.
해보자!

  • i에 순위를 구할 키를 입력받기

  • 내 키는

    me = tall[i-1];    // 번호는 1부터 시작, 배열 첨자는 0부터 시작
    에 저장

  • 내 키의 순위를 1로 초기화:

    rank = 1;

  • 모든 배열 원소와 내 키를 비교하여 더 큰 원소가 있을 때마다 rank를 1 증가

#include <stdio.h>   
#define N 5
 
int main()
{
	int i, me, rank, u, tall[5] = {185, 170, 183, 177, 188};
 
	printf("몇 번 사람의 키 순위?"); scanf("%d", &i);
	me = tall[i-1];           // 첨자는 0부터 시작하므로
 
	rank = 1;                 // 일단 순위를 1로 가정
	for (u=0; u < N; u++)     // 모든 키와 내 키를 비교
		if (tall[u] > me)
			rank++;           // 순위를 1 증가 
 
	printf("순위: %d위 \n", rank);
 
 
	return 0;
}

👍

profile
분석하는 남자 💻

0개의 댓글