-
명품 C++ 5장 Open ChallengeC++ 2018. 10. 31. 23:17
영문 텍스트, 숫자, 몇 개의 특수 문자로 구성되는 텍스트를 모스 부호로 변환하는 프로그램을 작성하라. 각 모스 코드들은 하나의 빈칸으로 분리되고, 영문 한 워드가 모스 워드로 변환되면 워드들은 3개의 빈칸으로 분리된다.
소스코드
#include <iostream>using namespace std;#include <string>class Morse {string alpahbet[26]; // 알파벳의 모스 부호 저장string digit[10]; // 숫자의 모스 부호 저장string slash, question, comma, period, plus, equal; // 특수 문자의 모스 부호 저장public:Morse(); // alphabet[], digit[] 배열 및 특수 문자의 모스 부호 초기화void text2Mores(string text, string& morse); // 영문 텍스트를 모스 부호로 변환bool mores2text(string morese, string& text); // 모스 부호를 영문 텍스트로 변환};Morse::Morse() {alpahbet[0] = ".-"; alpahbet[1] = "-..."; alpahbet[2] = "-.-."; alpahbet[3] = "-..";alpahbet[4] = "."; alpahbet[5] = "..-."; alpahbet[6] = "--."; alpahbet[7] = "....";alpahbet[8] = ".."; alpahbet[9] = ".---"; alpahbet[10] = "-.-"; alpahbet[11] = ".-..";alpahbet[12] = "--"; alpahbet[13] = "-."; alpahbet[14] = "---"; alpahbet[15] = ".--.";alpahbet[16] = "--.-"; alpahbet[17] = ".-."; alpahbet[18] = "..."; alpahbet[19] = "-";alpahbet[20] = "..-"; alpahbet[21] = "...-"; alpahbet[22] = ".--"; alpahbet[23] = "-..-";alpahbet[24] = "-.--"; alpahbet[25] = "--.."; digit[0] = "-----"; digit[1] = ".----";digit[2] = "..---"; digit[3] = "...--"; digit[4] = "....-"; digit[5] = ".....";digit[6] = "-...."; digit[7] = "--..."; digit[8] = "---.."; digit[9] = "----.";slash = "-..-."; question = "..--.."; comma = "--..--"; period = ".-.-.-";plus = ".-.-"; equal = "-...-";}void Morse::text2Mores(string text, string& morse) {for (int i = 0; i < text.size(); ++i) {char c = text.at(i);if (c >= 65 && c <= 90) c=tolower(c);if (c >= 97 && c <= 122) {morse = morse +alpahbet[c - 97]+" ";}else if (c >= 48 && c<=57) {morse = morse + digit[c - 48]+" ";}else {switch (c){case '/':morse = morse + slash+" "; break;case '?':morse = morse + question + " "; break;case ',':morse = morse + comma + " "; break;case '.':morse = morse + period + " "; break;case '+':morse = morse + plus + " "; break;case '=':morse = morse + equal + " "; break;case ' ':morse += " "; break;}}}}bool Morse::mores2text(string morse, string& text) {string alpah[26] = { "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" };string di[10] = { "0","1","2", "3","4","5", "6","7","8", "9" };string retext="";for (int j = 0; j < morse.size(); ) {int pos = morse.find(" ",j);bool sw = true;string s = morse.substr(j, pos-j);for (int i = 0; i < 26; ++i) {if (s == alpahbet[i]) {retext.append(alpah[i]);sw = false;break;}}if (sw) {for (int i = 0; i < 10; ++i) {if (s == digit[i]) {retext.append(di[i]);sw = false;break;}}}if (sw) {if (s == slash) retext += "/";else if (s == question) retext += "?";else if (s == comma) retext += ",";else if (s == period) retext += ".";else if (s == plus) retext += "+";else if (s == equal) retext += "=";}if (morse[pos] == ' ' &&morse[pos+1] == ' ' &&morse[pos+2] == ' ') {retext += " ";pos += 2;}j = pos + 1;}if (retext == text) return true;else return false;}int main() {string text, morse;Morse m;cout << "아래에 영문 텍스트를 입력하세요. 모스 부호로 바꿉니다." << endl;getline(cin, text);m.text2Mores(text, morse);cout << morse << endl << endl;cout << "모스 부호를 다시 형문 텍스트로 바꿉니다." << endl;if (m.mores2text(morse, text))cout << text;elsecout << "모스 부호->텍스트 변환 에러" << endl;}실행결과
대문자라면 소문자로 바꾸고, 문자, 숫자, 특수문자를 판별하여 모스 부호로 바꿉니다.
공백일 때, 3칸의 공백을 만들어야 한다고 생각했지만, 한글자를 바꿀때마다 1칸의 공백을 더 붙였으므로, 2칸만 공백을 만들어야합니다.
모스부호에서 텍스트로 바꾸는 과정에서 일치하는 값을 찾았다면 다음으로 넘어갑니다.
'C++' 카테고리의 다른 글
명품 C++ 6장 2번 (0) 2018.11.02 명품 C++ 6장 1번 (0) 2018.11.02 명품 C++ 5장 12번 (2) 2018.10.31 명품 C++ 5장 11번 (0) 2018.10.31 명품 C++ 5장 10번 (0) 2018.10.31