Newsgroup: it.comp.lang.c++
Titolo: Immisione dati in C++

Premesso che non sono programmatore professionista ma un semplice insegnante
che sta predisponendo dei semplici programmi in C++ per i propri alunni
avrei una domanda da porre a cui non ho saputo nonostante il molto tempo
impiegato rispondere. Io faccio dei programmi che richiedono l'inserimento
di dati double esempio:
cout<<"Immetti un numero "
cin>>x
il mio problema che si presenta ogni volta che facccio usare questi
programmi in classe e che c'è sempre qualcuno che al posto del numero
inserisce lettere o numeri e lettere bolccando quindi il programma stesso
che richiede solo numeri.
Qualcuno sa se esiste qualche libreria o funzione in C++ che mi permette di
verificare se il dato immesso e numerico?
Grazie infinite
Roberto

 verificare se il dato immesso e numerico?
Semplice: si potrebbe immettere il valore in formato stringa, eseguire dei
test e successivamente convertire in formato numerico :-). Vengono in aiuto
le funzioni della libreria standard del C isalpha, isdigit, isspace, ispunct
ecc ecc
Ciao
Domenico Barra

 > programmi in classe e che c'č sempre qualcuno che al posto del numero


roberto
prova con:
int num=atoi(stringa)
Se hanno inserito un numero errato gli ritorna 0.
E' semplice, ma non so se č quello che ti serve.
Luc.

 Se hanno inserito un numero errato gli ritorna 0.
Stavo pensando anch'io di consigliarglielo, ma se il numero inserito e'
effettivamente 0 ?
Domenico Barra

 effettivamente 0 ?
Se il numero è effettivamente 0 strcmp(stringa,'0') sarà vera...
quindi prima assegni n=atoi... e poi se n è zero allora verifichi son strcmp
che la stringa sia '0'.

