Introduzione alla programmazione

Uno sguardo a Turbo Pascal e Lazarus
LEZIONE 6

Lezione 6

Variabili: i tipi di dato

Abbiamo introdotto il concetto di variabile in una lezione precedente, ma cosa è un dato?
Perché è necessario avere una tipizzazione dei dati?
Un dato è un valore di qualche tipo, numerico, testuale, che fa riferimento al tempo o ad una data, una cifra che rappresenta un valore monetario, o qualsiasi altra cosa possa essere rappresentata con simboli, numeri o caratteri.

Ai fini della programmazione è bene distinguere i tipi di dato in modo da dire al compilatore che costruirà la nostra applicazione, come dovrà lavorare su quel dato e quante risorse allocare (mettere da parte) per poterlo fare in modo efficiente.

Approfondiamo un pochino questi aspetti analizzando i tipi di dato più importanti:

Variabili String

Il tipo string, stringa, è un tipo di dati idoneo a contenere del testo.
Quando si assegna un valore a questo tipo di dato occorre specificare che si tratta di testo scrivendolo tra apici, in questo modo:
'Questo è un testo che può essere contenuto in una variabile di tipo string'
Potremo quindi dichiarare la nostra variabile e poi assegnargli quel valore in questo modo:


  procedure TForm1.Button1Click(Sender: TObject);
    Var
      S:string;
    begin
      S:='Questo è un testo che può essere contenuto in una variabile di tipo string';
      ShowMessage(S);
  end;

N.B.
Attenzione, dovresti già saperlo, ma ripetiamolo: gli apici: sono questi ', non questi ‘ e neppure questi `


Esegui questo codice: come vedi, quando il messaggio viene mostrato, gli apici non sono presenti nel testo, in quanto la variabile contiene solo quello che è all’interno degli apici e non gli apici stessi.

Potrebbe succedere di aver bisogno di un apice all’interno del testo, ma se per Lazarus questo segna la fine della stringa come possiamo fare?
'Questo è un esempio sbagliato di apice ' dentro una stringa '
Infatti l’apice al centro tronca la stringa in quel punto e il debugger riporterà un errore perché per lui la stringa termina dove c'è il secondo apice, "dentro una stringa'" che rimane escluso, non significa nulla per lui, genera quindi un errore...

Dobbiamo fare così:
'Questo è un esempio corretto di apice '' dentro una stringa'
Ecco qua, era molto semplice, basta mettere due apici consecutivi (senza spazi tra di loro) e il gioco è fatto!

Variabili Numeriche

Le variabili numeriche, come abbiamo già visto, sono essenzialmente di due tipi, quelle che contengono numeri interi e quelle che contengono numeri con la virgola.

Le variabili più comuni per i numeri interi sono:
   Byte: valori tra 0 e 255
   ShortInt: valori tra -128 e 127
   SmallInt: valori tra -32.768 e 32.767
   Word: valori tra 0 e 65.535
   Integer: può contenere valori positivi e negativi grandi quanto la nostra CPU è in grado di “reggere”
   LongInteger: valori tra -2.147.483.648 e 2.147.483.647
   LongWord: valori tra 0 e 4.294.967.295
   Int64: valori tra -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807
   Qword: valori tra 0 e 18.446.744.073.709.551.615

Perché così tante? E quale dovrei usare?
La risposta è abbastanza semplice, se sai che il tuo numero non sarà mai più grande di un certo valore, scegliere un tipo di dato che possa contenere un numero enorme, non solo non ti servirà, ma farà aumentare il consumo di risorse del tuo programma rendendolo più lento: funzionerà lo stesso, ma sarà più pesante e meno veloce.
Se per esempio devi contenere un numero da uno a 10, la variabile di tipo Byte sarà più che sufficiente, ma se devi contenere un numero da -10 a 100, dovresti usare la variabile di tipo ShortInt.
Chiaramente, non sapendo niente sul possibile numero che si presenterà, usare Integer sarà più indicato e di solito è anche il più usato…

Variabili Numeriche con Virgola

Le Variabili con virgola mobile sono fondamentali quando si eseguono dei calcoli, le più comuni sono:

   Single: 7 cifre dopo la virgola
   Double: 15 cifre dopo la virgola
   Extended: 19 cifre dopo la virgola

