Newsgroup: it.comp.lang.c++
Titolo: Mi controllate questo semplice programma?

Salve,
stavo provando un programma semplice per prendere un pò di
dimestichezza con i cicli..praticamente (se così si può chiamare :))
) unseriti tre numeri da tastiera ne calcola il maggiore, lo scrive
sul video, e infine il maggiore lo moltiplica per una variabile fissa
di valore 3. Una volta compilato e corretti qualche errore qua e
là...credevo funzionasse...invece no! Praticamente non sempre fa tutto
questo...in alcuni casi si comporta bene...ma in altri! O scrive
correttamente il numero maggiore ma poi il risultato della
moltplicazione lo da sbagliato, oppure non scrive quale valore è il
maggiore, e moltiplica l' ultimo numero (il valore di C) per la
variabile fissa. Si curamente ho sbagliato qualcosa nel ciclo for...ma
noin riesco a capire dove...se qualcuno mi da una mano ne sarei molto
contento...
Ho qui di seguiro incollato il sogrente del programma, se qualcuno
gentilmente gli da uno sguardo...Poi vorrei fare anche un altra
domanda. Finito il programma mi appare la classica scritta" Press any
key to contunue" ma se io volessi che invece che finire ricominciasse
da capo...o meglio, richieda di nuovo il valore di A che devo usare
goto? Se si come si usa questo comando?
Grazie eh...
//Calcola il numero maggiore tra A, B e C
//e lo moltiplica per 3.
#include <iostream.h>
const int NumeroFisso = 3;
class Numeri {
public:
	int A;
	int B;
	int C;
};
void main() {
	Numeri NumeriInseriti;
	int Risultato;
	int NumeroMaggiore;
	//Assegna un valore ad A, B e C.
	cout << "Quanto vale A?\n";
	cin >> NumeriInseriti.A;
	cout << "Quanto vale B?\n";
	cin >> NumeriInseriti.B;
	cout << "Quanto vale C?\n";
	cin >> NumeriInseriti.C;
	//Calcola il maggiore tra A, B e C
	//scrivendo quale è il maggiore.
	if (NumeriInseriti.A > NumeriInseriti.B) {
		if (NumeriInseriti.B > NumeriInseriti.C)
			cout << "Il numero maggiore e' " <<
NumeriInseriti.A << "\n";
			NumeroMaggiore = NumeriInseriti.A;
	}
	else if (NumeriInseriti.B > NumeriInseriti.C) {
			cout << "Il numero maggiore e' " <<
NumeriInseriti.B << "\n";
			NumeroMaggiore = NumeriInseriti.B;
	}
		else
			cout << "Il numero maggiore e' " <<
NumeriInseriti.C << "\n";
			NumeroMaggiore = NumeriInseriti.C;
	//Determina il risultato moltiplicando il numero maggiore per
3.
	Risultato = NumeroMaggiore * NumeroFisso;
	//Visualizza il risultato.
	cout <<"Il risultato finale vale " << Risultato << endl;
}

 goto?
No. Basta che racchiudi tutto in un ciclo while da cui si esce solo se
si verifica una condizione di tua scelta (tipo il classico 0 per
uscire).
EMG

 goto? Se si come si usa questo comando?
Finito il programma, il programma termina e basta senza scrivere
niente. La scritta probabilmente viene da qualche IDE, e puo'
apparire o no a seconda di come viene lanciato il programma.
Se vuoi che ogni volta il programma ricominci da capo, basta un
ciclo infinito:
  while (true) {
    // roba da ripetere
  }
	Mauro

