Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
Postato originariamente da AldoBaldo:
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. |
Ecco la soluzione (ho preso in prestito il tolower( getchar() ) )
func.c
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <ctype.h> int selecTFA( int vero, int falso, unsigned char *carattere ){ int c = 0; *carattere = '\0'; // prelevo e testo dal buffer il 1° carattere c = tolower( getchar()); if( c == tolower( vero ) || c == tolower( falso ) || c == 'a' ){ *carattere =(unsigned char)tolower( c ); // prelevo e testo dal buffer il 2° carattere c = getchar(); if( (c == '\n') ){ if( *carattere == 'a' ) return -1; return 1; } } while( (getchar() != '\n') ); //Svuoto il buffer nel caso di richiesta di nuova immissione return 0; }
|
main.c
Codice sorgente - presumibilmente C++ |
#include <stdio.h> int selecTFA( int ch1, int ch2, unsigned char *caracter ); int main( int arcv, char *arcg[] ){ int annulla = 0; unsigned char letter=' ' ; printf( "IMMETTERE [%c/%c] [A per annullare] :", 'S', 'N' ); while(!(annulla = selecTFA( 's', 'n', &letter ))){ // mi da warming C4706 VS2017, è cattiva programmazione? ho attivato gli avvisi /W4 printf( "%s\n%s [%c/%c]:", "IL CARATTERE IMMESSO NON E'CORRETTO", "IMMETTERE", 'S', 'N' ); } if( annulla == -1 ) printf( "Hai annullato\n" ); else printf( "IL carattere scelto e' il: %c\n\n", letter ); return 0; }
|
Volendo si potrebbero impostare 256 scelte diverse.... Ultima modifica effettuata da Mikelius il 12/07/2017 alle 15:13 |
|
Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
Anzi, molto più semplicemente si potrebbe demandare tutto al chiamante e verificare solamente che sia stato immesso 1 solo valore
func.c
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <ctype.h> unsigned char selecC(void){ unsigned char carattere ='\0' ; //Inizzializzo per sicurezza carattere = (unsigned char)getchar() ; if( ( getchar() == '\n') ){ return carattere; } while( (getchar() != '\n') ); return '\0'; }
|
main.c
Codice sorgente - presumibilmente C++ |
#include <stdio.h> unsigned char selecC( void ); int main( int arcv, char *arcg[] ){ unsigned char letter=' ' ; printf( "IMMETTERE [%c/%c] [A per annullare] :", 'S', 'N' ); letter = selecC(); switch( letter){ case 'a': case 'A': printf( "SCELTO ANNULLA\n" ); break; case 'S': case 's': printf( "SCELTO SI\n" ); break; case 'N': case 'n': printf( "SCELTO NO\n" ); break; default: printf( "SCELTA NON VALIDA\n" ); } return 0; }
|
Ultima modifica effettuata da Mikelius il 12/07/2017 alle 16:46 |
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Le soluzioni sono veramente tante! Alla fine della fiera basta che siano funzionali e non generino errori o inutile confusione (dove utile o inutile dipende da quel che ti serve nel caso specifico).
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. |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Fatti passare tutto da console se possibile. È la soluzione migliore per chi usa la console o per un possibile wrapper grafico alla tua app
|
|
Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
Postato originariamente da AldoBaldo:
Le soluzioni sono veramente tante! Alla fine della fiera basta che siano funzionali e non generino errori o inutile confusione (dove utile o inutile dipende da quel che ti serve nel caso specifico). |
Si concordo.
Qui ho chiesto se questa mia soluzione potesse avere dei contro o bug che a me sfuggono.
Vedendo la tua, ho avuto degli spunti.
Si potrebbe costruire una piccolissima libreria con alcune funzioni per adempiere alle scelte.
Postato originariamente da TheDarkJuster:
Fatti passare tutto da console se possibile. È la soluzione migliore per chi usa la console o per un possibile wrapper grafico alla tua app |
In che senso mi devo far passare tutto da console? |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Postato originariamente da Mikelius:
Postato originariamente da AldoBaldo:
Le soluzioni sono veramente tante! Alla fine della fiera basta che siano funzionali e non generino errori o inutile confusione (dove utile o inutile dipende da quel che ti serve nel caso specifico). |
Si concordo.
Qui ho chiesto se questa mia soluzione potesse avere dei contro o bug che a me sfuggono.
Vedendo la tua, ho avuto degli spunti.
Si potrebbe costruire una piccolissima libreria con alcune funzioni per adempiere alle scelte.
Postato originariamente da TheDarkJuster:
Fatti passare tutto da console se possibile. È la soluzione migliore per chi usa la console o per un possibile wrapper grafico alla tua app |
In che senso mi devo far passare tutto da console? |
programma arg1 arg2 arg3 |
|
Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
Postato originariamente da TheDarkJuster:
programma arg1 arg2 arg3 |
capito. Si, cercherò di fare come consigli.
In alcuni libri avevo letto che sarebbe più opportuto passare come argomenti delle variabili per contenere i risultati delle funzioni, evitando ti ritornarli con un return. Tu che mi consigli? Ultima modifica effettuata da Mikelius il 13/07/2017 alle 21:39 |
|
lumo (Member)
Expert
Messaggi: 449
Iscritto: 18/04/2010
|
Postato originariamente da Mikelius:
Postato originariamente da TheDarkJuster:
programma arg1 arg2 arg3 |
capito. Si, cercherò di fare come consigli.
In alcuni libri avevo letto che sarebbe più opportuto passare come argomenti delle variabili per contenere i risultati delle funzioni, evitando ti ritornarli con un return. Tu che mi consigli? |
È un problema del C che non permette di ritornare più valori contemporaneamente.
Dove ha senso si usa una struttura allocata dinamicamente e si ritorna quella, altrimenti si aggiungono degli argomenti alla funzione per poter salvare più risultati. Ovviamente devono essere puntatori e vanno dereferenziati, quindi c'è in più il rischio che per sbaglio venga passato NULL.
In aggiunta questo di solito si ritorna anche qualcosa tipo un bool o una enum che indica il successo dell'operazione.
|
|