Anche qui vale il discorso fatto prima per le variabili intere: dovresti scegliere quella più adatta di volta in volta, ma se userai Double, difficilmente potranno dirti che hai sbagliato.
In casi estremi potresti voler usare Extended.

Esiste anche un altra variabile numerica in virgola mobile, una molto importante, si chiama Currency, ed è usata per fare calcoli quando i numeri rappresentano il denaro. Tutti i calcoli finanziari possono essere eseguiti con extended, tuttavia, il tipo di variabile a loro dedicata è Currency, e dovresti usare quella.

Currency ha una precisione pari a 4 cifre dopo la virgola che in questo caso non è mobile, ma le quattro cifre sono sempre presenti, sempre e solo 4. Per esempio 10€ verrà memorizzato come 10,0000 se messo in una Currency e se messo in un double sarà semplicemente 10.

Altre variabili

La variabile variant, di cui abbiamo già parlato, al momento, non merita ulteriori approfondimenti e ne parleremo più avanti se servirà farlo...

Esistono altri tipi di variabili, per contenere dati relativi alle date e al tempo e per contenere ogni altro tipo di informazioni, per esempio la variabile Boolean che può contenere solo True e False (vero e falso). È una variabile fondamentale in quanto tra le più usate. Ma anche questa non merita ulteriori approfondimenti rispetto a quanto già visto.

Inizializzazione di variabili

Come e dove dichiarare le variabili lo abbiamo già visto, sia le variabili private e pubbliche che quelle locali (variabili procedurali).

Parliamo ora della inizializzazione di una variabile.

L’inizializzazione di una variabile avviene quando gli assegniamo un valore per la prima volta, alcune variabili, se non inizializzate, hanno valore nullo o un valore predefinito e non potranno essere usate perché genereranno un errore.


  procedure TForm1.Button1Click(Sender: TObject);
    var
      S:string;
  begin
      ShowMessage(S);
  end;

N.B.
Il messaggio sarà vuoto perché una stringa non inizializzata ha lunghezza zero, ma zero non è un valore nullo, zero è zero, quindi un valore noto ma probabilmente inutile ai nostri scopi.


Dobbiamo inizializzare le variabili...
Sempre, dobbiamo farlo sempre, per pulizia di codice e per evitare errori.

Quindi come si fa?
Ecco qui come:


  procedure TForm1.Button1Click(Sender: TObject);
    var
      S:string;
  begin
    S:='Ciao a tutti' // inizializziamo la variabile
    ShowMessage(S);
  end;

  procedure TForm1.Button2Click(Sender: TObject);
    var
      N:integer;
  begin
    N:= 100; // inizializziamo la variabile
    ShowMessage(IntToStr(S));
  end;

N.B.
In questi due esempi sono state dichiarate le variabili e poi sono state inizializzate attribuendogli un valore.
Ecco qua, adesso tutto fila liscio come vogliamo noi!


Conversione tra tipi di variabile

Le variabili contengono solo un tipo di dato, ma a volte abbiamo bisogno di tradurlo affinché venga usato quel certo valore con un altra forma, per esempio un valore numerico che debba essere comunicato con un messaggio di testo (come abbiamo già visto), oppure il contrario, cioè un numero contenuto in un messaggio di testo che debba essere usato per fare un calcolo.

Tieni presente che '10' è diverso da 10, il primo è una stringa che contiene un numero, il secondo è un valore numerico intero.
Abbiamo già visto IntToStr (da intero a stringa) per convertire valori numerici in caratteri di testo.
Esiste anche StrToInt (da stringa a intero) che è il suo esatto opposto.
E se volessimo convertire un valore con virgola mobile?
Ecco arrivare ad aiutarci FloatToStr (da virgola mobile a stringa), e come prima il suo contrario: StrToFloat.

Queste funzioni di conversione sono necessarie perché per computer, ogni cosa è rappresentata da numeri anche '10' che è una stringa, quando viene letta e scritta a livello macchina, è rappresentato da numeri ma vediamo la differenza tra '10' e 10:

In binario
'10' = 100111110001110000100111100000
10 = 0000000000001010

In esadecimale
'10' = 27 31 30 27 20
10 = A

Come vedi, quando lo stesso numero è rappresentato come testo ha, per la macchina, un valore completamente diverso rispetto a quando è rappresentato come valore numerico.
Lo stesso vale per ogni tipo di dato, alla fine possono sembrare identici a noi umani, in realtà, per la macchina sono cose completamente diverse...

