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

[C++] 영어문장을 모스부호로 바꿔보자

by 반짱코 2024. 5. 4.
728x90

문장을 모스부호로 바꾸는 오픈챌린지 문제를 도전해 보았다.

 

영화나 드라마에서 처럼 소리를 내진 못하겠지만 원하는 문장을 간단히 출력해 볼 수 있으면 좋지 않을까 싶다.

 

 

 

1. 목표

  1. 헤더 파일과 실행 파일을 분리해 작성해 본다.
  2. 제시된 템플릿을 변경하지 않는다.
  3. 실행 흐름을 이해해서 정리해 본다.

 

 

 

2. 헤더 파일 (morse.h)

class Morse {
	string alphabet[26];
	string digit[10];
	string slash, question, comma, period, plus, equal;
public:
	Morse();
	void text2Morse(string text, string& mores);
	bool morse2Text(string morse, string& text);
};

 

Morse 클래스를 헤더 파일에 정리했다. 

알파벳 a-z, 숫자 0-10, 그리고 순서대로 / ? , . + = 기호이다. 

 

위 변수를 초기화해 줄 생성자, 실행 함수 2개가 있다.

 

 

 

 

 

3. 실행 파일 (main.cpp)

int main()
{
    string text;
    string morse;

    Morse m;

    cout << "아래에 영문 텍스트를 입력하세요. 모스부호로 바뀝니다." << endl;
    getline(cin, text);

    m.text2Morse(text, morse);
    cout << morse << endl;

    cout << "모스 부호를 다시 영문으로 바꿉니다." << endl;

    m.morse2Text(morse, text);
    cout << text << endl;
    

}

 

위 순서 대로 문장을 입력할 text, 변환되어 출력될 morse를 선언해 준다. 그리고 객체 m을 생성해 멤버 함수를 호출할 수 있도록 한다.

 

getline()으로 입력한 문자열 text를 그 아래 두 함수가 사용해 결과물을 출력하게 된다.

 

 

 

 

 

4. 함수 구현 파일 morse.cpp

Morse::Morse(){
    string morseAp[26] = { ... }
    string morsedg[10] = { ... }
    question = "..." ~ 			//모스부호 표를 보고 작성
    
    for(int i=0; i < 26; i++){
	alphabet[i] = morseAp[i];
    }
    for(int i=0; i < 10; i++){
    	digit[i] = morsedg[i];
    }						// 1
};


void Morse::text2Morse(string text, string& morse){
	morse = "";
    
    	for(int i=0; i <text.length(); i++){
		char tmp = text.at(i);
    		if(isalpha(tmp)){
			morse = morse + alphabet[tmp - 97] + " ";	// 2
		}else if(tmp == ' '){
        		morse += "  ";					// 3
		}else if(isdigit(tmp)){
			morse = morse + digit[tmp -47] + " ";		// 4
        }else if(tmp == '?'){
        	morse = morse + question + " ";
        }... else if 반복
	}
}


bool Morse::morse2Text(string morse, string& text){
    string copymorse;				// 5
    
    text2Morse(text, copymorse);
    
    if(copymorse == morse){			// 6
    	return true;
    }else{
        return false;
    }
};

 

모스부호 모두를 순서대로 배열에 선언해 줬다.

1. for 반복문을 사용해서 클래스에 있던 alphabet과 digit의 배열을 모스부호로 초기화했다.

   ▶ alphabet[0] = morseAp[0]  'a' = '.-'

 

2. c++ 함수.at과 isalpha, isdigit가 사용되었다. 

  • .at은 입력된 문자열 text의 길이만큼 분해해 준다.(반복문 포함)  hello 입력 시 tmp => 'h' 'e' 'l' 'l' 'o'
  • isalpha, isdigit는 tmp 값이 알파벳, 숫자 인지 확인해 준다. true 일시 값을 반환, false 일시 0 반환
  •  [tmp - 97]의 이유는 소문자 a의 아스키코드 값이 97이기 때문이다
  • alphabet[0] = 'a'가 되고 그건 위에서 초기화 한대로 morseAp[0]이기 때문에 a는 '-.'로 저장된다.

3. 띄어쓰기를 할 때의 공백

 

4. 2번과 같은 맥락

 

5. 모스부호를 다시 일반 문장으로 되돌리는 함수

 

프로그램 자체가 모스부호를 다시 입력해서 알파벳으로 바꾸는 게 아니고, 문장 입력과 동시에 변환이 되고 프로그램이 종료되기 때문에 text2morse 함수를 같이 실행해서 같은 값을 다른 변수에 넣는다. 

 

morse와 copymorse가 같으면 true로 main.cpp에 쓰여있는 대로 그대로 text를 출력하게 된다.

 

 

 

 

 

 

5. 실행 결과

 

예쁘게 출력이 된다.

 

 

 

 

 

6. 마무리

 

어려웠다 검색도 많이 했다. 위에 정리한 대로 어떻게 함수들이 쓰이는지 제대로 숙지하고, 모스부호를 입력하면 영문으로 바뀌게 하는 방법도 생각해 봐야겠다.

 

 

 

 

 

 

 

 

 

틀린 게 있거나 의견이 있으시면 댓글 부탁드립니다.💬

728x90

댓글