Newsgroup: it.comp.lang.c++
Titolo: Codice da nubbio

Ciao tutti,
sono alle prime armi nella programmazione in c++, ho preso un esempio 
del mio libro aggiungendo e levando porzioni di codice ho fatto delle 
strane scoperte che non riesco a capire. Mi scuso per la facilità del codice
# include <iostream>
using namespace std;
void remove(char cat){
     for (char c = 'X';c < cat; c++)
         cout << ""; // <-----1°
     if (cat <='Z'){
         cout << "Cat " << cat << endl; <------2°
	remove(cat + 1); // <------2°
     }else
         cout << "boom";
}
int main(){
     int a;
     remove('X');
     cin >> a;
}
1° Se elimino questa riga:
    cout << "";
    il programma non scrive nulla nella shell. Perché?
2° cout << "Cat " << cat << endl; <------2°
    remove(cat + 1); // <------2°
In questa maniera funziona correttamente come output scrive:
Cat X
Cat Y
Cat Z
Boom
Ma se scrivo
    remove(cat + 1); // <------2°
    cout << "Cat " << cat << endl; <------2°
Come output mi scrive
BoomCat Z
Cat Y
CAt X
Proprio non riesco a capire come mai questa differenza di funzionamento.
Ciao
Lele

 funzionamento
E' giustissimo. La ricorsione nel primo caso stampa il carattere corrente e 
dice alla funzione di stampare il carattere successivo in ordine alfabetico.
Nel secondo caso dici di stampare il carattere successivo in ordine 
alfabetico e poi di visualizzare quello corrente. Quindi nel primo caso le 
chiamate sono:
main->remove('X')
remove('X')->stampa 'X'
remove('X')->remove('Y')
remove('Y')->stampa 'Y'
remove('Y')->remove('Z')
remove('Z')->stampa 'Z'
remove('Z')->remove('[')
remove('[')->stampa "Boom"
nel secondo:
main->remove('X')
remove('X')->remove('Y')
remove('Y')->remove('Z')
remove('Z')->remove('[')
remove('[')->stampa "Boom"
remove('Z')->stampa 'Z'
remove('Y')->stampa 'Y'
remove('X')->stampa 'X'
e come vedi viene tutto ribaltato.
-- 
Costantino Grana 

    il programma non scrive nulla nella shell. Perché?
Perche' il resto della funzione, cioe' l'istruzione "if", diventa il 
corpo dell'istruzione "for".
La funzione viene chiamata con il parametro cat='X', e l'istruzione
"for (char c = 'X';c < cat; c++)" prima assegna a "c" proprio "X", e poi 
esegue il corpo del ciclo solo se "X" e' minore di "X". La condizione e' 
falsa, e quindi il corpo del ciclo non viene mai eseguito.
 >     cin >> a;
Un'istruzione di input in fondo al programma e' inutile.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

 Un'istruzione di input in fondo al programma e' inutile.
La utilizzo solo per far rimanere la shell aperta, altrimenti finita 
l'esecuzione si chiude subito e non ho il tempo di leggere il risultati.
Ho provato a scrivere return 0 ma non è cambiato nulla.
Ciao e grazie
Lele

 alfabetico e poi di visualizzare quello corrente. 
quindi mi stai dicendo che
    remove(cat + 1); // <------2°
    cout << "Cat " << cat << endl; <------2°
il cat all'interno di Remove "remove(cat + 1)" lavora in maniera 
indipendente dal cat che viene stampato "cout << "Cat " << cat << endl"?
Ciao
Lele

 
Perché?

Freser ha scritto:

Perche' il dato inserito dall'utente non verra' mai utilizzato.
Se un programma manda dell'output sulla console che deve essere letto 
dopo la terminazione del programma, allora tale programma e' pensato per 
essere lanciato dalla console.


 
Non capisco cosa c'entri l'output del programma. Io contestavo la tua 
affermazione "Un'istruzione di input in fondo al programma e' inutile"

 endl"? Ciao
No. E' esattamente lo stesso, perň tu stai usando la ricorsione. Se da 
remove chiami remove, prima che venga eseguita la linea "cout <<..." viene 
eseguita di nuovo la funzione remove con un altro parametro e cosě via fino 
a che non chiami la funzione remove con cat>Z'.
Ciao!
-- 
Costantino Grana 

Ciao
ho capito ti ringrazio della disponibilità
Ciao
Lele