1. 문제

 

10. 영문자로 구성된 텍스트에 대해 각 알파벳에 해당하는 문자가 몇 개인지 출력하는 히스토그램 클래스 Histogram을 만들어보자. 대문자는 모두 소문자로 변환하여 처리한다.

 

Histogram 클래스를 활용하는 사례와 실행 결과는 다음과 같다.

 

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
#include <string>
using namespace std;

class Histogram {
	string his;
	int len;
	int count[26];
public :
	Histogram(string h) { 
		his = h+"\n"; len = 0;
		for(int i=0; i < h.size(); i++)
			if( isalpha( his.at(i)) ) len++;
		for(int i=0; i < 26; i++)
			count[i] = 0;
	}
	void put(string h);
	void putc(char h);
	void print();
};
void Histogram::put(string h) {
	this->his += h;
	for(int i=0; i < h.size(); i++)
		if( isalpha( h.at(i)) ) len++;
}
void Histogram::putc( char h) {
	this->his += h;
	if( isalpha(h) ) len++;
}
void Histogram::print() {
	cout << his << endl << endl << "총 알파벳 수 " << len << endl << endl;
	char temp;
	for(int i=0; i < his.size(); i++) {
		if( isalpha( his.at(i) ) ) {
			temp = tolower( his.at(i) );
			count[temp-97]++;
		}
	}
	for(int i=0; i<26; i++) {
		printf("%c (%d)\t: ", 97+i, count[i]);
		for(int j=0; j < count[i]; j++)
			cout << "*";
		cout << endl;
	}
}
 
int main() {
	Histogram elvisHisto("Wise men say, only fools rush in But I Can't help, ");
	elvisHisto.put("falling in love with you");
	elvisHisto.putc('-');
	elvisHisto.put("Elvis Presley");
	elvisHisto.print();
}

 

 

4. 설명

 

생성해야할 함수들은 

Histogram(string s) : 문자열 s + "\n"를 하여서 멤버변수에 저장합니다. 또한 입력받은 알파벳의 개수를 구한다음 각 알파벳 개수를 저장할 배열 count의 모든 원소를 0으로 초기화 해줍니다.

 

void put( string s); : 저장된 문자열 뒤에 문자열 s를 추가합니다.

void put( char h); : 저장된 문자열 뒤에 문자 h를 추가합니다.

void print() : 저장된 문자열의 총 알파벳 수를 출력하고 각 알파벳의 개수를 표현하는 히스토그램을 출력합니다.

 

 

알파벳의 개수를 구해야 하므로 isalpha()를 사용하여서 알파벳인 경우 개수를 증가시켜야 합니다.

 

print()함수에서 알파벳을 출력하실 때 printf("%c (%d)\t:  ",  97+i,  count[i] ); 로 간단히 for문을 이용하여서 출력할 수 있습니다.

또한 달리 cout << (char)(i+97) << "(" << count[i] << ")\t:  "; 를 사용 하셔도 됩니다.

 

+ Recent posts