Newsgroup: it.comp.lang.c++
Titolo: errore uscita

PROBLEMA:
L'utente assegna a sel1 o sel2 un valore non presente nel menù si
aziona un messaggio che informa che si ha è inserito un valore non
valido.
L'utente a questo punto decide che vuole continuare e procede con
l'esecuzione del programma.
A questo punto anche assagnando da tastiera il valore 'x' a sel1 o
sel2 il programma non termina.
P E R C H E ' ?
CODICE PROGRAMMA:
/*
MarchinoConverter© 1.5 GPL
*/
#include <iostream.h>
#include <conio.h>
// Prototipi funzione INIZIO
void lunghezza(float si, float anglo);
void temperatura(float si, float anglo);
void peso(float si, float anglo);
void valuta(float lire, float euro);
void errore();
void uscita();
char continuo(char &avanti);
// Prototipi funzione FINE
char sel1, sel2, avanti;
float si, anglo;// si = grandezze del Sistema Internazionale o
comunque usate in ambito Europeo anglo = grandezze del mondo
Anglosassone
float lire, euro;
void main ()
{
 do
 {
	// Inizio del programma.
	cout<<"\nBenvenuti in MarchinoConverter¸ 1.5 GPL
\n_______________________________________________________________________\nSelezionare
il modulo di conversione:\n1. Lunghezza\n2. Temperatura\n3. Peso\n4.
Valuta\nx. Per terminare il programma\n\n";
	cin>>sel1;
	cout<<"\n";
	switch(sel1)
	{
	// Inizio la sequenza di casi possibili
	case '1':
		lunghezza(si, anglo);
		break;
	case '2':
		temperatura(si, anglo);
		break;
	case '3':
		peso(si, anglo);
		break;
	case '4':
		valuta(lire, euro);
		break;
	case 'x':
		uscita();
		break;
	default:
		errore();
		break;
	}
 }
 while(avanti == 's');
}
// Fine della funzione main() del programma MarchinoConverter GPL
//
// Definizione delle funzioni inserite in main()
//
// Definizione di lunghezza()
void lunghezza(float si, float anglo)
{
		cout<<"Digitare:\n a) Per convertire da CENTIMETRI a
POLLICI.\n b) Per convertire da POLLICI a CENTIMETRI.\n c) Per
convertire da METRI a IARDE\n d) Per convertire da IARDE a METRI\n x)
Per terminare il programma.\n";
		cin>>sel2;
		switch(sel2)
		{
			case 'a':
			// inizia caso a
			cout<<"Inserire il valore della distanza in
centimetri: ";
			cin>>si;
			anglo=si*0.3937;
			cout<<" "<< si << " cm corrispondono a " <<
anglo << " in \n\n";
			continuo(avanti);
			break;
			// termina caso a
			case 'b':
			// inizia caso b
			cout<<"Inserire il valore della distanza in
pollici: ";
			cin>>anglo;
			si=anglo/0.3937;
			cout<<" "<< anglo << " in corrispondono a " <<
si << " cm \n\n";
			continuo(avanti);
			break;
			// termina caso b
			case 'c':
			// inizia caso c
			cout<<"Inserire il valore della distanza in
metri: ";
			cin>>si;
			anglo=si*0.9144;
			cout<<" "<< si << " m corrispondono a " <<
anglo << " yd \n\n";
			continuo(avanti);
			break;
			// termina caso c
			case 'd':
			// inizia caso d
			cout<<"Inserire il valore della distanza in
iarde: ";
			cin>>anglo;
			si=anglo/0.9144;
			cout<<" "<< anglo << " yd corrispondono a " <<
si << " m \n\n";
			continuo(avanti);
			break;
			// termina caso d
			case 'x':
			// inizia caso x
			uscita();
			break;
			// termina caso x
			default:
			errore();
			break;
		}
}
// Definizione di temperatura()
void temperatura(float si, float anglo)
{
		cout<<"Digitare:\n a) Per convertire da §C a §F.\n b)
Per convertire da §F a §C.\n x) Per terminare il programma.\n";
		cin>>sel2;
		switch(sel2)
		{
			case 'a':
			// inizia caso a
			cout<<"Inserire il valore della temperatura in
§C: ";
			cin>>si;
			anglo=(si*1.8)+32;
			cout<<" "<< si << " §C corrispondono a " <<
anglo << " §F \n\n";
			continuo(avanti);
			break;
			// termina caso a
			case 'b':
			// inizia caso b
			cout<<"Inserire il valore della temperatura in
§F: ";
			cin>>anglo;
			si=(anglo-32)/1.8;
			cout<<" "<< anglo << " §F corrispondono a " <<
si << " §C \n\n";
			continuo(avanti);
			break;
			// termina caso b
			case 'x':
			// inizia caso x
			uscita();
			break;
			// termina caso x
			default:
			errore();
			break;
		}
}
// Definizione di peso()
void peso(float si, float anglo)
{
		cout<<"Digitare:\n a) Per convertire da GRAMMI a
ONCE.\n b) Per convertire da ONCE a GRAMMI.\n x) Per terminare il
programma.\n";
		cin>>sel2;
		switch(sel2)
		{
			case 'a':
			// inizia caso a
			cout<<"Inserire il valore del peso in grammi:
";
			cin>>si;
			anglo=si/28.35;
			cout<<" "<< si << " g corrispondono a " <<
anglo << " oz \n\n";
			continuo(avanti);
			break;
			// termina caso a
			case 'b':
			// inizia caso b
			cout<<"Inserire il valore del peso in once: ";
			cin>>anglo;
			si=anglo*28.35;
			cout<<" "<< anglo << " oz corrispondono a " <<
si << " g \n\n";
			continuo(avanti);
			break;
			// termina caso b
			case 'x':
			// inizia caso x
			uscita();
			break;
			// termina caso x
			default:
			errore();
			break;
		}
}
// Definizione di valuta()
void valuta(float lire, float euro)
{
	cout<<"Digitare:\n a) Per convertire da LIRE in EURO.\n b) Per
convertire da EURO in LIRE.\n x) Per terminare il programma.\n";
	cin>>sel2;
		switch(sel2)
		{
			case 'a':
			// inizia caso a
			cout<<"Inserire l'ammontare in lire: ";
			cin>>lire;
			euro=lire/1936.27;
			cout<<" "<< lire << " lire corrispondono a "
<< euro << " euro \n\n";
			continuo(avanti);
			break;
			// termina caso a
			case 'b':
			// inizia caso b
			cout<<"Inserire l'ammontare in euro: ";
			cin>>euro;
			lire=euro*1936.27;
			cout<<" "<< euro << " euro corrispondono a "
<< lire << " lire \n\n";
			continuo(avanti);
			break;
			// termina caso b
			case 'x':
			// inizia caso x
			uscita();
			break;
			// termina caso x
			default:
			errore();
			break;
		}
}
// Definizione di errore()
void errore()
{
	cout<<"\a
_____________________________________________________________\n|
|\n|      ATTENZIONE!! Questo programma verra' riavviato,        |\n|
e' stata selezionata un' operazione non valida.
|\n|_____________________________________________________________|\n\n";
	continuo(avanti);
}
// Definizione di uscita()
void uscita()
{
	cout<<"\nGrazie per aver scelto MarchinoConverter 1.4 GPL.
www.macomemai.f2s.com
";
}
// Definizione di continuo()
char continuo(char &avanti)
{
	cout<<"Desideri continuare con un'altra conversione? s / n ";
	cin>>avanti;
	clrscr();
	return avanti;
}

il tuo problema č che fai un loop (nel main) controllando il valore di
"avanti"
ma in uscita ti dimentichi di assegnarli un valore diverso da 's',
quindi fai:
void uscita()
{
    cout<<"\nGrazie per aver scelto MarchinoConverter 1.4 GPL.
www.macomemai.f2s.com
";
    //grd
    avanti = 'n'; //od un altro carattere diverso da 's'
    //end grd
}
e vedrai che il programma terminerą....
non ho controllato tutto il resto del codiche percio' non so dirti se questa
modifica ti porta altri effetti collaterali
(visto che la funzione uscita viene impiegata anche in altre sezioni....non
ho fatto un debug approfondito).
un consiglio: la prossima volta formatta meglio il codice sorgente...
leggere quello che hai mandato č un vero incubo!
--
Cry out your Challenge to HELL !
www.nablasoft.com
                                                   Guardian