Una possibilita` e` leggere stringhe (composte da una sola parola) e
poi utilizzare le funzioni di libreria C per tentare una conversione a double
(mi pare sia strtod()) se la chiamata ha successo bene, altrimenti
la funzione ti indica cosa non e` andato bene.
Paolo
--
Paolo Marotta
Duck Communication Entertainment s.r.l.
Largo Arenula, 11 - Roma
http://www.duckce.com
p.ma...@duckce.com
-- 
Posted from 
HA-server-a.cs.interbusiness.it
 [151.99.250.31] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

che la stringa sia '0'.
Si, ma occhio che quei ragazzacci potrebbero inserire 00, 000, ecc...
:)
Luc.

 Se il numero è effettivamente 0 strcmp(stringa,'0') sarà vera...
Se inserissi 00, 000, -0, 0.0 ecc. sarei di nuovo in difficoltà...
Domenico Barra

Valide tutte le risposte già pervenute.
C++ non possiede a livello di librerie standard una grande potenza per
l'I/O utente evoluto.
Ci sono state e ci sono molte librerie commerciali, ma essendo
insegnante e non un'azienda ...
Nel caso più estremo ... circa 1/4 di Windows è una gigantesca libreria
di I/O utente avanzato!
Due approcci al fai-da-te sono:
1) quello suggerito: input stringa e poi parsing
2) controllo realtime dell'input con un loop che accetta un solo
carattere (senza echo a monitor) e prima lo controlla e poi, se valido
lo salva sia in una stringa che in echo a monitor, se invalido lo
rifiuta (suggerisco un echo informativo magari di tipo sonoro: un beep
che segnala il rifiuto). All'immissione di invio la stringa può essere
convertita in numero.
-- 
Posted from 
adsl-21-135.38-151.net24.it
 [151.38.135.21] 


 writes:

Il mio consiglio e' quello di non usare MAI atoi, se vuoi avere il
controllo di quello che e' stato inserito; ma strtoXX.  Visto che qui,
a quel che sembra, si vuole introdurre un double, prova con (codice
NON testato):
#include <string>
#include <cstdlib>  // strtod
#include <cctype>   // isspace
std::string input;
double dato;
const char *pc
// leggi dentro "input"
dato = strtod(input.c_str(), &pc);
if (isspace(*pc) || *pc == '\0') {
  // Tutto a posto
} else {
  // Invalid character
}
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it
Alan Turing thought the whole life about the question of whether
machines can think; a question of which we now know that it is
about as relevant as the question of whether submarines can swim.
                -- Edsger W. Dijkstra

 Si, ma occhio che quei ragazzacci potrebbero inserire 00, 000, ecc...
Mi sembrava che bastasse a limitare casi di input errato, ma questa invece e
faziosità!
Ok. Preparerò una .DLL con tutti i casi possibili immaginabili...
Certo che quei ragazzacci sono proprio delle piccole pesti....
... e se premono anche CTRL-ALT-CANC? Bisogna impedirlo....
Ciao a tutti!

 dato = strtod(input.c_str(), &pc);
Non credo si possa fare dato che c_str() è dichiarata come const, o
sbaglio?
EMG



Perche'?  strtod legge da un const char [] :
MLO@mlinux 3 $ man strtod
Formatting page, please wait...
STRTOD(3)               Library functions               STRTOD(3)
NAME
       strtod - convert ASCII string to double
SYNOPSIS
       #include <stdlib.h>
       double strtod(const char *nptr, char **endptr);


che la stringa sia '0'.
Troppo macchinoso, e completamente fallimentare nel caso che qualcuno
inserisse qualcosa come 00 o 000. Il sistema migliore credo sia quello
già accennato da Domenico Barra e da Marotta, ovvero richiedere in
input una stringa,  tramite una funzione apposita(ovviamente
riutilizzabile) applicare tutti gli appositi controlli, ed una volta
stabilito che la stringa é valida convertirla in intero.
Lavinia
WINWORD.EXE - ERRORE DI APPLICAZIONE
l'istruzione a "0x3017ff27"ha fatto riferimento alla
memoria a "0x02a3143c".La memoria non poteva essere 'read'.

 Perche'?  strtod legge da un const char [] :
Scusa, mi sono fatto ingannare dal commento. Sarebbe dovuto essere
// leggi da "input"
:-)
EMG

input una stringa,  tramite una funzione apposita(ovviamente
Il sistema migliore per convertire il numero e' usare strtol() e le
funzioni della stessa famiglia.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

Capito come i ragazzi di oggi imparano???
Fanno insegnare C++ a gente (preparatissima in altri campi, me ne
guarderei bene di dire ignorante) che non conosce il C++, inglese a
gente semplicemente laureata in legge.... etc etc.
Mi sembra + opportuno fare come fece il mio prof di matematica quando
ero alle medie ( ho 29 anni ) che mi introdusse al mondo della
programmazione con il "logo".
Sent via Deja.com
http://www.deja.com/

 gente semplicemente laureata in legge.... etc etc.
Senza alcun proposito di offesa, chi sei tu per giudicare la preparazione
del Sig. Roberto? Egli ha postato un messaggio semplicemente per risolvere
un dubbio, anche se semplice, e dubito che anche Paolo Marotta, o Andrea
Griffini (non me ne vogliano questi due cari amici, se li cito cosi'
impudentemente, lo faccio perche' li reputo al momento i piu' "ferrati"
;-) ) non si siano mai trovati in dubbio su qualcosa. Cavolo, tutti
imparano, nessuno nasce "imparato".
Per di piu' Roberto ha anche detto di aver gia' pensato ad una soluzione
simile a quella propostagli dal sottoscritto, e di averla trovata
eccessivamente macchinosa: trovare un metodo eccessivamente macchinoso per
me significa essere coscienti che si puo' fare di meglio; e Roberto voleva
solo sapere se qualcuno di noi avesse saputo fare di meglio.
Ciao
Domenico Barra

 Domenico Barra
Be non mi va di dire chi sono o le mi qualifiche (come vedi non uso
nessuna signature) forse un giorno....
Non ho detto che il Sig. Roberto e' preparato o meno. Vedo ogni giorno
la gente "profonda conoscitrice di C++" che poi non sanno cosa e' un
Template specializzato ho un singleton.... :-( per non parlare di gente
che inserisce classi friend in ogni dove.... ( tanto poi i programmi
funzionano, non e' questo l'importante ??? )
Se devi insegnare a della gente ( mi sembra di aver capito bambini )i
principi della programmazione non puoi usare il C++ solo perche' fa
figo dire sto insegnando C++. Come vedi ho citato il "LOGO" che non so
quanti qui conoscano. Qualcuno nei post precedenti ha dato una
plausibile soluzione, non ha inventato nessun nuovo Pattern, perche'
una domanda cosi' ovvia non viene da un neofita ma da qualcuno che
insegna? Come hai detto tu tutti imparano, e sei stai imparando non
puoi insegnare specialmente a gente avida di conoscere....
Conosci bene il Pascal? il C? il Basic? il Logo? il Fortran? il Lisp?
l'Eiffel? il Monopoli? insegna "bene" quello + tosto che improvvisarti.


l'Eiffel? il Monopoli? insegna "bene" quello + tosto che improvvisarti.
Calmiamoci, per cortesia :)


 Sapessi quanta GENTE vedo io che poi NON SANNO l'italiano :))
:--))


Ciao, oggi mi è capitato qualcosa di simile...
Ho letto un AnsiString (spero non sia OT dato che uso il Borland C++, ma il
discorso è analogo a qualsiasi compilatore), e poi, non interessandomi di
quel che c'era dentro ho usato il metodo .ToDouble() della classe
AnsiString.
Ovviamente il tutto racchiuso dentro un try / catch che nel caso di
conversione impossibile avvisava che c'era stato qualche errore di
battitura, a me così è piaciuto, pratico e funzionale.
Paolo Ferraresi.