2012-04-17 37 views
6

Tôi có một số bài tập về nhà mà tôi đã bay qua cho đến khi tôi bước đến bước cuối cùng này và bây giờ tôi đang bối rối, tôi thực sự sẽ đánh giá cao một số trợ giúp.Máy phát điện từ điện thoại Trợ giúp C++

Tiền đề của dự án là tạo một tệp các từ có thể cho một số điện thoại. Người dùng có nghĩa là nhập một số có định dạng '### - ####'. Mã sau đó kéo dấu gạch nối ra và gửi số điện thoại đến phương thức wordGenerator. Tôi biết rằng mọi thứ hoạt động cho đến thời điểm này. Khi thời gian đến đầu ra các khả năng khác nhau của các từ là nơi tôi đang gặp vấn đề của tôi. Dưới đây là những gì phương pháp của tôi trông giống như:

// 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 

Thật không may tôi đã được cung cấp một bộ mã và yêu cầu điền vào chỗ trống để hoàn thành bài tập. Ở khắp mọi nơi mà các bình luận bị chặn (/ * * /) là nơi tôi phải điền mã.

Tôi không chắc mình cần làm gì để xuất ra định dạng đúng của các từ có thể. Tôi đã thử tìm kiếm google, nhưng tất cả các kết quả tôi tìm thấy sử dụng một tuyên bố chuyển đổi đơn giản hơn nhiều (theo ý kiến ​​của tôi) để đạt được điều này và tôi bị ràng buộc với mẫu: (

Tất cả trợ giúp đều được đánh giá cao, thậm chí là di chuyển ở bên phải Chỉ cần nghĩ về một điều khác Tôi cảm thấy rằng nếu ai đó thậm chí có thể giúp tôi tìm ra cách để lặp qua các ký tự của phoneLetters [] một cách riêng lẻ thay vì một khối, đó sẽ là một bước đáng kể. Ví dụ: khi đọc số '2' của số điện thoại thay vì in "ABC", in "A" cho tất cả các kết hợp có thể, sau đó chuyển sang "B".

Edit: Đây là chính tôi():

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

bạn có thể thử thay đổi mảng phoneLetters của bạn vào một mảng hai chiều của char, sau đó nó sẽ được dễ dàng để bạn lặp qua từng chữ cái –

+5

7 lồng nhau cho vòng lặp thường là dấu hiệu tốt bạn đang làm điều gì đó ngớ ngẩn ... – AJG85

+0

@Msonic Để đơn giản hóa tác vụ. –

Trả lời

6

Nếu bạn không thể thoát khỏi lồng nhau khủng khiếp cho báo cáo sau đó bạn có thể sử dụng các dòng sau:

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] 
    << ' '; 

Một số lưu ý khác trên mã:

Hope this helps.

+0

Đó chính xác là những gì tôi cần! Cảm ơn bạn rất nhiều vì đã giúp đỡ, kiến ​​thức của bạn được đánh giá cao! – Kyle

2

Trước hết, thay đổi các lồng cho-s. Họ trông khủng khiếp, và nếu tôi nói bạn bây giờ là để tạo ra các con số 15 chữ số, bạn sẽ ở vị trí thực sự xấu.

Những gì bạn đang tìm kiếm ở đây là một số loại máy phát hoán vị với modulo 3, như tôi nghĩ về nó ... Vì không có trường hợp đặc biệt nào (như "PQRS" trên điện thoại thực), kết hợp từ 0 đến 3^7.

Sau đó, sử dụng một vòng lặp for để lặp qua chúng. Viết chức năng tùy chỉnh iterator cụ thể là sẽ là khái niệm có lẽ là khó hiểu, vì vậy suy nghĩ về là giống như làm cho tất cả những kết hợp này, như:

// 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; 
    } 
} 

Đó là mã sẽ tạo ra hoán vị của các số trong tri-nary hệ thống;) mà có thể sau đó được sử dụng để chữ đúng ra với

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

Nếu bạn thực sự cần phải sử dụng "cascade" viết vào một tập tin, thay thế vòng lặp bên trong với tất cả 7 khả năng, chẳng hạn như:

/*1.*/ i % 3 
/*2.*/ (i/3) % 3 
/*3.*/ (i/9) % 3 

Và cứ thế ... Nếu tôi nên giải thích chi tiết hơn, hãy bình luận về điều này; Nếu tôi giúp, upvote :) và chúc may mắn với bài tập về nhà.

+0

Đó chắc chắn là một giải pháp thanh lịch và tôi đánh giá cao bạn viết điều đó cho tôi. Nhưng tôi không có nghĩa vụ phải thay đổi mã mẫu tôi đã đưa ra trong đó bao gồm những vòng vô lý – Kyle

+0

Ah, vì vậy các vòng này sẽ ở lại đó. Tôi biết nỗi đau của bạn, tôi cũng đang học và giáo viên có "phương pháp" riêng của họ. Tôi tin rằng tôi đã viết cho bạn cách lặp qua các chữ cái. ('phoneLetters [num] [letter]'). –

+0

Ah vâng tôi thấy điều đó. Bạn có thể giải thích về điều đó cho tôi không? Tôi không thấy làm thế nào tôi có thể thực hiện nó. Tôi sẽ chỉnh sửa bài đăng gốc của mình để bạn có thể thấy phần chính và phần còn lại của các thành viên dữ liệu. – Kyle

0

Giải pháp nếu số điện thoại chỉ có hai chữ số trong khi vẫn làm bạn bối rối.

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); 
    } 
} 

OUTPUT: MW MX MY NW NX NY OW OX Oy

Các vấn đề liên quan