C 언어로 데이터 집합의 최빈값 구하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 언어로 데이터 집합의 최빈값을 구하는 방법을 배웁니다. 이 실습은 다음 단계를 포함합니다.

숫자 배열 읽기: 데이터 집합의 최빈값을 결정하는 첫 번째 중요한 단계인 C 언어로 숫자 배열을 읽는 방법을 배웁니다. 이 프로그램은 숫자 집합의 입력을 받아 빈도 분석을 위한 준비를 합니다.

빈도 계산하여 가장 흔한 값 찾기: 이전 프로그램을 수정하여 배열 내 각 숫자의 빈도를 계산하고 가장 흔한 값 (최빈값) 을 식별합니다.

최빈값 출력: 마지막으로, 데이터 집합에서 가장 자주 나타나는 값인 최빈값을 출력합니다.

숫자 배열 읽기

이 단계에서는 데이터 집합의 최빈값을 결정하는 첫 번째 중요한 단계인 C 언어로 숫자 배열을 읽는 방법을 배웁니다. 숫자 집합의 입력을 받아 빈도 분석을 위한 준비를 하는 C 프로그램을 만들 것입니다.

먼저, 최빈값 계산 프로그램을 위한 새로운 C 파일을 생성합니다.

cd ~/project
nano mode_calculation.c

