1. 문제
14. 영문 텍스트를 입력받아 알파벳 히스토그램을 그리는 프로그램을 작성하라. 대문자는 모두 소문자로 집계하며, 텍스트 입력의 끝은 ';' 문자로 한다.
2. 결과
3. 코드
#include <iostream>
using namespace std;
int main()
{
char histo[10000];
int alpha[26];
int len=0;
for(int n=0; n<26; n++)
alpha[n] = 0;
cout << "영문 텍스트를 입력하세요. 히스토그램을 그립니다." << endl;
cout << "텍스트의 끝은 ; 입니다. 10000개까지 가능합니다." << endl;
cin.getline( histo, 10000, ';');
for( int i=0; i< strlen(histo); i++) {
if( isalpha( histo[i] ) ) {
if( histo[i] >= 65 && histo[i] <=90 ) histo[i] = tolower(histo[i] );
alpha[ histo[i]-97 ]++;
len++;
}
}
cout << "총 알파벳 수 " << len << endl << endl;
for(int i=97; i<=122; i++) {
cout << (char)i << " (" << alpha[i-97] << ")\t: ";
for(int k=0; k< alpha[i-97]; k++)
cout << "*";
cout << endl;
}
}
4. 설명
1. 영문 텍스트를 최대 10000개까지 입력받을 수 있으므로 char histo[10000];로 크기를 설정합니다.
3. 입력된 문자열 histo[]를 인덱스 0부터 histo의 길이인 strlen(histo)만큼 반복하는 for문을 만듭니다.
4. isalpha()로 알파벳인지 검사하고 참이면 if문을 실행하고 아니면 다음 인덱스로 넘어갑니다.
5. if문에 들어가면 우선 if문을 하나 더 사용해서 histo[i] >=65 && histo[i] <=90일 경우 즉, 대문자일 경우 tolower()함수를 사용하여서 소문자로 고쳐줍니다. 문자열을 다시 출력해야할 필요가 없으므로 바로 histo[i]그 곳에 저장합니다.
6. int alpha[26] 배열은 각 알파벳에 개수를 저장하는 함수로서 처음에 for문을 이용하여서 모든 원소를 0으로 초기화 해주셔야 합니다.
=>[ histo[i]-97 ] : if문으로 인하여 histo[i]는 소문자 알파벳 입니다. 즉 97~123 사이에 수 입니다. 여기의 -97을 해주므로서 0~25인 범위가 됩니다.
예를들어 histo[i]= 'a'이면 97로서 97-97=0 이고 alpha[0]++;이 됩니다. 이렇게 순서대로 갯수를 저장할 수 있습니다.
7. 그 다음 알파벳의 갯수를 저장하는 변수 len++을 해줍니다.
8. 이제 결과를 출력하는데 for( i=97; i<=122; i++ )을 이용하여서 각 줄의 알파벳을 for(int k=0; k< alpha[i-97]; k++)을 이용하여서 갯수만큼 '*'을 출력합니다.
※ (char)i : i가 97일 경우 'a'가 출력됩니다.
'명품 C++ programming' 카테고리의 다른 글
명품 C++ programming 실습문제 3장 1번 (0) | 2019.04.06 |
---|---|
명품 C++ programming 2장 Open Challenge (0) | 2019.04.06 |
명품 C++ programming 실습문제 2장 13번 (1) | 2019.04.06 |
명품 C++ programming 실습문제 2장 12번 (0) | 2019.04.06 |
명품 C++ programming 실습문제 2장 11번 (0) | 2019.04.06 |