2009-11-02 8 views
1

나는 병렬 배열을 사용하여 파일에있는 일련의 텍스트를 번역 할 변환기 프로그램을 작성하기 시작했습니다. 번역 할 언어는 라틴계 돼지입니다. 영어 사전에 돼지 라틴어로 사용할 텍스트 파일을 만들었습니다. 두 차원의 배열을 사용하고 싶지 않았습니다. 배열을 한 차원에 유지하고 싶습니다. 기본적으로 PigLatin으로 작성된 텍스트 파일을 읽고 내가 만든 사전을 사용하여 명령 줄에서 영어로 번역본을 출력하고 싶습니다.번역 프로그램

내 의사 코드 아이디어는 다음과 같습니다

  • 를 열고 사전 텍스트 파일.

  • 그/그녀가 다음 단어를 번역하기 위해 사용자의 텍스트 파일에 각 단어를 검색하고 사전에 비해 영어

  • 로 번역하고 싶어 PigLatin로 작성된 텍스트 파일의 이름을 사용자에게 물어 따라서. 더 이상 번역 할 단어가 없을 때까지 계속하십시오.

  • 번역 된 단어를 명령 줄 화면에 표시하십시오.

내가 영어 번역 단어와 돼지 라틴어 단어를 포함하는 또 다른 하나를 포함 하나를 병렬 배열을 사용하여 생각했다.

C++에서 배열을 사용하여 문자열을 어떻게 조작 할 수 있습니까?

감사합니다.

답변

1

문자열 배열을 선언하는 것은 쉽습니다. 다른 배열을 선언하는 것과 같습니다. 100 캐릭터 오브젝트의 배열, 그리고 어레이가 piglatin라는

const int MaxWords = 100; 
std::string piglatin[MaxWords]; 

. 문자열이 비어 있습니다. 이 같은 배열을 채울 수 :

int numWords = 0; 
std::ifstream input("piglatin.txt"); 
std::string line; 
while (std::getline(input, line) && numWords < MaxWords) { 
    piglatin[numWords] = line; 
    ++numWords; 
} 
if (numWords == MaxWords) { 
    std::cerr << "Too many words" << std::endl; 
} 

내가 강력하게 하지 배열을 사용하는 것이 좋습니다. 대신, 같은 std::vector 또는 std::deque 같은 컨테이너 개체를 사용합니다. 그렇게하면 파일의 크기를 미리 알지 못해도 파일의 내용을로드 할 수 있습니다.위의 예제 선언을 사용하면 파일에 100 개 이상의 항목이 없는지 확인하고 100 개 미만인 경우 배열의 몇 개 항목이 유효한지 추적해야합니다.

std::vector<std::string> piglatin; 

std::ifstream input("piglatin.txt"); 
std::string line; 
while (std::getline(input, line)) { 
    piglatin.push_back(line); 
} 
+0

아직 표준 벡터에 대해 배웠기 때문에 배열을 사용하고 싶습니다. 파일에 포함될 단어의 수를 알고 있다고 가정 해 보겠습니다. 예를 들어 파일에 최대 30 단어를 포함한다고 가정 해 보겠습니다. 사전에는 해당 번역과 함께 100 단어가 있습니다. 크기 30 배열을 선언하는 것이 이해합니다. 맞습니까? 그리고 나서 사용자의 텍스트 파일에있는 단어를 읽고 사전 파일에서 번역본을 찾습니다. 마지막으로 커맨드 라인에서 번역을 할 것입니다. 비교를하는 방법에 대한 아이디어. 감사합니다. –

+0

예. 얼마나 많은 단어를 가지고 있는지 알고 있다면, 필자가 시연했던 것처럼 많은 요소를 가진 배열을 선언하십시오. 문자열의 동일성을 비교하기 위해 다른 대부분의 유형과 비교하여'=='연산자를 사용할 수 있습니다. ('char *'에'=='을 사용하지 마십시오. 예상 한대로되지 않습니다. 그러나'char *'를 사용하지 않았을 것입니다. 그러므로 걱정하지 마십시오.) –

+1

@jualin : if C++을 배우면서 구체적으로'std :: vector'를 처음 배우고 나중에 배열을 배우는 것이 좋습니다. 벡터는 더 높은 수준입니다. 비슷하게,'std :: string'에 대해서 먼저 배우고 나중에 원시'char *'문자열로 작업해야합니다. –

4

돼지 라틴어는 즉석에서 번역 할 수 있습니다.

그냥 각 단어의 첫 모음 전에 단어를 분할하면 사전 파일이 필요하지 않습니다. 그런 다음 두 번째 부분을 첫 번째 부분과 연결하고 '-'로 구분하고 끝에 "ay"를 추가하십시오.

당신은이 사전 파일을 사용하려면 하지 않는?

+0

나는 문자열 조작을 더 잘 배울 수 있도록 사전을 사용하고 싶습니다. 달성 방법에 대한 아이디어가 있으십니까? 빠른 응답을 보내 주셔서 감사합니다. –

+0

사전이 어떻게 문자열 조작을 배우는데 도움이 될지 모르겠습니다. std :: map은 깨끗한 사전을 만듭니다. 그것은 그것을 사용하여 그다지 교육적 가치는 아니지만. 이것을 번역 할 때 문자열 조작법을 가르쳐주지 않겠습니까? – pbos

+0

감사합니다. –

5

파일은 항상 한 방향으로 번역 될 경우 (예를 들어 PigLatin -> 영어)를 쉽게 다른 한 문자열을 매핑 할 std::map를 사용하는 것이 더 효율적이 될 것이다 :

std::map<std::string, std::string> dictionary; 
dictionary["ashtray"] = "trash"; 
dictionary["underplay"] = "plunder"; 

을 그리고 번역 된 단어를 얻을, 검색을 위해 dictionary[]을 사용하십시오. (예 : std::cout << dictionary["upidstay"] << std::endl;)

+0

std :: map은 쉽게 사전을 수행하는 가장 깨끗한 방법입니다. :) – pbos

+0

나는 그것이 더 효율적이라는 것을 이해하지만 나의 주요 목적은 병렬 배열로 작업하는 법을 배우는 것이다. 병렬 배열을 사용하면 어떻게 될까요? –