Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    ricorsione su array di caratteri

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


    }

  2. #2
    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.

    codice:
    #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

  3. #3
    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

  4. #4

    tutto perfetto

    grazie tante,
    ho visto anche i puntatori...

  5. #5
    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

  6. #6
    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

  7. #7
    grazie,
    non conoscevo l'abbreviazione... per il termine della parola....

    Antonio

  8. #8
    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

  9. #9
    una chicca...
    senti ti posso chiedere un'altra cosetta,
    ho visto il programma che hai fatto per leggere i dati singolarmente dal file...

    codice:
    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

  10. #10
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.