[C언어-기초실습-7] 랜덤 횟수 동안 알파벳 출현 횟수를 구하시오.

in #kr-dev5 years ago (edited)

[C언어-기초실습-7] 랜덤 횟수 동안 알파벳 출현 횟수를 구하시오.



오늘은 알파벳 놀이로 랜덤 횟수 동안 랜덤 알파벳이 출현 횟수를 누적 시키는 실습을 하도록 하겠습니다. 특정값들의 누적 통계를 낼 때 이 원리를 이용하는 경우가 많습니다. 디지터 영상처리 프로그램을 배울 때 이미지에 RGB값을 히스토그램을 낼 때 이 누적 알고리즘을 이용합니다. 과거 RAW 영상의 픽셀값 0~255 값을 히스토그램으로 만들어 출력하는 과제물을 코딩했던 기억이 나는군요. 아무튼 랜덤 출현 알파벳의 분포값을 실습해 보도록 하겠습니다.

1. 문제의 이해


C언어의 알파벳은 아스키코드값을 가지고 있습니다. 직접 알파벳을 써서 출력 할 수도 있지만 아스키 코드값으로 알파벳을 출력하기도 합니다.

그러면, 알파벳을 출력을 직접 실습 해봅시다.

    printf("%d ~ %d : %d ~ %d\n",'A', 'Z','a','z');
    printf("%c ~ %c : %c ~ %c\n",65,90,97,122);

이렇게 해당 알파벳이 가지고 있는 아스키코드값인 숫자로 출력하고 다시 아스키코드값을 문자로 출력해봄으로써 알파벳의 형태를 이해 합시다.

[결과]
a1.jpg

결과를 보시는 것처럼 printf()문의 문자와 아스키코스값을 확인 할 수 있을 거에요.

대문자 출력


이제는 아스키 코드값으로 알파벳 A~Z까지 출력 해볼까요.

for(i=65;i<=90;i++){
    printf("%c ",i);
}
printf("\n");   

아스키 코드값을 65에서 90까지 루프를 돌리면 됩니다. 그리고 i값을 바로 문자로 출력하면 됩니다.
[결과]
a2.jpg

문자를 다루는 것이 어렵지 않죠.

실습으로 다시 넘어 갑시다.

랜덤 횟수만큼 문자 생성


[랜덤함수 이용]

#include <stdlib.h>    //난수함수 
#include <time.h>     //시간함수 

srand( (unsigned)time(NULL) ); //난수 초기화
randVal = rand()%26; //난수 만들기

알파벳은 26자로 구성되어 있습니다. 난수를 65~90 사이의 난수를 만들 수 있겠지만 간단히 0~25사이의 난수를 만들어 내면 쉽게 코딩화 할 수 있습니다.

randVal = rand()%26

rand()값을 26로 나눈 나머지는 0~25사이 값이 됩니다. 고로 난수는 0~25사이의 숫자에서 최소값은 0이고 최대값은 25가 됩니다. 알파벳 대문자 'A' 은 65이고 'Z'은 90입니다. 즉, 알파벳 최소값은 65이고 최대값은 90인 것이죠. 난수 0~25사이의 숫자가 생성된다고 했으니 다음과 같이 표현하면 난수 알파벳이 만들어 집니다.

randVal+65 => 난수 알파벳

무작위 랜덤 알파벳을 하나 출력 해 봅시다.

randVal = rand()%26;    
printf("%c \n", randVal+65);

[결과]
a3.jpg

랜덤 'J'문자가 만들어 졌네요.

이제 랜덤 알파벳을 만들 수 있게 되었으니 랜덤 횟수만큼 알파벳을 누적시키는 부분을 알아 봅시다.

알파벳은 26자로 구성되었습니다. 26글자 누적시킬려면 누적값을 저장하는 변수가 필요합니다.

int str[26];

이렇게 0~25번지의 누적값을 담을 그릇을 만들었습니다. 0은 'A'이고 25는 'Z'라는 개념을 머리속에 넣어 두세요.
여기에 랜덤 알파벳을 누적시켜야 겠죠.

//초기화 
for(i=0;i<26;i++){
    str[i]=0;
}

printf("랜덤 횟수를 입력하시오? ");
scanf("%d",&inputCnt);   
    
for(i=0;i<inputCnt;i++){
    randVal = rand()%26; //랜덤 알파벳
    str[randVal]+=1; //누적       
}    

이렇게 해서 랜덤 알파벳을 입력 된 횟수만큼 추출하여 누적시키는 코딩을 완성했습니다.

이제 이게 정상적으로 동작하는지 실행을 시켜 봐야겠죠.

2. 코딩


[전체소스]

#include <stdio.h>
#include <stdlib.h>    //난수함수 
#include <time.h>     //시간함수 
#include <Windows.h>

int Palindrome(char *str){

}

int main(int argc, char *argv[]) {
    
    int inputCnt;
    int randVal;
    int str[26];
    int i; 
    
    srand( (unsigned)time(NULL) );    
    
    //초기화 
    for(i=0;i<26;i++){
        str[i]=0;
    }
    
    printf("랜덤 횟수를 입력하시오? ");
    scanf("%d",&inputCnt);   
    
    for(i=0;i<inputCnt;i++){
        randVal = rand()%26; //랜덤 알파벳 
        str[randVal]+=1; //누적       
    }
    
    //누적값 출력 
    for(i=0;i<26;i++){      
        printf("[%c]=%2d",65+i,str[i]);     
        if((i+1)%5==0) printf("\n");        
    }
    printf("\n");

    system("pause");
    return 0;
}

[결과]
aa1.jpg

마무리


오늘은 알파벳에 관해 코딩해 보는 시간이였습니다. 랜덤 알파벳을 누적시키기 위해서 입력을 수동으로 해도 되지만 귀찮아서 rand()함수를 이용해서 100개의 입력값을 만들어 냈고 그 값을 출현 빈도수를 계산해 냈습니다. 이 원리를 이용하면 로또번호의 출현 빈도수를 계산해 낼 수 있는데 로또 사이트 가셔서 지금까지의 로또 번호를 CSV 파일로 만들고 범위 회차별 로또번호 출현 빈도수를 계산해서 출력도 할 수 있는데 한번 도전해 보세요. lotto[45]변수에 로또번호값을 누적시켜서 통계를 내면 재미 있겠죠. 그걸 실습을 하려다 재밌는 부분은 여러분들에게 남기고 그냥 알파벳 빈도수 프로그램을 만들어 보았네요.


Sponsored ( Powered by dclick )

dclick-imagead

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.033
BTC 64420.25
ETH 3150.23
USDT 1.00
SBD 3.99