본문 바로가기
컴퓨터 공부/C++

[C++]텍스트를 입력받아 알파벳 히스토그램 그리기

by 반짱코 2021. 8. 29.
728x90

#영문 텍스트를 입력받아 알파벳 히스토그램 그리기

 

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    char buf[10000];
    int maxNum = 0;
    char a[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    int countNum = 0;
    
    
    cout << "영문 텍스트를 입력하세요. 히스토그램을 그립니다." << endl;
    cout << "텍스트의 끝은 ; 입니다. 10000개 까지 가능합니다." << endl;
    
    
    cin.getline(buf, 10000, ';');
    
    
    for(int i=0; i < strlen(buf); i++)
    {
        if(isalpha(buf[i]) != 0){
            
            buf[i] = tolower(buf[i]);
            maxNum++;
        }
    }
    
    cout << "총 알파벳" << maxNum << endl; 
    
    
    for(int i=a[0]; i<=a[25]; i++){
        for(int j=0; j<strlen(buf); j++){
            if(buf[j] == i)
            countNum++;
        }
        cout << i << "(" << countNum << ")" << " : ";
        for(int k=0; k<countNum; k++){
            cout << "*";
        }
        cout << endl;
        countNum = 0;
    }
}

 

#목표

 

  • 알파벳을 입력하면 입력된 알파벳 개수와 a부터 z까지 각각의 개수 구하기
  • cin.getline(),  tolower(), isalpha() 함수를 이용하기

 

 


1. 총 알파벳 개수를 구하기

char buf[10000];
int maxNum = 0;

 cin.getline(buf, 10000, ';');
    
    
    for(int i=0; i < strlen(buf); i++)
    {
        if(isalpha(buf[i]) != 0){
            
            buf[i] = tolower(buf[i]);
            maxNum++;
        }
    }
    
    cout << "총 알파벳" << maxNum << endl;

10000개 까지 입력 가능하게 문자열 변수 설정을 했다.

cin.getline(설정한 변수, 크기, 입력을 끝내는 단어) 이런 식으로 사용했다.

문자열 변수의 길이를 알려주는 strlen 함수를 사용해 입력한 문자만큼 for문은 반복시켜 줬다.

 

 

거기에 isalpha 함수를 썼는데  https://www.tutorialspoint.com/isalpha-and-isdigit-in-c-cplusplus

 

isalpha() and isdigit() in C/C++

isalpha() and isdigit() in C/C++ isalpha() The function isalpha() is used to check that a character is an alphabet or not. This function is declared in “ctype.h” header file. It returns an integer value, if the argument is an alphabet otherwise, it ret

www.tutorialspoint.com

를 참고했더니 대문자, 소문자 알파벳이면 정수를 그 외에는 0을 반환한다고 한다.

그래서 if문을 작성했는데 0이 아닐 때 알파벳이기 때문에!= 0을 조건으로 해줬다.

거기에 tolower 함수는 대문자를 소문자로 변환시켜 주는데 처음에 쓰질 않았더니 결과물에서 대문자는 카운트할 때 제외되길래 붙여주었다.

 

 

2. A부터 Z까지 각각의 개수를 *로 표기하기

char a[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int countNum = 0;


for(int i=a[0]; i<=a[25]; i++){
        for(int j=0; j<strlen(buf); j++){
            if(buf[j] == i)
            countNum++;
        }
        cout << i << "(" << countNum << ")" << " : ";
        for(int k=0; k<countNum; k++){
            cout << "*";
        }
        cout << endl;
        countNum = 0;
    }

여기가 어려웠다. A부터 Z까지 콘솔 창에 출력해서 나눠야 했기 때문에 배열 char a []을 만들어봤다.(후술 하겠지만 이 방법이 아닌 거 같다.)

 

첫 for문은 배열 [0]부터 [25]까지 출력하는 방법이다. (알파벳이 26개 이므로!)

 

두 번째 for문은 입력한 문장 길이만큼 반복하고 만약에 문장의 알파벳이 i와 같으면 그만큼 숫자를 더했다.

예를 들어 a가 7개라면        a( 7 ) :  *******       이렇게 출력할 건데 괄호 안 숫자가 countNum이다.

 

세 번째 for문은 간단한데 이미 더해진 countNum 숫자만큼 *을 더해주는 반복문이다.

(countNum을 마지막에 0으로 초기화해주지 않았더니 결괏값이 차근차근 더해졌다.)

 

첫 반복문에 두세 번째의 반복문이 들어가 있기 때문에 26줄의 결과 문이 나올 것이다.

 

 

 

3. 결과와 보완점

더 긴 문장이 가능하지만 출력을 간단히 하기 위해 

Hello I am Sam!!!! 을 입력해보았다.

대문자 소문자를 섞었고 느낌표도 넣었다.

총 알파벳 숫자 클리어

괄호 안 숫자도 제대로 클리어, 별*도 숫자만큼 잘 나왔다.

 

문제는 앞에 알파벳이 아닌 숫자가 97부터 122까지 있는 건데

아스키코드 값을 검색해보니 소문자 a부터 z까지가 97부터 122였다.

 

그렇기 때문에 80프로 정도 성공이라고 생각하는데 정확히 알파벳으로 출력할 수 있게 되야겠다!

 

 

 

 

 

 

 

#공부한 것을 정리해 보았습니다. 

#틀린 내용이 있거나 추가할 내용이 있으면 알려주세요!

↓↓↓↓↓↓↓↓

 

 

 

 

 

728x90

댓글