PDA

View Full Version : [C/C++] Gestione input tastiera


zanardi84
22-09-2010, 10:22
Salve a tutti,

Mi potreste suggerire un semplice ma efficace algoritmo per gestire l'input da tastiera in un semplice programma console?

Le situazioni per cui vorrei avere una soluzione efficace:

1) scelta tra 1 e 2. Se premo 0 o 3 o una lettera o numero + lettera/simbolo/spazio, messaggio di errore e possibilità di reinserire.

2) scelta s o n. Se premo altro o metto un numero o numero/letterasimbolo + mumero/lettera simbolo, messaggio di errore e possibilità di reinserire.

Grazie.

lukagol
22-09-2010, 10:41
Se il programma lo scrivi in c non è per niente complicato:

1)fai un ciclo do-while però hai bisogno di specificare qual'è il tasto per uscire(ad es io uso il 9):

int letto;

do{
printf("Inserisci 1 per:....\n2 per:.....\n9 per uscire");
scanf("%d",&letto);
switch (letto){
case 1:
cosa deve fare.....;
break;
case 2:
cosa deve fare.....;
break;
case 9:
break;
default:
printf("Errore!!!\n\n");
break;
}
}while(letto!=9);


2)è uguale a quello sopra però al posto di usare un int usi un char.


spero di esserti stato di aiuto!ciao

zanardi84
06-10-2010, 17:26
Torno solo ora sull'argomento :D

Comunque, devo cercare di costruire una funzione comoda comoda con un'interfaccia furba che mi consente di chiamarla e piegarla alle varie esigenze.

Per esempio: Voglio inserire un qualsiasi numero (1, 16, 10000...), ma non una lettera. Se in input metto per esempio la lettera "a" (o qualcosa di diverso da una cifra) quando mi chiede un numero, voglio che venga segnalato l'errore.

Qual è la condizione che fa stampare il messaggio d'errore + relativa rischiesta di reinserimento del dato?

Rsk
06-10-2010, 17:47
Torno solo ora sull'argomento :D

Comunque, devo cercare di costruire una funzione comoda comoda con un'interfaccia furba che mi consente di chiamarla e piegarla alle varie esigenze.

Per esempio: Voglio inserire un qualsiasi numero (1, 16, 10000...), ma non una lettera. Se in input metto per esempio la lettera "a" (o qualcosa di diverso da una cifra) quando mi chiede un numero, voglio che venga segnalato l'errore.

Qual è la condizione che fa stampare il messaggio d'errore + relativa rischiesta di reinserimento del dato?

Puoi usare il do-while indicato da lukagol opportunamente modificato utilizzando
la funzione della libreria ctype.h
int isalpha ( int c ); (http://www.cplusplus.com/reference/clibrary/cctype/isalpha/)

!fazz
06-10-2010, 17:49
la funzione la crei e la tari come vuoi tu ma non è niente di complicato


puoi fare una cosa semplice così

char cscelta;
int iscelta;
bool berr;
do{
system("cls");
cout<<"Menu\n";
cout<<"1)XXXXXX\n";
cout<<"2)XXXXXX\n";
cout<<"3)XXXXXX\n";
cout<<"4)XXXXXX\n";
cout<<"scelta: ";
cin>>cscelta;
iscelta=atoi(cscelta)
if(iscelta>0)&&(iscelta<5)
{berr=false;}
else
{
cout<<"Errore\n";
system("pause");
berr=true;
}

}while(berr==true);

zanardi84
07-10-2010, 09:10
Puoi usare il do-while indicato da lukagol opportunamente modificato utilizzando
la funzione della libreria ctype.h
int isalpha ( int c ); (http://www.cplusplus.com/reference/clibrary/cctype/isalpha/)

Intrigante questa funzione!

Pensavo di combinarla a isalnum per escludere totalmente l'inserimento di un simbolo diverso da un numero, sempre che una non contenga anche gli scopi che raggiunge l'altra.
Vorrei inserirle in un while ma non ho chiaro il procedimento.

zanardi84
08-10-2010, 13:55
Ho giocherellato un po' con la isalpha e devo dire che fa proprio bene il suo lavoro.

L'ho implementata in modo molto semplice in un programma d hoc:

#include <cstdlib>
#include <iostream>
#include <ctype.h>

int isalpha (int ch);
using namespace std;

int main(int argc, char *argv[])
{
char c;

cout << "Inserire un numero"<<endl;
cin >> c;

while (isalpha (c))
{
cout << "Errore, è stata inserita la lettera "<< c << "Ripetere"<<endl;
cin >> c;
}
cout << "Il numero inserito è: "<< c <<endl;


system("PAUSE");
return EXIT_SUCCESS;
}


Ho trovato però alcune limiazioni che vorrei potenziare.

Se inserisco una lettera in effetti posso segnalare l'errore. Ha però un limite.
Se io inserisco 99 e gli faccio stampare il numero, lui mi restituisce 9 e non 99.

Se inserisco per esempio asd9 mii segnala

Errore, è stata inserita la lettera a Ripetere
Errore, è stata inserita la lettera s Ripetere
Errore, è stata inserita la lettera d Ripetere
Il numero inserito è 9.

Vorrei che si fermasse alla prima lettera che incontra per invalidare la digitazione.

E vorrei che mi restituisse 99 invece di 9.

Any idea?