2012-04-17 2 views
6

나는이 마지막 단계에 도달 할 때까지 나는 날아 다니는 숙제를 가지고 있는데, 지금은 곤란하다. 정말 도움이된다.전화 워드 생성기 도움말 C++

프로젝트의 전제는 전화 번호가 주어진 단어의 파일을 만드는 것입니다. 사용자는 '### - ####'형식의 숫자를 입력해야합니다. 그런 다음 코드는 하이픈을 꺼내 전화 번호를 wordGenerator으로 보냅니다. 나는 모든 것이이 시점까지 작동한다는 것을 안다. 시간이 다가 오면 단어의 다른 가능성이 내가 문제를 제기하는 곳입니다.

// function to form words based on phone number 
void wordGenerator(const int * const n) 
{ 
    // set output stream and open output file 
    /* Write a declaration for an ofstream object called 
    outFile to open the file "phone.dat" */ 
ofstream outFile("phone.dat"); 
// letters corresponding to each number 

    /* Write a declaration for an array of 10 const char *'s 
    called phoneLetters. Use an initializer list to assign 
    each element of the array the corresponding string of 
    three letters. Use dummy characters for 0 and 1 */ 
    const char * phoneLetters[] = {"###", "###", "ABC", "DEF", "GHI", 
        "JKL", "MNO", "PRS", "TUV", "WXY"}; 
    // terminate if file could not be opened 
    /* Write code to check if the file was opened successfully, 
    and terminate if not */ 
    if(!outFile) 
    { 
    cerr << "The file could not be opened"; 
    exit(1); 
    } 

    int count = 0; // number of words found 

    // output all possible combinations 
    for (int i1 = 0; i1 <= 2; i1++) 
    { 
    for (int i2 = 0; i2 <= 2; i2++) 
    { 
     for (int i3 = 0; i3 <= 2; i3++) 
     { 
      for (int i4 = 0; i4 <= 2; i4++) 
      { 
       for (int i5 = 0; i5 <= 2; i5++) 
      { 
       for (int i6 = 0; i6 <= 2; i6++) 
       { 
        for (int i7 = 0; i7 <= 2; i7++) 
        { 
        /* Write a series of cascaded stream insertion 
       operations to output a set of seven letters 
      to outFile, followed by a space */ 

        outFile << phoneLetters[i7 + 2] << phoneLetters[i6 + 2] << phoneLetters[i5 + 2] << phoneLetters[i4 + 2] << phoneLetters[i3 + 2] << phoneLetters[i2 + 2] 
          << phoneLetters[i1 + 2] << ' '; 
        if (++count % 9 == 0) // form rows 
         outFile << '\n'; 
        } // end for 
       } // end for 
       } // end for 
      } // end for 
     } // end for 
     } // end for 
    } // end for 

    // output phone number 
    outFile << "\nPhone number is "; 

    for (int i = 0; i < 7; i++) 
    { 
     if (i == 3) 
     outFile << '-'; 

     outFile << n[ i ]; 
    } // end for 

    /* Write a statement to close the ouput file */ 
    outFile.close(); 
    system("pause"); 
    } // end function wordGenerator 

불행히도 내가 코드의 골격을 부여하고 과제를 완료하기 위해 빈칸을 채워 들었다 : 여기처럼 내 방법은 모습입니다. 주석이 차단 된 모든 곳 (/ * * /)에서 코드를 작성해야합니다.

