1. 문제

 

히스토그램 클래스에 <<, ! 연산자 작성

 

히스토그램을 표현하는 Histogram 클래스를 만들고 <<, ! 연산자를 작성해보자. Histogram 클래스는 영문자 알파벳만 다루며 대문자는 모두 소문자로 변환하여 처리한다. Histogram 클래스를 활용하는 코드 사례는 다음과 같다.

 

 

2. 결과

 

 

 

3. 코드

 


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

class Histogram {
	string his;
public :
	Histogram(string s) { his = s; }
	Histogram& operator << (string s) {
		this->his += s;
		return *this;
	}
	Histogram& operator << (char s) {
		this->his += s;
		return *this;
	}
	void operator !() {
		int i, count=0;
		int anum[26];
		for(i=0;i<26;i++) anum[i]=0;

		cout << his << endl << endl;
		
		for(i=0; i< his.size(); i++) {
			if( isalpha( his.at(i) ) ) 
			{
				int c = tolower( his.at(i) );
				anum[ c-97 ]++;
				count++;
			}
		}
		cout << "총 알파벳 수 " << count << endl;
		for(i=0; i<26; i++) {
			cout << (char)(i+97) << ":";
			for(int k=0; k< anum[i]; k++) cout << "*";
			cout << endl;
		}
	}
};
 
int main() {
	Histogram song("Wise men say, \nonly fools rush in But I can't help, \n");
	song << "falling" << " in love with you." << "- by ";
	song << 'k' << 'i' << 't';
	!song;
}

 

4. 설명

 

  Histogram 클래스에서 string변수를 매개변수로 가지는 생성자 하나를 생성합니다.

 

 또한, 구현해야 하는 연산자 함수는 string 변수를 입력받는 "<<" 와 char형 변수를 입력 받는 "<<", 그리고 히스토그램을 그리는 "!" 로 3개 입니다.

 

 

"<<" 연산자 함수는 단지 클래스 멤버 변수의 "+=" 연산자를 사용하여서 문자열을 연결시켜주면 됩니다. 연결을 시켜준 후 자신을 가리키는 *this를 리턴해줍니다.

 

-> 단, 여기서 주의하실 점은 main에서 << 연산자를 사용하여서 값들을 연속으로 입력 받을 수 있도록 하고자 하면 리턴형을 Histogram& 으로 해주셔야 합니다. 

 

 

"!" 연산자 함수는 히스토그램을 그리는 기능을 하며 우선 각 알파벳들의 개수를 저장할 함수 anum을 선언합니다. 그 후 알파벳인지 검사를 합니다. 그 다음 대문자일 수도 있으니 tolower() 함수를 이용하여서 소문자로 고쳐줍니다.

 

 

총 알파벳 수를 구했으면 이제 히스토그램을 그립니다.

 

-> (char)(i+97) 를 for문을 이용하여서 출력하면 a~z를 간편하게 출력할 수 있습니다.

 

+ Recent posts