이제 다음 코드를 파일에 추가합니다.

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int numbers[MAX_SIZE];
    int n, i;

    // 요소 개수 입력
    printf("Enter the number of elements (max %d): ", MAX_SIZE);
    scanf("%d", &n);

    // 배열 요소 입력
    printf("Enter %d integers:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // 입력된 배열 출력 (입력 확인)
    printf("Entered array: ");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc mode_calculation.c -o mode_calculation
./mode_calculation

예시 출력:

Enter the number of elements (max 100): 5
Enter 5 integers:
3 4 2 4 1
Entered array: 3 4 2 4 1

이 코드의 주요 부분을 살펴보겠습니다.

  1. #define MAX_SIZE 100은 배열의 최대 크기를 설정하여 오버플로우를 방지합니다.
  2. scanf()는 요소 개수와 배열 값을 입력받는 데 사용됩니다.
  3. 입력된 배열을 출력하여 입력이 올바르게 저장되었는지 확인합니다.

이 코드는 최빈값 계산 과정에 필수적인 C 언어의 기본적인 배열 입력 방법을 보여줍니다. 다음 단계에서는 빈도 계산 및 최빈값 결정을 위해 이를 확장할 것입니다.

가장 흔한 값 찾기 위한 빈도 계산

이 단계에서는 배열 내 각 숫자의 빈도를 계산하고 가장 흔한 값 (최빈값) 을 식별하도록 이전 프로그램을 수정합니다.

기존 파일을 열고 코드를 업데이트합니다.

cd ~/project
nano mode_calculation.c

이전 코드를 다음 구현으로 바꿉니다.

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int numbers[MAX_SIZE];
    int frequencies[MAX_SIZE] = {0};
    int n, i, j, mode = 0, max_frequency = 0;

    // 요소 개수 입력
    printf("Enter the number of elements (max %d): ", MAX_SIZE);
    scanf("%d", &n);

    // 배열 요소 입력
    printf("Enter %d integers:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // 각 숫자의 빈도 계산
    for (i = 0; i < n; i++) {
        int count = 1;
        for (j = 0; j < n; j++) {
            if (i != j && numbers[i] == numbers[j]) {
                count++;
            }
        }
        frequencies[i] = count;

        // 최빈값 추적
        if (count > max_frequency) {
            max_frequency = count;
            mode = numbers[i];
        }
    }

    // 빈도 출력
    printf("\nFrequencies:\n");
    for (i = 0; i < n; i++) {
        printf("Number %d appears %d time(s)\n", numbers[i], frequencies[i]);
    }

    // 최빈값 출력
    printf("\nMode: %d (appears %d times)\n", mode, max_frequency);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc mode_calculation.c -o mode_calculation
./mode_calculation

예시 출력:

Enter the number of elements (max 100): 6
Enter 6 integers:
2 3 4 2 2 5

Frequencies:
2 appears 3 time(s)
3 appears 1 time(s)
4 appears 1 time(s)
2 appears 3 time(s)
2 appears 3 time(s)
5 appears 1 time(s)

Mode: 2 (appears 3 times)

이 구현의 주요 내용:

  1. 각 숫자의 빈도를 저장하기 위한 frequencies 배열을 만듭니다.
  2. 중첩된 루프를 사용하여 각 고유 숫자의 발생 횟수를 계산합니다.
  3. 최대 빈도를 추적하여 최빈값을 추적합니다.
  4. 프로그램은 단일 최빈값이 있는 경우를 처리합니다.

최빈값 출력

이 마지막 단계에서는 최빈값 계산 프로그램을 개선하여 여러 최빈값을 처리하고 통계 정보를 더욱 포괄적으로 출력합니다.

기존 파일을 열고 코드를 업데이트합니다.

cd ~/project
nano mode_calculation.c

이전 코드를 다음 구현으로 바꿉니다.

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int numbers[MAX_SIZE];
    int frequencies[MAX_SIZE] = {0};
    int unique_numbers[MAX_SIZE];
    int n, i, j, unique_count = 0, max_frequency = 0;

    // 요소 개수 입력
    printf("Enter the number of elements (max %d): ", MAX_SIZE);
    scanf("%d", &n);

    // 배열 요소 입력
    printf("Enter %d integers:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // 고유 숫자와 그 빈도 찾기
    for (i = 0; i < n; i++) {
        int is_unique = 1;
        for (j = 0; j < unique_count; j++) {
            if (numbers[i] == unique_numbers[j]) {
                is_unique = 0;
                break;
            }
        }

        if (is_unique) {
            unique_numbers[unique_count] = numbers[i];

            // 이 고유 숫자의 빈도 계산
            int count = 0;
            for (j = 0; j < n; j++) {
                if (numbers[i] == numbers[j]) {
                    count++;
                }
            }
            frequencies[unique_count] = count;

            // 최대 빈도 업데이트
            if (count > max_frequency) {
                max_frequency = count;
            }

            unique_count++;
        }
    }

    // 상세 최빈값 정보 출력
    printf("\nStatistical Analysis:\n");
    printf("Total Numbers: %d\n", n);
    printf("Unique Numbers: %d\n", unique_count);

    printf("\nFrequency Distribution:\n");
    for (i = 0; i < unique_count; i++) {
        printf("Number %d: %d time(s)\n",
               unique_numbers[i], frequencies[i]);
    }

    // 최빈값 출력
    printf("\nMode(s):\n");
    for (i = 0; i < unique_count; i++) {
        if (frequencies[i] == max_frequency) {
            printf("- %d (appears %d times)\n",
                   unique_numbers[i], frequencies[i]);
        }
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc mode_calculation.c -o mode_calculation
./mode_calculation

예시 출력:

Enter the number of elements (max 100): 7
Enter 7 integers:
2 3 4 2 2 5 5

Statistical Analysis:
Total Numbers: 7
Unique Numbers: 4

Frequency Distribution:
Number 2: 3 time(s)
Number 3: 1 time(s)
Number 4: 1 time(s)
Number 5: 2 time(s)

Mode(s):
- 2 (appears 3 times)

이 버전의 주요 개선 사항:

  1. 여러 최빈값이 있는 경우 처리
  2. 포괄적인 통계 개요 제공
  3. 데이터 집합에서 고유 숫자 식별
  4. 빈도 분포 표시

요약

이 실습에서는 C 언어로 숫자 배열을 읽고 각 숫자의 빈도를 계산하여 데이터 집합에서 가장 흔한 값인 최빈값을 결정하는 방법을 배웁니다. 먼저, 숫자 집합을 입력받고 빈도 분석을 위한 준비를 하는 C 프로그램을 작성합니다. 그런 다음, 각 숫자의 빈도를 계산하고 최빈값을 식별하도록 프로그램을 수정합니다. 마지막으로, 최빈값을 콘솔에 출력합니다.

완료된 단계에서 얻을 수 있는 주요 학습 내용은 다음과 같습니다.

  1. scanf() 함수를 사용하여 C 언어로 숫자 배열을 읽는 방법.
  2. 입력을 확인하기 위해 입력받은 배열을 출력하는 방법.
  3. 배열에서 각 숫자의 빈도를 계산하여 가장 흔한 값 (최빈값) 을 찾는 방법.