da tastiera controllato in applicazioni console Siete il visitatore n. Pagina ottimizzata per risoluzione 1024x768 | ||
Torna alla Home Page | Argomenti
simili su questo sito Alcune note sui tipi discreti del C++ con riferimento al tipo intero |
Questo articolo ha duplice carattere: da
un lato divulgativo, per permettere a chi ne abbia necessità
di utilizzare, in applicazioni per console, una comoda funzione C++ per
l'input numerico decimale intero da tastiera rigidamente controllato,
dall'altro illustrativo, attraverso i commenti inseriti direttamente
nei listati, di possibili problemi connessi all'utilizzo delle comuni
operazioni aritmetiche con il tipo intero, int
in particolare. Problemi di controllo dei singoli caratteri con l'immissione da tastiera tramite stream Nei manuali di C/C++ non si fa riferimento a librerie standard, ovvero previste dal linguaggio, per la gestione dell'input di singoli caratteri da tastiera. Nel momento in cui si ha bisogno, in applicazioni per console, che l'utente immetta dati numerici o alfanumerici, si può sfruttare una serie abbastanza ampia di funzioni appartenenti alla libreria standard quali scanf, get e altre, che permettono di manipolare le sequenze di caratteri immesse e trarne le informazioni volute. Tali funzioni hanno però il difetto, che talvolta può essere un inconveniente piuttosto serio, di essere applicabili alla sequenza di caratteri immessa dall'utente solo dopo che questi abbia premuto il tasto CR (invio). In pratica, per fare immettere all'utente ad esempio un numero intero decimale, sfruttando lo stream di ingresso previsto dalla funzioni standard l'utente è libero di: a) digitare un numero di caratteri quasi a piacere b) digitare caratteri che non hanno nulla a che vedere con il tipo di valore che il programma deve elaborare. Ad esempio, le istruzioni int a; sollecitano l'utente ad immettere un numero compreso fra i valori indicati, ma l'utente potrebbe a quel punto digitare anche i primi venti versi della Divina Commedia (senza premere CR), riempiendo sostanzialmente lo schermo di caratteri che nulla hanno a che vedere con i dati da immettere. Solo nel momento in cui si preme CR, di fatto, lo stream di ingresso cin viene scorso per rintracciare eventuali caratteri congruenti con il tipo di dato di cui si richiede l'immissione, in questo caso un int. Per evitare questi problemi, si impone l'utilizzo di un controllo su ogni singolo carattere digitato sulla tastiera, in modo da a) accettare e visualizzare solo i caratteri congruenti con il dato da immettere, ad esempio cifre e segno nel caso di immissione di un numero decimale b) controllare che non venga immesso un numero spropositato di cifre, per non andare a sovrascrivere altre parti di testo già presenti sullo schermo Sebbene
non facciano parte della libreria standard, generalmente le utility per
la gestione dei singoli caratteri battuti sulla tastiera sono fornite
nelle varie implementazioni dei compilatori C++, gratuiti e non. Riconoscimenti e avvertenze Le funzioni qui descritte e riportate sono state scritte utilizzando l'ambiente di sviluppo Dev C++ 4.9.8.0, a carattere gratuito, sottoposto comunque a diritti e licenze (Copyright Bloodsheed Software, GNU license, ecc.). Nell'ambiente Dev C++ viene fornita la libreria conio.c, parte di altre librerie e/o ambienti (MingW). La citazione dell'opera di terze parti, nelle righe qui sopra, è incompleta e ha carattere indicativo; in ogni caso, in questa pagina non viene riportato alcun materiale scritto da altri, ma solo funzioni scritte dall'autore di questo articolo. In particolare, non viene riportata la libreria conio.c; per scaricarla e utilizzarla, leggere attentamente le relative condizioni di licenza. Trattandosi di materiale messo gratuitamente a disposizione di chiunque lo desideri, ne è vietata ogni forma di utilizzazione per pubblicazioni commerciali. Ogni forma di utilizzazione per uso personale è permessa e auspicata. Se in qualche modo si intende utilizzare le funzioni descritte in questo articolo per scopi non puramente personali, o divulgare il materiale contenuto in questa pagina (escluse le funzioni), è fatto obbligo di richiedere un permesso scritto all'autore di questo articolo (anche via e-mail). E' invece possibile divulgare il listato delle funzioni, mantenendo però nei commenti il nome dell'autore. Nel caso queste funzioni vengano solo lievemente modificate, è gradito che venga citato il nome dell'autore originale. Naturalmente, nel caso le funzioni vengano profondamente modificate, nessuna citazione è richiesta. Le informazioni contenute in questa pagina sono fornite così come sono, senza alcuna forma di garanzia. Non mi assumo naturalmente alcuna responsabilità per danni diretti o indiretti a persone o a cose derivanti dalle informazioni contenute in questo articolo. Le
funzioni |
Parte
comune a tutte le funzioni contenute nel file
funzioni01.cpp. Essa comprende le note, che si riferiscono a tutte le
funzioni contenute nel file, e le direttive necessarie alla corretta
compilazione di questo file (ad es. le #include <funzioni
di libreria>). Vi è anche la direttiva
#include "funzioni01.h"; il file funzioni01.h contiene tutte le
dichiarazioni delle funzioni della libreria funzioni01.cpp. |
Parte
comune a tutte le funzioni, in testa al file funzioni01.cpp//
---------------------------------------------------------------------------- funzioni 01.h funzioni 01.cpp // seguente: #include
<iostream> //
NON RACCOMANDATO (non è C / C++ standard), ma non ve ne #include " funzioni 01.h"
//
header della libreria personale 01 (questa libreria) using
namespace std; //
Se non si usa questa direttiva, cout, endl ecc. non sono disponibili |
bool
controlla_lunghezza_tipi ( ) Tale funzione controlla, tramite l'operatore sizeof(), che il compilatore con il quale si sta compilando il programma generi codice in cui i tipi discreti controllati nella funzione stessa siano rappresentati esattamente sul numero di byte previsto, ad esempio 4 byte per il tipo int. Nel caso tale controllo non abbia esito positivo, le altre funzioni qui riportate non dovrebbero essere utilizzate, pena possibile malfunzionamento e/o comportamento imprevisto. Tale controllo è reso necessario dal fatto che non per tutti i compilatori un dato tipo è rappresentato sullo stesso numero di byte; il C++ prevede infatti solo un numero di byte minimo per rappresentare un dato tipo. |
Dichiarazione
della funzione, contenuta nel file di
intestazione funzioni01.hbool
controlla_lunghezza_tipi (); |
Codice
della funzione, contenuto nel file contenente il
codice funzioni01.cpp//
----------------------------- FUNZIONI
--------------------------------- bool
controlla_lunghezza_tipi () bool lun_tipi_OK
= true ; if ( sizeof ( char )
!= 1 ) "Attenzione:
tipo char su %d byte e NON su 1 byte: il file eseguibile" , sizeof ( char )); "Utilizzare
un compilatore per cui il tipo char sia su 1 byte\n" ); false ; if ( sizeof ( int )
!= 4 ) "Attenzione:
tipo int su %d byte e NON su 4 byte: il file eseguibile" , sizeof ( int )); "Utilizzare
un compilatore per cui il tipo int sia su 4 byte\n" ); false ; if ( sizeof ( float )
!= 4 ) "Attenzione:
tipo float su %d byte e NON su 4 byte: il file eseguibile" , sizeof ( float )); "Utilizzare
un compilatore per cui il tipo float sia su 4 byte\n" ); false ; if ( sizeof ( double )
!= 8 ) "Attenzione:
tipo double su %d byte e NON su 8 byte: il file eseguibile" , sizeof ( double )); "Utilizzare
un compilatore per cui il tipo double sia su 8 byte\n" ); false ; if ( sizeof ( long
long ) != 8 ) "Attenzione:
tipo long long su %d byte e NON su 8 byte: il file eseguibile" , sizeof ( long
long )); "Utilizzare
un compilatore per cui il tipo long long sia su 8 byte\n" ); false ; if
(lun_tipi_OK == false ) "PAUSE" ); return
false ; else { return
true ;} //
fine funzione |
int
immetti_cifra ( ) Consente di immettere solo cifre decimali (0-9); la cifra immessa non viene visualizzata |
Dichiarazione
della funzione, contenuta nel file di
intestazione funzioni01.hint immetti_cifra
(); |
Codice
della funzione, contenuto nel file contenente il
codice funzioni01.cpp
int immetti_cifra
() int a; do {a
= getch ();} while (a<'0'
|| a>'9'); return
(a - '0'); //
fine funzione |
int
immetti_int_limiti (int
valore_min, int valore_max, unsigned int posx_curs, unsigned int
posy_curs) Permette di fare immettere all'utente un numero intero, compreso fra -2^32 e 2^32-1, iniziando l'immissione alla locazione posx_curs, posy_curs. Tale funzione non fa altro che invocare la funzione immetti_int_limiti, descritta qui di seguito; per una descrizione più approfondita fare riferimento ad essa. |
Dichiarazione
della funzione, contenuta nel file di
intestazione funzioni01.hint immetti_int
( unsigned int ,
unsigned int ); |
Codice
della funzione, contenuto nel file contenente il
codice funzioni01.cpp
int immetti_int
( unsigned int posx_curs,
unsigned int posy_curs) return immetti_int_limiti
(- 2147483648 , + 2147483647 , posx_curs,
posy_curs); //
fine funzione OK ------------------------------------------------ |
int
immetti_int_limiti (int
valore_min, int valore_max, unsigned int posx_curs, unsigned int
posy_curs) La funzione in questione permette di fare immettere all'utente un numero intero, compreso fra valore_min e valore_max, iniziando l'immissione alla locazione posx_curs, posy_curs. Naturalmente posx_curs e posy_curs devono essere valori ammissibili; valore_min e valore_max devono naturalmente essere compresi fra -2^32 e 2^32 - 1; valore_min deve essere <= valore_max. La funzione opera nel seguente modo: l'immissione di un numero compreso fra i limiti valore_min e valore_max termina premendo CR; è possibile immettere solo segno +, e segno - e cifre decimali; è possibile immettere numeri positivi e lo zero facendoli precedere o meno dal segno + non è possibile immettere lo zero preceduto dal segno meno non è possibile immettere numeri di più di una cifra con uno zero iniziale (es +03, -097928) non è possibile immettere un numero di cifre maggiore di quello corrispondente al massimo fra le cifre di valore_max e valore_min non è possibile terminare l'immissione, ovvero CR non ha effetto, se tale numero risulta esterno ai limiti specificati per le correzioni si deve usare il tasto backspace se il cursore raggiunge la posizione x=80, y=25, non è consentito immettere altre cifre se il cursore raggiunge la posizione x=80, con y<25, e viene digitata una cifra, l'immissione continua sulla riga seguente, a capo. La funzione riportata in questa pagina fa uso delle seguenti funzioni della libreria non standard conio.c void clrscr() // pulisci schermo int getch() // restituisce il codice ASCII del carattere digitato sulla tastiera void gotoxy(int x. int y) // posiziona il cursore a colonna x e riga y int putch (int a) // scrive sullo schermo, alla posizione individuata dal cursore, il carattere di codice ASCII a Il file conio.c deve essere disponibile nell'ambiente di compilazione. Se non lo avete, probabilmente potete trovarlo in rete per il vostro sistema operativo. Attenzione: in alcune librerie, le funzioni qui utilizzate hanno nomi leggermente differenti, ad esempio int _getch al posto di int getch() e simili. |
Dichiarazione
della funzione, contenuta nel file di
intestazione funzioni01.hint immetti_int_limiti
( int ,
int ,
unsigned int ,
unsigned int ); |
Codice
della funzione, contenuto nel file contenente il
codice funzioni01.cpp Nota:
nella funzione immetti_int_limiti
al momento ci sono ancora delle linee per il debug, le quali
visualizzano i caratteri immessi e la sequenza di caratteri che va a
riempire un array per il controllo limiti minime e massimo. Si tratta
delle parti in cui viene utilizzato cout. Eliminarle tranquillamente
(magari dopo aver capito a cosa servono). |
Sperando di esservi stato utile, buon lavoro! |
|
Ultimo aggiornamento: 12 Luglio 2004 |