Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

포인터를 활용해 사용자가 입력한 배열 유형(짝수·홀수·혼합)을 판별하는 C 프로그램

문제 정의

이번 글에서는 포인터(pointer)를 활용하여 배열의 유형을 판별하는 C 프로그램을 작성해 보겠습니다. 여기서 판별할 내용은 다음과 같습니다.

  • 배열의 모든 요소가 짝수인지
  • 배열의 모든 요소가 홀수인지
  • 짝수와 홀수가 섞여 있는 혼합(mixed) 배열인지

해결 방법

사용자로부터 정수 배열을 입력받은 후, 해당 배열이 어떤 유형에 속하는지 화면에 출력합니다.

예시

  • 입력: 5 3 1 → 출력: 홀수 배열(Odd)
  • 입력: 2 4 6 8 → 출력: 짝수 배열(Even)
  • 입력: 1 2 3 4 5 → 출력: 혼합 배열(Mixed)

알고리즘

포인터를 이용해 사용자가 입력한 배열의 유형을 찾기 위한 알고리즘은 다음과 같습니다.

  1. 1단계: 실행 시점(runtime)에 배열의 크기를 입력받습니다.
  2. 2단계: 배열의 각 요소를 입력받습니다.
  3. 3단계: 포인터 변수를 선언하고, 포인터를 이용해 배열의 모든 요소가 홀수인지 검사합니다. 모두 홀수라면 "Odd"를 출력합니다.
  4. 4단계: 포인터를 이용해 배열의 모든 요소가 짝수인지 검사합니다. 모두 짝수라면 "Even"을 출력합니다.
  5. 5단계: 위 두 조건에 해당하지 않으면 "Mixed"를 출력합니다.

C 프로그램 예제

다음은 포인터를 활용하여 사용자가 입력한 배열의 유형을 찾는 C 프로그램입니다.

#include<stdio.h>
#include<stdlib.h>
int* createArray(int);
void readArray(int, int *);
int findType(int, int *);
int main(){
    int *a, n;
    printf("배열의 크기를 입력하세요\n");
    scanf("%d", &n);
    printf("배열의 요소들을 입력하세요\n");
    a = createArray(n);   // 동적 할당된 메모리 주소를 받아 저장
    readArray(n, a);
    findType(n, a);
    return 0;
}
int *createArray(int n){
    int *a;
    a = (int*)malloc(n * sizeof(int));  // n개의 int 공간을 동적 할당
    return a;
}
void readArray(int n, int *a){
    for(int i = 0; i < n; i++){
        scanf("%d", a + i);   // 포인터 산술 연산으로 요소 입력
    }
}
int findType(int n, int *a){
    int c = 0, d = 0;
    for(int i = 0; i < n; i++){
        if(a[i] % 2 == 0){
            c++;   // 짝수 개수 카운트
        }
        else{
            d++;   // 홀수 개수 카운트
        }
    }
    if(c == n){
        printf("배열의 유형은 Even(모두 짝수)입니다\n");
    }
    if(d == n){
        printf("배열의 유형은 Odd(모두 홀수)입니다\n");
    }
    if(c != n && d != n){
        printf("배열의 유형은 Mixed(짝수와 홀수 혼합)입니다\n");
    }
    return 0;
}

코드 설명

createArray 함수

malloc()을 사용하여 배열 크기만큼의 메모리를 동적으로 할당하고, 그 시작 주소를 반환합니다. 이렇게 하면 컴파일 시점에 배열 크기를 몰라도 실행 중에 유연하게 배열을 생성할 수 있습니다.

readArray 함수

포인터 산술 연산(a + i)을 이용해 배열의 각 위치에 주소를 계산하고, 그곳에 값을 직접 입력받습니다. 이것이 포인터를 활용하는 핵심 부분입니다.

findType 함수

배열을 순회하면서 각 요소를 2로 나눈 나머지를 확인합니다. 나머지가 0이면 짝수 카운트(c)를, 그렇지 않으면 홀수 카운트(d)를 증가시킵니다. 이후 세 가지 경우를 비교하여 배열의 유형을 출력합니다.

참고: 원본 코드에서는 createArray(n)의 반환값을 변수에 저장하지 않아 올바르게 동작하지 않을 수 있습니다. 위 코드처럼 반환된 포인터를 반드시 변수에 대입해야 안전하게 사용할 수 있습니다.

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

배열의 크기를 입력하세요
4
배열의 요소들을 입력하세요
12
14
16
18
배열의 유형은 Even(모두 짝수)입니다

입력된 네 개의 값(12, 14, 16, 18)이 모두 짝수이므로 프로그램은 이 배열을 "Even" 유형으로 정확하게 판별합니다.