Premesso che non vedo cicli for, l'errore e` sicuramente in tutti
quegli if annidati. Ti sei complicato troppo la vita, per trovare 
l'elemento di valore maggiore tra piu` possibili candidati il modo
migliore e` inizializzare una variabile Max al primo valore della lista
quindi confronti Max con il secondo valore e se questo e` piu` grande
aggiorni Max. Quindi ripeti la cosa con gli altri numeri uno alla volta.
In pratica avresti dovuto scrivere qualcosa tipo:
int Max = A;
if (Max < B) Max = B;
if (Max < C) Max = C;
/* ... */
Ovviamente per sapere a quale valore corrisponde Max hai bisogno di
tracciare i possibili assegnamenti... ad esempio:
int Max = A;
char Index = 'A';
if (Max < B) { 
  Max = B;
  Index = 'B';
}
if (Max < C) {
  Max = C;
  Index = 'C';
}
/* ... */
Se poi vuoi fare qualcosa di piu` elegante, anzicche` usare 3
variabili diverse puoi provare usando un array e a cercare il
valore massimo (o minimo) con un ciclo for per iterare sui vari elementi
dell'array. Ovviamente il modo di calcolare Max e` lo stesso
di sopra.
Infine evita di usare le classi per ora, concentrati sui costrutti di
base e non cercare di utilizzare tutto ogni volta.
Paolo
-----------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------------------------

stavo provando un programma semplice per prendere un pň di
[omissis]
Per trovare il massimo tra due numeri č utile (nonchč piů efficiente)
l'istruzione condizionale.
Nel tuo esempio
int A, B, C, max;
max = (A>B)?A:B;
max = (max>C)?max:C;
_____________________________________________________
Francesco Trotta
http://space.tin.it/computer/ftrotta
elimina "x_" dal mio indirizzo per le risposte

Oh, grazie!!
ho corretto il mio programmino insulso e ora funziona :)) Si si, ho
sbagliato a scrivere..non c'è nessun for ma solo un paio di if, non mi
assalite subito :)) Però una cosa...ma perchè durante la compilazione
non ha dato, non dico errori, ma almeno un warning per avvertirmi che
quello che avevo scritto era sbagliato? Mentre provavo, avevo scritto
una cosa su una stessa riga, quendo l' ho ricompilato mi ha segnato un
warning...almeno li si era accorto che qualcosa poteva non andare e
invece perchè questa volta che mancavano delle parentesi non mi ha
scritto niente? In fondo il programma era sbagliato, non funzionava
mica. Un altra cosa, vi rifaccio la domanda visto che non avuto
risposta...ma per far ricominciare il programma che devo fare? Avevo
pensato di mettere un altra condizione dopo aver scritto il risultato
sullo schermo...una cosa del tipo:
			Vuoi uscire?
                                            /       \
                      __________/	  \
	        I			    \
	       SI			    NO
                     Y			      Y
scrive "Ciao ciao" e	         ritorna all' inizio del
finisce il programma.                 programma e rivaluta tutte
			         le condizioni inziali, quindi
			         chiede nuovamente che valore
			         dare ad A etc. etc.
Se uno dice SI vabbè, il programma finise e se ne và...ma se uno dice
NO? Se si volesse ricominciare come torno nuovamente all' inizio? Il
comando "goto" non permette di fare questo? Di saltare da un punto
all' altro del programma...il mio libro dice però che in C++ ha una
pessima fama e sconsiglia di usarlo... infatti non mette manco la
sintassi... mi dite come si fa per favore?

sintassi... mi dite come si fa per favore?
racchiudi tutte le istruzioni all'interno di un comando
do-while:
into main() {
  do {
    /* ... */
  } while (test);
  return 0;
}
Ovviamente test sara` una condizione che verifica se l'utente ha
scritto si oppure no!


manco la sintassi... mi dite come si fa per favore?
Puoi racchiudere le istruzioni dentro un do-while(ripetizione con
controllo in coda)oppure dentro uno while(ripetizione con controllo in
testa).
do
{
/*Blocco di istruzioni*/
}
while(fine)
oppure...
while(fine)
{
/*Blocco di istruzioni*/
}
La variabile fine dovrebbe essere bool,e dovrebbe essere eguagliata
a true quando si é deciso di uscire dal programma.
Evita di utilizzare 'goto',perché quello é uno stile di programmazione
veramente selvaggia,sconsigliato da qualsiasi manuale.
Il Ghenio

 risposta...ma per far ricominciare il programma che devo fare?
Veramente di risposte ne hai già avute due. Credo che bastino.
EMG