가능한 단어의 올바른 형식을 출력하려면 어떻게해야하는지 잘 모르겠습니다. 나는 Google 검색을 시도했지만, 내가 찾은 모든 결과는 훨씬 더 단순하게 (내 의견으로는) 전환문을 사용하여 이것을 달성하고 템플릿에 제약이있다. (

모든 도움을 주실 수 있습니다. 방향

것은 편집 :.. 다른 사람도 나를 phoneLetters의 문자를 반복하는 방법을 알아내는 데 도움 수 있다면 난 그냥 한 가지 생각 는 느낌 [] 개별적으로 대신 블록의, 그 중요한 단계가 될 것이라고 앞으로 예 : "ABC"를 인쇄하는 대신 전화 번호의 숫자 '2'를 읽을 때 모든 가능한 조합에 대해 'A'를 인쇄 한 다음 'B'로 이동하십시오.

편집 : 모든

int main() 
{ 
    int phoneNumber[ 7 ] = { 0 }; // holds phone number 

    // prompt user to enter phone number 
    cout << "Enter a phone number (digits 2 through 9) " 
    << "in the form: xxx-xxxx\n"; 

    // loop 8 times: 7 digits plus hyphen; 
    // hyphen is not placed in phoneNumber 
    for (int u = 0, v = 0; u < 8; u++) 
    { 
    int i = cin.get(); 

    // test if i is between 0 and 9 
    if (i >= '0' && i <= '9') 
    phoneNumber[ v++ ] = i - '0'; 
    } // end for 

    wordGenerator(phoneNumber); // form words from phone number 
    return 0; 
} // end main 
+0

, 그것은 쉽게 될 것입니다 당신이 각각의 글자를 반복하기 위해서 –

+5

7 중첩 된 루프는 대개 바보 같은 일을하는 좋은 표지입니다. – AJG85

+0

@Msonic 작업을 단순화합니다. –

답변

6

당신이 문에 대한 무서운 중첩을 제거 할 수없는 경우 다음 줄 사용할 수 있습니다 코드에

outFile 
    << phoneLetters[n[0]][i1] 
    << phoneLetters[n[1]][i2] 
    << phoneLetters[n[2]][i3] 
    << phoneLetters[n[3]][i4] 
    << phoneLetters[n[4]][i5] 
    << phoneLetters[n[5]][i6] 
    << phoneLetters[n[6]][i7] 
    << ' '; 

일부 다른 노트 :

피가에 exit를 사용

희망.

+0

그게 내가 필요한 것입니다! 도움을 주셔서 대단히 감사합니다, 당신의 지식은 대단히 감사합니다! – Kyle

2

첫째, 이들에 대한-의 중첩 변경 : 은 여기 내 주는()입니다. 그들은 끔찍해 보입니다. 그리고 제가 15 자리 숫자를 생성한다고 말하면, 당신은 정말로 나쁜 위치에있게 될 것입니다.

당신이 찾고있는 것은 내가 생각할 수있는 모듈로 3을 가진 일종의 순열 생성기입니다. 특별한 경우 (실제 전화기의 "PQRS"와 같은)가 없기 때문에 가능한 모든 수를 조합은 0 ~ 3^7입니다.

그런 다음 하나의 for-loop를 사용하여 반복합니다. 작성 사용자 정의 반복자 기능, 즉 이해하기 아마도 어려운 개념, 그래서 생각 것입니다 것처럼,이 모든 조합을 만들기로 :

// 3^7 = 2187 

for (int i = 0; i < 2187; ++i) 
{ 
    int Div = 1; 
    // now, 7 digits 
    for (int d = 0; d < 7; ++d) 
    { 
     outFile << (i/Div) % 3; 
     Div *= 3; 
    } 
} 
트라이 어림 시스템의 숫자의 순열을 생성합니다 그 코드

) 어느 다음 수

/*1.*/ i % 3 
/*2.*/ (i/3) % 3 
/*3.*/ (i/9) % 3 
,691 : 당신이 정말로 파일에 쓰기 "폭포"를 사용해야하는 경우

outFile << phoneLetters[ActualReadNumber][ (i/Div)%3 ]; 

로 출력 바로 문자를 사용할 수, 등 모두 7 가능성과 내부 루프를 교체

등등 ... 내가 더 자세히 설명해야한다면, 이것에 대해 의견을 말하십시오; 내가 도왔다면 upvote :) 숙제에 행운을 빕니다.

+0

그것은 확실히 우아한 솔루션이며, 저를 위해서 저에게 저에게 감사 드려서 고맙습니다. 하지만 내가 말한 템플릿 코드를 변경하지 말아야한다. 어리석은 루프를 포함한다. – Kyle

+0

아, 그래서이 루프는 그대로있을 것이다. 나는 너의 고통을 안다, 나 또한 공부하고있다. 그리고 선생님은 그들 자신의 "방법"을 가지고있다. 나는 편지를 통해 반복하는 법을 이미 당신에게 썼다고 믿습니다. ('phoneLetters [num] [letter]'). –

+0

아, 알겠습니다. 그걸 제발 더 자세히 설명해 주시겠습니까? 내가 어떻게 그것을 구현할 수 있는지 모르겠다. 내 메인 게시물과 나머지 데이터 멤버를 볼 수 있도록 원래 게시물을 편집합니다. – Kyle

0

해결 방법 전화 번호가 두 자릿수 인 경우 해결 방법.

int pN[] = {6,9}; 

const char * phoneLetters[] = {"###", 
    "###", "ABC", "DEF", "GHI", "JKL", "MNO", "PRS", "TUV", "WXY"}; // 


for (const char *c1 = phoneLetters[pN[0]]; *c1 != '\0'; c1++) 
{ 
    for (const char *c2 = phoneLetters[pN[1]]; *c2 != '\0'; c2++) 
    { 
     printf("%c%c\n" , *c1 , *c2); 
    } 
} 

출력 : MW MX MY NW NX NY OW OX 오우

당신은 문자의의 2 개 차원 배열에 phoneLetters 배열의 변화 시도 할 수