PDA

Visualizza la versione completa : [C++] ricorsione su array di caratteri


wgd-developer
23-04-2008, 18:08
salve, altro esercizio...
stavolta penso sia un p pi complesso...
la funzione controlla non funge...
aiuti???

/*
Sia dato un array di lunghezza L contenente alcune parole separate
da uno spazio.
Scrivere una funzione che restituisca True se la prima parola
formata dai caratteri iniziali delle restanti parole.
*/

#include <iostream>
#include <cstdlib>

bool controlla(char [], char [], int, int, const int, bool);

using namespace std;
int main(){
const int L=50;
char a[L]="pane pera ago nero elica";
char app[L];
bool verifica=true;
int i=0, j=0;

while(a[i]==' '){
app[i]=a[i];
i++;
}

j=i;
cout<<controlla(a, app, i, j, L, verifica);
system("pause");
}


bool controlla(char a[], char app[], int i, int j, const int L, bool verifica){
if (i>L)
return verifica;
else if (a[i]==' '){
if (a[i+1]==app[j])
return controlla(a, app, i+1, j+1, L, verifica);
else
verifica=false;
}
else
return controlla(a, app, i+1, j, L);


}

mondobimbi
24-04-2008, 09:44
ho guardato il tuo codice e spero di averlo interpretato giustamente. Ci sono molte cose ridondanti e le ho messe a posto, anche se possibile manchino alcuni controlli.



#include <iostream>
#include <cstdlib>

bool controlla(char *, char *);

using namespace std;
int main() {

const int L=50;
char a[L]="pane pera ago nero elica";
char app[L];

bool verifica=true;

int i=0, j=0;

while (a[i] != ' ') {

app[i] = a[i];
i++;

}
app[i] = '\0';
j=i;

cout << "Risultato verifica " << controlla(a, app) << endl;
}


bool controlla(char *a, char *app) {


if (!*app)
return true;

// cerca la prossima parola da analizzare
while (*a != ' ') a++;
while (*a == ' ') a++;

cout << *app << "-" << a << endl;

if (*a==*app)
return controlla(a, ++app);
else
return false;

}

spero ti possa essere utile

mondobimbi
24-04-2008, 10:06
mi rifaccio ad un precedente thread riguardante puntatori e array.

bool controlla(char *, char *);
bool controlla(char [], char []);

sono la stessa cosa ma la prima versione chiarisce meglio che in effetti quello che si passa alla funzione un puntatore, in quanto un nome di array viene trasformato dal compilatore nel puntatore al suo primo elemento.

ciao
sergio

wgd-developer
24-04-2008, 11:12
grazie tante,
ho visto anche i puntatori...

wgd-developer
24-04-2008, 11:19
per non lo capita tanto, a dire il vero...
mi potresti illuminare,
cio perch hai fatto i due while?
e poi perch ++app invece di app+1

dico a livello proprio di progettazione...
come mai hai usato i cicli?
e questo if (!*app)???

grazie ancora

mondobimbi
24-04-2008, 12:13
il primo while trova la prima occorrenza di uno spazio nella stringa, il successivo va avanti finch trova degli spazi (potrebbero essercene pi di uno come separatore tra parole) e quindi si posiziona esattamente in corrispondenza del primo carattere della parola successiva.

++app e (app+1) sono equivalenti in questo caso, puoi usare il secondo se ti pi chiaro.

if (!*app) ..
in app c' la copia della prima parola, se ho raggiunto la sua terminazione (il carattere \0 ), vuol dire che ho finito di esaminarla e se sono arrivato fino a qui che tutte le corrispondenze sono state controllate (altrimenti sarebbe uscito prima con false).
ciao
sergio

wgd-developer
24-04-2008, 12:23
grazie,
non conoscevo l'abbreviazione... per il termine della parola....

Antonio

mondobimbi
24-04-2008, 12:36
non una abbreviazione, una stringa in C termina con il carattere '\0', cio zero. Siccome lo zero per il C corrispondente al falso se deferenzi un carattere e controllo se sia zero (o l'equivalente NULL) puoi controllare se la stringa finita
if (!*app) una forma concisa di
if (*app == NULL)
chi viene dal C preferisce il primo modo anche se potrebbe sembrare di pi difficile comprensione
ciao
sergio

wgd-developer
24-04-2008, 12:41
una chicca...
senti ti posso chiedere un'altra cosetta,
ho visto il programma che hai fatto per leggere i dati singolarmente dal file...




using namespace std;
int main (int argc, const char * argv[]) {

ifstream infile;

infile.open ("prova.txt", ifstream::in);

while (infile.good())
cout << (char) infile.get();

infile.close();

system("pause");

return 0;
}



funziona perfettamente, ma sinceramente non lo ho capito
cio perch dichiari int argc, const char * argv[]
nelle parentesi del main
che significa infile.good()

grazie

mondobimbi
24-04-2008, 14:31
non cambiare argomento all'interno di un thread!
Comunque good() una funzione membro che controlla lo stato di tutti i bit di errore (fail, eof o bad).
argc e argv, il primo il numero di argomenti passati al programma, normalmente vale almeno 1 in quanto il primo argomento il nome file. argv un array di char che ritornano gli argomenti passati. Nello stile unix gli argomenti passati hanno come separatore lo spazio.
ciao
sergio

Loading