Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Buonasera, come spesso accade, La maggior parte dei programmi richiedono degli input, spesso questi input posso essere dei semplici Si - No, intero positivo minore di 10 o complessi tipo equazioni.
Ho scritto delle funzioni, in teoria generiche, che hanno la funzione di verificare
se il dato immesso sia più o meno lecito
Nel caso di Si-No verificarli è molto semplice. Posto innanzitutto questa funzione (ne ho una per gli interi positivi <10 sulla stessa falsa riga di questa ed un'altra per verificare un range di interi di grandezza variabile (es. 56-9865)
Posto una alla volta per non fare confusione
func.c
Codice sorgente - presumibilmente C/C++
#include <stdio.h>
#include <ctype.h>
/* Verifica che l'immissione da tastiera sia tra 2 possibili caratteri
scelti dal chiamante. I caratteri possono essere minuscoli o MAIUSCOLI.
Es. [S/N]-[s/n] o [Y/N]-[y/n] */
/* Dato un input da tastiera lo esamino carattere per carattere.
Ritengo valido l'input composto SOLO ED ESCLUSIVAMENTE dai caratteri in input
vero e falso. Prendo il primo carattere immesso,
- se NON E' uno dei caratteri validi finisco la funzione con errore
- se LO E' , verifico il 2° .
- se è '\n' vuole dire che è stato immesso solo un carattere ed e' valido
- altrimenti l'input non è valido.
Si lascia al chiamante l'opportunità di ripetere la richiesta del carattere
in caso di esito negativo della 1° */
int selecTF( int vero, int falso, unsigned char *carattere ){
int c = 0; //Inizzializzo per sicurezza
*carattere = '\0'; //Inizzializzo per sicurezza
// prelevo e testo dal buffer il 1° carattere
c = getchar();
if( c == tolower( vero ) || c == toupper( vero )
||
c == tolower( falso ) || c == toupper( falso ) ){
// Lo rendo minuscolo per evitare nella funzione chiamante 2 controlli ulteriori
// NON ESSENZIALE
*carattere =(unsigned char)tolower( c );
// prelevo e testo dal buffer il 2° carattere
c = getchar();
if( (c == '\n') ){
// printf( "VALORE CORRETTO\n" ); //utile o no?
return 0;
}
}
while( (getchar() != '\n') );
//Svuoto il buffer nel caso di richiesta di nuova immissione
return -1;
}
main.c
Codice sorgente - presumibilmente C++
#include <stdio.h>
int selecTF(int ch1, int ch2, unsignedchar*caracter );
int main(int arcv, char*arcg[]){
int value =0;
unsignedchar letter=' ';
printf("IMMETTERE [%c/%c] :", 'S', 'N');
while(selecTF('s', 'n',&letter ))
{
printf("%s\n%s [%c/%c]:",
"IL CARATTERE IMMESSO NON E'CORRETTO",
"IMMETTERE",
'S', 'N');
}
printf("IL carattere scelto e' il: %c\n\n", letter );
return0;
}
Pareri? migliorie? meglio che mi do all'ippica XD??
P.S. (ma sono i commenti che rendono il 1° codice non colorato?)
Ultima modifica effettuata da Mikelius il 11/07/2017 alle 21:16
int esito = chiedi_vero_falso("Ti chiami AldoBaldo?", 's', 'n');
if(1== esito )/* 1: vero (in questo caso, si') */
printf("Ah, ti chiami AldoBaldo... allora sei figo!\n\n");
elseprintf("Lo sapevo, AldoBaldo e' piu' figo di te.\n\n");
printf("Premi \"invio\" per lasciare il programma...\n\n");
getchar();
return0;
}
Ultima modifica effettuata da AldoBaldo il 11/07/2017 alle 23:05
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
int esito = chiedi_vero_falso("Ti chiami AldoBaldo?", 's', 'n');
if(1== esito )/* 1: vero (in questo caso, si') */
printf("Ah, ti chiami AldoBaldo... allora sei figo!\n\n");
elseprintf("Lo sapevo, AldoBaldo e' piu' figo di te.\n\n");
printf("Premi \"invio\" per lasciare il programma...\n\n");
getchar();
return0;
}
Ho provato il codice. Riscontro un funzionamento che per me è un bug.. se immetto la stringa tipo
"sn" o "n5464??" accetta lo stesso l'input e va avanti
Non è un malfunzionamento, è una caratteristica. L'unica cosa che verifico è il primo carattere dell'input. Secondo te sarebbe meglio inibire le immissioni che comprendano altri caratteri aggiuntivi rispetto a quello richiesto? In effetti la tua soluzione lo fa. Sai che ti dico? Accetto la tua correzione. Tra un po' mando la versione modificata.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
Fatto! La differenza rispetto a prima sta nelle righe dalla 32 alla 34.
Ora se è stato immesso più di un carattere la funzione non accetta l'input e replica la richiesta di immissione.
Giè che c'ero ho anche fatto in modo che nel proporre la richiesta di immissione vengano usati in console gli stessi caratteri passati come parametri, non le loro versioni minuscole. La differenza riguarda solo la visualizzazione, perché poi in effetti vengono accettati come risposta sia il maiuscolo, sia il minuscolo.
Edit: sempre per far l'esagerato, ho previsto anche il caso in cui il parametro testo fosse NULL.
input =getchar();/* svuota stdin e conta i caratteri immessi */
if( 1 != qCar ) esito =-1;/* accetta input con un solo carattere */
}while(-1 == esito );
return esito;
}
Ultima modifica effettuata da AldoBaldo il 12/07/2017 alle 7:37
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
Non è un malfunzionamento, è una caratteristica. L'unica cosa che verifico è il primo carattere dell'input. Secondo te sarebbe meglio inibire le immissioni che comprendano altri caratteri aggiuntivi rispetto a quello richiesto? In effetti la tua soluzione lo fa. Sai che ti dico? Accetto la tua correzione. Tra un po' mando la versione modificata.
Non era proprio una correzione, ma io non vorrei svegliarmi la notte ,e chiedermi se l'utente che avesse digitato "sn" era strabico o meno. Non è impensabile che sia la 's' ad essere di troppo XD.
Per quanto riguarda "testo". Io l'ho messo fuori la funzione per renderla minimale.
Chiedo a tutti, come buon stile e più opportuno dentro o fuori la funzione?
esito = ((input!=tolower( vero ))&&(input!=tolower( falso ))) ? -1 : (input==tolower( vero )?1:0);
Cosi si hanno 2 variabili in meno ma una chiamata a tolower in più?
meglio usare le 2 variabili (utilizzare più memoria) o una chiamata a tolower? (aumentare il tempo di calcolo).
Ultima modifica effettuata da Mikelius il 12/07/2017 alle 9:03
Il testo della richiesta l'ho inserito tra i parametri perché in quel modo se l'utente immette qualcosa di inaccettabile è possibile ripetere la richiesta completa e, in un certo senso, "sigillare" il procedimento assicurandosi che il valore ritornato sia per forza o 0 o 1 (eliminando così la necessità di ingombranti verifiche "esterne").
Sulla questione della variabile in più o in meno e del calo di prestazioni per la chiamata a tolower() in più direi che nel contesto di una funzione del genere è irrilevante. A me, lì per lì, è sembrato più chiaro avere due variabili distinte vMin e fMin, però non credo sia una cosa così importante.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
Il testo della richiesta l'ho inserito tra i parametri perché in quel modo se l'utente immette qualcosa di inaccettabile è possibile ripetere la richiesta completa e, in un certo senso, "sigillare" il procedimento assicurandosi che il valore ritornato sia per forza o 0 o 1 (eliminando così la necessità di ingombranti verifiche "esterne").
Sulla questione della variabile in più o in meno e del calo di prestazioni per la chiamata a tolower() in più direi che nel contesto di una funzione del genere è irrilevante. A me, lì per lì, è sembrato più chiaro avere due variabili distinte vMin e fMin, però non credo sia una cosa così importante.
Dipende da ciò che si vuole fare, nella mia si lascia libero il chiamante di decidere (ad esempio, si voglia concedere solo 3 tentativi di immissione)
Per il resto... in questo caso, con le attuali risorse dei moderni pc, non credo cambi molto. in ambienti con poca memoria meglio la chiamata in più, in ambienti per alte prestazioni meglio le 2 variabili.
La mia era una domanda generica: Essendo liberi, e con risorse illimitate, cosa sarebbe più opportuno? risparmio di memoria o alte prestazioni?
Ah, malefico! Mi butti lì un altro grattacapo (il limite alla quantità dei tentativi)? Roba per un ulteriore parametro, però rimarrebbe la necessità di verificare se l'immissione è stata un'immissione valida o un annullamento e, per come mi piace far le cose, meno controlli mi trovo a dover fare nelle parti dove si realizza la "ciccia" del programma e più son contento. Ma, sia ben chiaro, è solo una questione di gusti.
La differenza in prestazioni quando si interagisce passo passo con chi sta tra schermo e tastiera penso si misuri in nanosecondi (ammesso che sia abbastanza grande da poterla misurare). Per conto mio la considero irrilevante.
Ora te lo do io un grattacapo: e se l'utente volesse annullare per evitare la scelta? Ad esempio si potrebbe proporre un "Sei un campione del ciclismo? (s/n/a)" dove "a" potrebbe stare per "annulla". In caso d'annullamento la funzione potrebbe restituire -1, per cui 1:vero, 0:falso, -1:annullamento. Ma son certo che a pensarci e ripensarci ci viene in mente ancora qualche altro dettaglio.
Ultima modifica effettuata da AldoBaldo il 12/07/2017 alle 11:25
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.