|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Un mio semplice programma: come miglioralo?
Sto scrivendo un semplice programma di cui vi inserirò il codice.
Nella versione non completa attuale e funzionante ho cercato di inserire ciò che ho sino ad ora imparato, cioè poco: funzioni e vettori. Il mio scopo è stato quello di cercare di scrivere più funzioni possibile, versatili per scopi disparati, adattabili e semplici. Il main doveva essere poco più di una sequenza di chiamate a funzione. C'è sicuramente un bug comune che andrebbe risolto con una funzione ad hoc, ma che non sono in grado di trovare e di scrivere: il menu del mio programma è strutturato in modo che la scelta sia sempre numerica. Nel momento in cui inserisco un solo carattere letterale va in loop, e ciò non è ovviamente ammissibile. Due cose che non mi piacciono: 1) l'interfaccia delle chiamate, forse un po' complicate da gestire.. qualche consiglio in proposito? 2) Il primo elemento del vettore ha indice 0. Vorrei che avesse indice 1. Ho qualche dubbio su come fare. Vorrei un vostro parere sull'operato, sino a questo punto. Quando imparerò liste e strutture lo potenzierò. N.B. Intanto è solo un "prototipo" con il vettore già riempito, per simulare la situazione.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. Ultima modifica di zanardi84 : 18-10-2010 alle 15:12. |
|
|
|
|
|
#2 |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21833
|
per risolvere il loop
Codice:
int inserimento (string messaggio1, string messaggio2, int estremo_inferiore, int estremo_superiore)
{
int dato;
char cdato
cout << messaggio1<<endl;
cout <<endl;
cout << messaggio2<<endl;
cin >>cdato;
dato=atoi(cdato)
if (dato==0)&&(cdato!='0')
cout<<"errore";
else{
while (dato < estremo_inferiore || dato > estremo_superiore)
{
cout << "Errore! Il valore non deve essere inferiore di " <<estremo_inferiore<< " e maggiore di " <<estremo_superiore<< "! Ridigitare"<<endl;
cin >> dato;
}
}
return dato;
}
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Quote:
71 invalid conversion from `char' to `const char*' 71 initializing argument 1 of `int atoi(const char*)' 73 expected identifier before '(' token 73 expected `;' before '(' token
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
|
#4 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21833
|
Quote:
(cmq per l'esattezza manca il ; nella dichiarazione di cdato) i loop li hai quando inserisci un carattere al posto di un intero la soluzione è acquisire un carattere e dopo trasformarlo in un intero mediante la funzione atoi il problema è che atoi restituisce 0 se il dato inserito non è un numero quindi se vuoi usare anche lo 0 nel menu devi controllare che il valore inserito sia effettivamente 0 l'if te l'ho messo li a caso devi integrare il controllo nel tuo codice
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Quote:
Inserisco 11 -> restituisce 11. Inserisco A -> restituisce 0. Inserisco 123a -> restituisce 123 ignorando la a. Inserisco "nel mezzo del cammin di nostra vista..." -> restituisce 0. Inserisco A4 -> restituisce 0. e così via. Buon funzionamento, ma voglio prevedere l'uso dello 0 per qualche ragione. Come posso fare?
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
|
#6 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21833
|
Quote:
per controllare lo 0 devi controllare quando atoi restituisce 0 se il carattere inserito è effettivamente 0
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Non posso fare il controllo diretto perchè dato è un intero e cdato è una stringa. Devo trovare un modo alternativo per fare il confronto, ma al momento non mi viene in mente nulla.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. Ultima modifica di zanardi84 : 19-10-2010 alle 09:58. |
|
|
|
|
|
#8 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21833
|
Quote:
cdato è un carattere non una stringa se ti ho detto di guardare l'if che ti ho scritto appositamente io ci sarà un motivo no? if (dato==0)&&(cdato!='0') cout<<"errore";
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Quote:
Se io quell'if lo inserisco nel compilatore, l'unico errore che restituisce è quello di compilazione perchè non può confrontare un char come cdato con un int come dato.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. Ultima modifica di zanardi84 : 19-10-2010 alle 16:17. |
|
|
|
|
|
|
#10 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21833
|
Quote:
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Quote:
![]() da cui non so uscire al momento perchè sto cercando di imparare. Qualche idea?
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
|
#12 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21833
|
Quote:
if ((dato==0)&&(cdato!='0'))
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Quote:
L'errore è sempre alla riga dell'atoi.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
|
#14 |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21833
|
allora il problema non è l'if
comunque rileggendo l'errore pare che la tua atoi legga solo le stringhe e non i caratteri sostituisci cdato con una stringa il cin con un cin.getline ecc ecc ma comunque sappi che quel codice non ha nessuna valenza pratica è fondamentalmente sbagliato a che scopo dare estremo inferiore e superiore per comunicare solo due messaggi? dovresti sistemarlo almeno con una matrice di caratteri in grado di creare un menu ndimensionale
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Quote:
Ho trovato una funzione generica già pronta (l'avevo preparata per un altro programma semplice) e l'ho riutilizzata col minimo delle modiiche (cioè ho aggiunto un parametro string in più), ma potrei potenziarla aggiungendole qualche if (o un costrutto switch) per farle fare altre operazioni come chiamare altre funzioni alla pressione di un tasto, ma l'inferfaccia sarebbe sempre quella, con gli estremi numerici fuori dai quali avrei la non accettabilità. Ovviamente conosco il limite del controllo, cioè se metto un letterale al posto di un numero mi crasha tutto. Torniamo pertanto alla questione principale! Voglio che mi prenda, per il mio scopo, solo numeri e non caratteri letterali o "grafici".
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2285
|
ad atoi devi passargli l'indirizzo del char
dato=atoi(&cdato); comunque il while è errato, non ripete il controllo numerico
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Quote:
Se io digito in input per esempio 23er45, vorrei che mi dicesse che è un dato sbagliato. Ho provato a implementare usando la stringa di caratteri da convertire in intero, così Codice:
int i; char input[256]; cout << "Inserire un numero: "; cin >> input; i = atoi(input); if((i==0) && (*input!='0')) //se il dato inserito è cout << "Dato non accettato"<<endl; else if ((i==0) && (*input='0')) cout << "inserito lo 0: "<<i<<endl; else cout << "dato inserito: "<<i; Cioè 23er45 per lui è 23, mentre vorrei che mi dicesse che è errore. Lavora a dovere se scrivo i primi versi della Divina Commedia (segnala errore) o se gli digito un numero, per esempio 23 è proprio 23 (e se gli faccio calcolare il doppio viene 46). Ok anche se gli metto 000000000002, mi tronca gli zeri. Cosa mi suggerite per risolvere?
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
|
#18 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21833
|
Quote:
se è un numero da 0-9 la stringa deve essere 1 carattere se è tra 10-99 due caratteri ecc ecc
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Questa è un'ottima idea!!!!
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Quote:
Poi continuerò a sviluppare il programma aggiungendo sempre più cose come per esempio una bella gestione delle prenotazioni (adesso è molto grezza e minimale), file, sotituisco il vettore con una bella lista (e all'interfaccia potrebbe cambiare solo il parametro del vettore sostituendolo con uno che identifichi la lista e sostituendo la ricerca vettore con quella della lista) e chi più ne ha più ne metta!
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. Ultima modifica di zanardi84 : 21-10-2010 alle 12:00. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:21.





