Esercitati con l’uso delle variabili e tenta qualche conversione tra tipi di dato!
Buon Divertimento!



Approfondiamo un pochino

Se hai fatto un po’ di esercizio avrai notato che quando converti un intero in una stringa non puoi ottenere un errore, ma quando fai il contrario può succedere che il debugger ti fermi e ti dica che c’è qualcosa che non va.

Infatti se prendiamo questa procedura di esempio non otterrai errori.


  procedure TForm1.Button1Click(Sender: TObject);
    var
      S:String;
      I:Integer;
  begin
    S:= '10'; {S è una stringa che contiene un numero
              quindi è convertibile in intero}
    I:=StrToInt(S); //adesso I contiene il valore numerico espresso da S
  end;


Adesso sostituiamo il valore di S con 'Maria 1', come vedi è una stringa del tutto valida ma se proviamo a convertirla in intero otteniamo un errore di conversione perché 'Maria 1' non è un numero.
Un numero può sempre essere convertito in testo, ma non è vero il contrario!
Occorre verificare prima che il contenuto della stringa sia convertibile o dobbiamo fare qualcosa per intercettare l’errore, o meglio ancora, dovremo scrivere il codice in modo che non vi sia la possibilità che la stringa non sia convertibile!

Un passo alla volta le vediamo tutte.

Assicurarsi che la stringa sia un numero prima di convertirla
TryStrToInt(Stringa, Intero); permette di provare a fare la conversione da stringa a numero, se va tutto bene mette il risultato dentro la variabile Intero.
Vedi l’esempio:


  procedure TForm1.Button12Click(Sender: Tobject);
    var
      S:string;// dichiaro le variabili
      I: integer;
  begin
    S:= '12';
    I:=0; // inizializzo la variabile numerica impostandola a 0
    TryStrToInt(S, I); {passo alla funzione di
                        conversione la stringa e la variabile I}
    ShowMessage(IntToStr(I)); // Ottengo il messaggio
  end;

N.B.
In questo caso la variabile S contiene un numero valido e la funzione di conversione mette dentro a I il valore ottenuto, altrimenti il valore di I resta = 0.
Prova inserendo una stringa non convertibile e vedi cosa succede…


Intercettare l’errore

Il sistema sopra è molto rapido ed elegante, e funziona molto bene, purtroppo, quando non abbiamo idea del numero che verrà fuori, che potrebbe anche essere zero, non sapremo se il risultato sia corretto o meno ogni volta che vedremo uscire lo zero.
Ecco che in questo caso diventa importante intercettare l’errore e informarne l’utente.
Ecco come fare:


  procedure TForm1.Button1Click(Sender: TObject);
    var
      S:string;
      I: integer;
    begin
      S:= 'Maria 1';
    try
      I:=StrToInt(S);
      ShowMessage(IntToStr(I));
    except
      ShowMessage('La stringa conteneva un valore non numerico!') ;
    end;
  end;

N.B.
Attenzione agli spazi: le stringhe '12', ' 12' e '12 ' non sono tutte convertibili in numero.
Gli spazi prima del numero vengono tagliati dalla funzione ma non quelli dopo.
Dovrai farlo tu con l’istruzione Trim (elimina gli spazi prima e dopo la stringa ma non quelli al suo interno).


Esempio finale corretto:


   procedure TForm1.Button1Click(Sender: TObject);
     var
       S:string; I: integer;
   begin
     S:= ' 12 ';
     try
      I:= StrToInt(Trim(S)); // abbiamo sostituito S con Trim(S)
      ShowMessage(inttostr(I));
     except
      ShowMessage('La stringa conteneva un valore non numerico!')
     end;
   end

Esercizio
Prova a sostituire la stringa ' 12 ' con 'Maria 1' e vedi cosa succede


C’è qualcosa su cui non ti senti a posto?
Riguardatelo e fai delle prove, poi fai un po’ di “pasticci” e divertiti facendo pratica con quello che hai imparato fin qui!
N.B.
Da qui in poi non dovresti più avere bisogno dei sorgenti di esempio e potrai realizzarli per tuo conto!
Buon divertimento!


‹ Precedente Successiva ›

Sommario

Sommario