Skip to main content

1.6.1. 실습 예제 2개

실습 전 이론

히스토그램 - 표로 되어 있는 도수 분포를 정보 그림으로 나타낸 것이다.

image.png

히스토그램에 대한 정의를 잘 몰라서 찾아봤다. 근데 어떤식으로 진행하면 될지에 대한 정보까지 봐버려서; 좀 아쉽네

실습 예제

1번 문제 입력된 단어의 길이에 대한 히스토그램을 작성하는 프로그램을 작성하라
#include <stdio.h>
#define IN 1
#define OUT 0
#define UPPER 10

int main(){
    int c, i;
    int ndigit[30];
    int wordLength = 0;
    int state;

    /*배열 안에 요소들을 0으로 지정해주나봄; 이거 일일히 해야되는구나; */
    for (i = 0; i < UPPER; ++i){
        ndigit[i] = 0;
    }

    state = IN;
    while ((c = getchar()) != EOF){
        if (state = IN && c != '\n' && c != '\t' && c != ' '){
            ++wordLength; 
        }
        else {
            ++ndigit[wordLength];
            wordLength = 0;
            state = OUT;
        }

    }
    printf("단어의 길이가 1인 단어의 갯수는 %d\n", ndigit[1]);

}

한번에 만들기는 너무 복잡해서 일단 테스트용으로 만들었다. 1개 길이의 단어만 입력하고 출력을 테스트했다.

image.png

정상적으로 동작하는 것을 확인

#include <stdio.h>
#define IN 1
#define OUT 0
#define UPPER 10

int main(){
    int c, i;
    int ndigit[30];
    int wordLength = 0;
    int text;
    int state;
    int index;

    /*배열 안에 요소들을 0으로 지정해주나봄; 이거 일일히 해야되는구나; */
    for (i = 0; i < UPPER; ++i){
        ndigit[i] = 0;
    }

    state = IN;
    while ((c = getchar()) != EOF){
        if (state = IN && c != '\n' && c != '\t' && c != ' '){
            ++wordLength; 
        }
        else {
            ++ndigit[wordLength];
            wordLength = 0;
            state = OUT;
        }

    }

    for (index = 0; index < UPPER; ++index){
        printf("[%d]", index);
        for (text = 0; text < ndigit[index]; ++text){
            printf("=");
        }
        printf("\n");
    }
    
}

위 테스트를 통해 길이 별 단어의 갯수를 파악해 = 문자를 반복하여 출력해서 그래프 모양으로 만들어줬다.

image.png

2번 문제 - 입력된 문자들의 사용빈도를 나타내는 히스토그램을 출력하는 프로그램을 작성하라

이건 ndigit[] 배열의 첨자를 미리 지정하지 않고 새로운 단어가 들어갈때마다 추가해줘야 될까?

그럼 입력 값이 이미 ndigit 배열 안에 들어가 있는지를 확인하는 코드 부터 짜봐야겠다.



실습 후 이론