next up previous

Next:Procedure Up: TurboPascal Tutorial Previous:Esempio

Tipi di dati


Come già visto in precedenza, nel settore dichiarativo di un programma 
bisogna definire il tipo  di variabili che intendiamo utilizzare nel 
corso del programma stesso.
Esistono vari tipi di variabili, e sono raggruppate in questo breve 
specchietto.

 
  _______________________________________________________________________  
 | Nome tipo      |    Intervallo consentito     |    commenti            |
 |----------------|------------------------------|------------------------|
 |  INTEGER       |     -32768  /  +32767        |     numeri interi      |
 |                |                              |  (positivi e negativi) |
 |----------------|------------------------------|------------------------|
 |  BYTE          |           0 /255             |   numeri interi        |
 |________________|______________________________|________________________|
 |                |                              |                        |
 |  WORD          |         0 / 65535            |   numeri interi        |
 |________________|______________________________|________________________|
 |                |                              |   numeri reali         |
 |  REAL          |    2.9x10^-36  / 1.5 x 10^35 | (positivi e negativi)  |
 |________________|______________________________|________________________|

                                                

 Questo schema dimostra come ci siano vari tipi di dichiarazione dei dati.
 Non è detto, però, che i tipi di dati corrispondano soltanto a cifre; 
 potremmo infatti di fronte a un problema che necessita di dati alfanumerici, 
 cioè di numeri e lettere.
 In questo caso dovremmo introdurre due nuovi tipi di variabile:
  
 1) STRING[x] : Dichiarando così un tipo di dato assumeremo che quel dato è 
 formato da un numero intero di x caratteri alfanumerici (compresi gli 
 spazi).Usato senza parametri non definisce la lunghezza della stringa. 
 Inoltre nel caso in cui si dichiari una lunghezza  minore del dato inserito,
 l' elaboratore  non considererà i cartteri che eccedono.
 Ad esempio, se dichiarassimo la variabile a di tipo STRING[5] e al momento 
 di inserire i dati digitassimo la parola "folletto" , essa risulterebbe 
 troncata in "folle", poichè i caratteri in eccesso non verrebbero considerati 
 nell' elaborazione. 

 2) CHAR : E' meno usata di STRING, ma qualche volta può risultare utile.
 Viene usata per definire variabili da un solo carattere ( eccetto numeri ).
 

 
  • Le strutture dei dati
  • Questa che andremo ad esaminare ora, è forse la parte più complessa del TP, nonostante ciò, cercherò di renderla semplice poichè è la più utile e contiene le istruzioni più usate. E' stato purtroppo inevitabile, però, non inserire parole piuttosto "difficili" data la specificità dell' argomento. 1-) Le strutture iterative ======================= Il termine iterare deriva dal latino e significa "ripetere". Questa struttura ( che è presente in tutti i linguaggi programmativi, non solo in Pascal, N.d.A.) agisce su una operazione che deve essere ripetuta più volte. Ne esistono vari tipi: a) Iterazione enumerativa - Come dice la parola stessa esegue un operazione n volte.In Pascal è indicata dal comando: FOR a=: ni TO nf DO( * Niente punto e virgola * ) istruzione 1; istruzione ...; END; Nel nostro caso ni sostituisce il numero intero dal quale si parte a enumerare e nf sostituisce il numero fino al quale si continua a enumerare. Dopo questa istruzione di iterazione si inseriscono le istruzioni da ripetere racchiudendo il tutto con un END seguito da un punto e virgola (;), poichè il flusso di informazioni non è del tutto terminato. E' possibiile anche procedere a ritroso, contando alla rovescia da un numero n fino ad arrivare ad un numero t: FOR a:=n DOWNTO t DO Ecco un semplice esempio: PROGRAM potenza; USES crt; VAR a,b,c,i:INTEGER; BEGIN WRITELN('Inserisci un numero'); READLN(A) WRITELN(' Inserisci esponente '); READLN(B); FOR I:= 1 TO b DO c:=a*a; END; WRITELN('Il risultao della potenza è ' ,c); READLN; END. b) Iterazione per falso - Esegue il ciclo racchiuso tra REPEAT e UNTIL se, e solo se, la condizione espressa da UNTIL è vera, in caso contrario continua a ripetere le istruzioni. REPEAT istruzione 1; istruzione 2; istruzione ...; UNTIL proposizione; N.B. Ricorda di inserire proposizioni possibili dopo UNTIL altrimenti l'uscita dal ciclo ripetitivo non si avrà mai! ( in gergo si dice che il computer si "impianta" e bisogna riavviarlo) Esempio: PROGRAM ripetizione; USES crt; VAR a,b:INTEGER; BEGIN REPEAT WRITELN(' Inserisci un numero minore di 30 e maggiore di 10'); READLN(A); UNTIL (A<30) AND (A>10); READLN; END. c) Iterazione per vero - Esegue le informazioni racchiuse tra WHILE DO e l' END;( il punto e virgola indica che l' END è parziale ) finché la condizione presa in esame non sia falsa. WHILE a=3 DO istruzione 1; istruzione 2; istruzione...; END; Questo semplice esempio spiega come il blocco di istruzioni presente tra WHILE DO e END; venga ripetuto finché si rispetti la condizione a=3. Nel caso in cui il valore di a fosse stato diverso da 3, infatti, il blocco di istruzioni non sarebbe stato mai eseguito. 2-) Le strutture selettive ====================== A questo punto è lecito domandare se è possibile operare delle scelte con il TP. La risposta è affermativa. Esistono due tipi di selezione: la selezione binaria e la selezione multipla. a) Selezione binaria - E' la più semplice: se consideriamo un numero naturale qualsiasi e ci domandiamo se esso è pari, la risposta potrà avere solo due alternative: Si oppure No. In Tp c'è la possibilità di eseguire una scelta binaria tra due condizioni con il seguente comando: IF THEN ELSE Che tradotto fa più o meno: SE ALLORA ALTRIMENTI ] Questo è quanto serve per operare ( o far operare al computer ) una scelta. Per chiarire ulteriormente questo importante processo vedrò di presentarvi un esempio. Costruiamo un programma che calcoli l' area di un rettangolo SE E SOLO SE l' area stessa è minore di un numero n ( per esempio 20) e maggiore di un nuumero m (per esempio 10); PROGRAM area_rettangolo; USES crt; VAR a,b,c:INTEGER; BEGIN CLRSCR; ( * E' un nuovo comando.E' l' abbreviazione di CLeaR SCReen= cancella schermo. Pulisce lo schermo. * ) WRITELN(' Inserisci base'); READLN(a); WRITELN('Inserisci altezza'); READLN(b); c:=a*b; IF (c<20) AND (c>10) THEN ( * AND , insieme a OR sono gli operatori booleani più usati in TP. Per approfondimenti consultare l' appendice C * ) BEGIN WRITELN('Area maggiore di 20 oppure minore di 10.'); READLN; END ( * L' END prima dell' ELSE senza punto e virgola(;) * ) ELSE BEGIN WRITELN(' AREA = ',c); READLN; END; READLN; END. E' un listato semplice, e l' unica osservazione da fare è che se dopo IF...THEN c'è solo un istruzione può essere scritta terminando il tutto con il solito punto e virgola(;). Tuttavia , se ce ne sono più di una è necessario aprire un altro BEGIN e cominciare un sottoprogramma il quale, però va terminato con l' END; che, se seguito da ELSE non accetta il punto e virgola(;). b) Selezione multipla - Se domandiamo ad una persona quali sono i piatti che preferisce essa sceglierà fra un' ampia gamma di pietanze fino a scegliere quella che soddisfi i suoi gusti. Infatti, al contrario di prima,la selezione multipla ci fornisce illimitate possibilità di risposta. Il comando che in TP ci permette di operare un selezione multipla è il seguente: CASE n of ( * Se n è stata dichiarata INTEGER * ) valore 1:BEGIN istruzione1; istruuzione2; istruzione... END; ( * Se n è stata dichiarata CHAR * ) valore x:BEGIN istruzione1; istruzione2; istruzione...; END; ELSE BEGIN istruxione 1; istruzione2; istruzione...; END; END; Nonostante la sua sintassi spaventosamente ricca, questa struttura è di facilissima comprensione. Innanzitutto dobbiamo decidere se dichiarare la variabile n come tipo INTEGER oppure CHAR. Se n è CHAR dovremo usare UNA lettera seguita dai due punti(:) e dal rispettivo sottoprogramma delimitato da BEGIN e END; . Se invece n è INTEGER dovremo usare un numero naturale al posto di n e mettere dopo i due punti(:) il solito sottoprogramma delimitato da BEGIN e END; . Proviamo ora con un' esempio: un programma che generi un numero a caso tra 1 e 10 e lo comunichi all' operatore solo se esso è uguale a 7, 9 o 3. PROGRAM numeri_casuali; USES crt; VAR a,b,c:INTEGER; BEGIN CLRSCR; RANDOMIZE; ( * Inizializza,ossia azzera il generatore di numeri casuali * ) c:=RANDOM(10); ( * Questo comando permette all' elaboratore di generare un numero a caso compreso tra 0 e il numero indicato in parentesi. Il massimo consentito è 255 * ) CASE c OF 7:BEGIN WRITELN(' Il numero è ',c); END; 9:BEGIN WRITELN(' Il numero è ',c); END; 3:BEGIN WRITELN(' Il numero è ',c); END; ELSE BEGIN WRITELN(' Il numero uscito è diverso da 3 7 e 9); END; END; Anche se con questo ultimo esempio abbiamo terminato il capitolo riguardante le strutture dei dati al lettore potrebbe sembrare che quelle poche strutture analizzate debbano esssere affiancate da molte altre per costruire un programma relativamente complesso, e invece secondo il teorema di Bohm - Jacopini : "Le tre strutture matematiche che servono per creare un qualsiasi programma sono: iterative, selettive e sequenziali." Le strutture sequenziali sono le più lineari, poichè il flusso di dati scorre senza ripetizioni né selezioni che abbiamo utilizzato tranquillamente nel primo programma( quello del triplo di un numero ) senza saperlo.