2012-04-17 2 views
6

Ho alcuni compiti a casa che stavo percorrendo fino a quando sono arrivato a questo ultimo passaggio e ora sono perplesso, apprezzerei davvero un po 'di aiuto.Guida del generatore di parole telefoniche C++

La premessa del progetto è quella di creare un file di parole possibili con un numero di telefono. L'utente ha il compito di inserire un numero con il formato '### - ####'. Il codice quindi estrae il trattino e invia il numero di telefono al metodo wordGenerator. So che tutto funziona fino a questo punto. Quando arriva il momento di produrre le diverse possibilità di parole è dove sto avendo il mio problema. Ecco ciò che il mio metodo assomiglia:

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

Purtroppo mi è stato dato uno scheletro di codice e ha detto di riempire gli spazi vuoti per completare l'assegnazione. Ovunque dove i commenti sono bloccati (/ * * /) è dove devo compilare il codice.

Non sono sicuro di cosa devo fare per produrre il formato corretto delle parole possibili. Ho provato a cercare su google, ma tutti i risultati che ho trovato utilizzano una dichiarazione switch molto più semplice (secondo me) per ottenere questo risultato e sono vincolato al modello :(

Tutto l'aiuto è apprezzato, anche una spinta nella parte destra direzione

Edit:.. ho solo pensato di un'altra cosa che mi sento che se qualcuno potrebbe anche aiutarmi a capire come iterare attraverso i personaggi di phoneLetters [] individualmente invece di un blocco, che sarebbe un passo significativo avanti Esempio: quando si legge il numero "2" di un numero di telefono invece di stampare "ABC", stampare "A" per tutte le combinazioni possibili, quindi passare a "B"

Edit: Ecco il mio main():

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

si potrebbe provare a cambiare l'array phoneLetters a una matrice bidimensionale di char di, allora sarà facile per voi di scorrere ogni lettera –

+5

7 nidificati per loops di solito è un buon segno che stai facendo qualcosa di sciocco ... – AJG85

+0

@Msonic Per semplificare il compito. –

risposta

6

Se non può sbarazzarsi del nidificato orribile per le dichiarazioni allora si può utilizzare la seguente riga:

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

Alcune altre note sul codice:

Spero che questo aiuti.

+0

Questo è esattamente ciò di cui avevo bisogno! Grazie mille per l'aiuto, la tua conoscenza è molto apprezzata! – Kyle

2

Prima di tutto, cambiare questi annidati per-s. Sembrano terribili, e se dicessi che devi generare numeri a 15 cifre, ti troveremmo in una posizione davvero brutta.

Quello che stai guardando è una sorta di generatore di permutazioni con modulo 3, come mi piacerebbe pensare ... Poiché non ci sono casi speciali (come "PQRS" su telefoni reali), basta numerare tutti i possibili combinazioni da 0 a 3^7.

Quindi, utilizzare un ciclo for per iterare attraverso di essi. Scrivendo la funzione iteratore personalizzato cioè sarebbe concetto probabilmente difficile da capire, in modo da pensare è proprio come fare tutte queste combinazioni, come:

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

Questo codice genererà permutazioni di numeri in tri-nario sistema;) che possono poi essere utilizzata per inviare le lettere giuste con

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

Se davvero bisogno di usare "a cascata" la scrittura in un file, sostituire ciclo interno con tutti i 7 possibilità, come ad esempio:

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

E così via ... Se dovessi spiegare qualcosa in modo più dettagliato, commenta questo; Se ho aiutato, upvote :) e buona fortuna con i compiti.

+0

È sicuramente una soluzione elegante e apprezzo che tu me lo abbia scritto. Ma non dovrei cambiare il codice template che mi è stato dato, inclusi quelli ridicoli loop – Kyle

+0

Ah, quindi questi loop rimarranno lì. Conosco il tuo dolore, sto studiando anche io e gli insegnanti hanno i loro "metodi". Credo di averti già scritto su come iterare attraverso le lettere, però. ('PhoneLetters [num] [lettera]'). –

+0

Ah sì, lo vedo. Potresti approfondire questo per me, per favore? Non vedo come posso implementarlo. Modificherò il mio post originale in modo da poter vedere il mio principale e il resto dei membri dei dati. – Kyle

0

Soluzione se i numeri di telefono avevano solo due cifre mentre si osservava il modello.

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

USCITA: MW MX MY NW NX NY OW OX OY