Programma in C, sequenza di caratteri invertiti
Salve ragazzi, scrivo qui perché non riesco a capire il funzionamento di questo programmino.
La consegna è quella di inserire una sequenza di caratteri e di stamparli a video invertiti, inoltre il programma deve stampare anche il numero di caratteri inseriti.
Per quanto riguarda il numero dei caratteri inseriti ho capito in quanto si tratta di un semplice contatore, mentre mi risulta incomprensibile in che modo opera la funzione ricorsiva per invertire i caratteri. Mi manda in crisi quel "n= inverso();" e anche la sua posizione: perché è scritto prima di "printf("%c", c);" e "n = n + 1;"?
Grazie
Ecco il codice:
La consegna è quella di inserire una sequenza di caratteri e di stamparli a video invertiti, inoltre il programma deve stampare anche il numero di caratteri inseriti.
Per quanto riguarda il numero dei caratteri inseriti ho capito in quanto si tratta di un semplice contatore, mentre mi risulta incomprensibile in che modo opera la funzione ricorsiva per invertire i caratteri. Mi manda in crisi quel "n= inverso();" e anche la sua posizione: perché è scritto prima di "printf("%c", c);" e "n = n + 1;"?
Grazie
Ecco il codice:
int inverso() { char c; int n=0; scanf("%c", &c); if (c == '\n') n = 0; else { n = inverso(); printf("%c", c); n = n + 1; } return n; } int main () { char c; int n; printf("Inserisci una sequenza di caratteri (premi INVIO quando hai terminato l'inserimento: \n"); n = inverso(); printf(" %d\n", n); system("PAUSE"); return 0; }
Risposte
Supponi di voler leggere la Ciao da linea di comando. La funzione inverso funziona a questo punto nel modo seguente:
- Entra in inverso() - Legge 'C' - Entra in inverso() - Legge 'i' - Entra in inverso() - Legge 'a' - Entra in inverso() - Legge 'o' - Entra in inverso() - Legge '\n' - Restituisce 0 - n = 0 - Stampa 'o' - Restituisce 1 = n + 1 - n = 1 - Stampa 'a' - Restituisce 2 - n = 2 - Stampa 'i' - Restituisce 3 - n = 3 - Stampa 'C' - Restituisce 4
innanzitutto grazie!
quindi se ho capito bene (correggetemi se sbaglio) in pratica ogni volta che si entra nella funzione ricorsiva viene progressivamente letto il carattere inserito.. man mano che si aprono i record di attivazione vengono quindi letti tutti i caratteri fino a "/n".. a questo punto il programma procede come stabilito assegnando il valore 0 a n e successivamente a ritroso si chiudono i record di attivazione stampando di conseguenza il carattere inizialmente inserito al contrario e incrementando n (dato che queste istruzioni sono state scritte dopo "n=inverso();" e vengono svolte non durante l'apertura del record di attivazione ma durante la chiusura in modo da completare il processo della funzione ricorsiva)
forse ho usato termini poco adatti ma spero di aver capito il funzionamento!!!
e grazie ancora!
quindi se ho capito bene (correggetemi se sbaglio) in pratica ogni volta che si entra nella funzione ricorsiva viene progressivamente letto il carattere inserito.. man mano che si aprono i record di attivazione vengono quindi letti tutti i caratteri fino a "/n".. a questo punto il programma procede come stabilito assegnando il valore 0 a n e successivamente a ritroso si chiudono i record di attivazione stampando di conseguenza il carattere inizialmente inserito al contrario e incrementando n (dato che queste istruzioni sono state scritte dopo "n=inverso();" e vengono svolte non durante l'apertura del record di attivazione ma durante la chiusura in modo da completare il processo della funzione ricorsiva)
forse ho usato termini poco adatti ma spero di aver capito il funzionamento!!!
e grazie ancora!