Pascal/Tipi di dati: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Ramac (discussione | contributi)
per ora così
Ramac (discussione | contributi)
+ esercizi
Riga 93:
* ''or'' che rappresenta <math>{}\vee{}</math> e ''oppure''
* ''not'' operatore che corrisponde alla negazione
* ''xor'' che corrisponde matematicamente all'''aut'', ovvero(simbolo matematico <math>{}\dot{\vee}{}</math>), cioè il concetto di ''o uno, o l'altro, ma non tutti e due''.
 
Le variabili di tipo booleano si dichiarano con la parola riservata ''boolean''.
Riga 162:
 
== Riassumendo ==
{| {{prettytable}} width="100%"
|+ Operazioni, operatori e funzioni
! Operatore !! Operandi !! Risultato
Riga 232:
true > false
 
== TipiEstensioni didei dati definiti dall'utentenativi ==
Alcuni compilatori moderni forniscono delle estensioni dei dati nativi, per ovviare ad esempio alla limitatezza degli ''integer'': un esempio è il tipo di dato ''longint'', disponibile in alcuni compilatori, che ha le stesse caratteristiche degli ''integer'' ma ammette numeri in un intervallo molto maggiore.
 
== Esercizi ==
Abbiamo già visto prima che per dichiarare una variabile si deve specificare un tipo (ad esempio, integer o real) per indicare quali valori può assumere.<br7>
* Scrivere un programma che prenda una misura di tempo in secondi e la scriva in giorni, ore, minuti e secondi.
In alcuni casi può essere utile ricorrere a tipi di dati non predefiniti, ma creati dall'utente: si può ricorrere quindi ad una ''dichiarazione di tipo'' con la parola riservata '''''type'''''.
{{cassetto|titolo=Soluzione|testo=
<br/>La sintassi è
<source lang=pascal>
program secondi;
type
var giorni, ore, min, sec: integer;
nome: valori_possibili;
totsecondi, totminuti, totore: longint;
begin
write('Introduci il tempo, espresso in secondi: '); readln(totsecondi);
totminuti := totsecondi div 60;
sec := totsecondi mod 60;
totore := totminuti div 60;
min := totminuti mod 60;
giorni := totore div 24;
ore := totore mod 24;
writeln(totsecondi, ' secondi equivalgono a ', giorni, ' giorno/i, ', ore, ' ora/e, ', min, ' minuti e ', sec, ' secondi.');
readln;
end.
</source>
}}
che definisce il tipo di dato ''nome''.
* Scrivere un programma che faccia il contrario, converta cioè una misura espressa in giorni, ore, minuti e secondi in secondi.
<br/>Per indicare quindi che una variabile è del tipo ''nome'' si usa la sintassi:
{{cassetto|titolo=Soluzione|testo=
<source lang=pascal>
var
variabile:nome;
</source>
 
=== Tipi enumerativi ===
Il più semplice tipo di dichiarazione ''type'' è quella dei '''tipi enumerativi''', che consentono cioè un numero ristretto div valori, definiti singolarmente dall'utente:
<source lang=pascal>
type
nome:(elemento_1, elemento_2,...,elemento_n);
</source>
 
dove elemento_1,elemento_2,...,elemento_n sono i possibile valori che possono assumere le variabili del tipo di dato ''nome'' elencati in ordine.
<br/>Per fare un esempio, possiamo definire un tipo:
 
<source lang=pascal>
type
mesi: (gen, feb, mar, apr, mag, giu, lug, ago, set, ott, nov, dic);
</source>
 
e dichiarare due variabili
 
<source lang=pascal>
var
mese_di_nascita_luigi, mese_di_nascita_gianni:mesi;
</source>
 
Se corso del programma poniamo
 
<source lang=pascal>
mese_di_nascita_luigi:= feb;
mese_di_nascita_gianni:= ago;
</source>
 
avremo che: l'istruzione <code>writeln(mese_di_nascita_luigi);</code> stampa sullo schermo ''feb''; l'espressione <code>mese_di_nascita_luigi < mese_di_nascita_gianni</code> restituisce TRUE, in quanto feb precede ago nella lista dei mesi indicata nella dichiarazione. Allo stesso modo <code>giu > set</code> restituisce invece FALSE.
 
=== Subrange ===
I '''''subrange''''' sono tipi di dati che sono definiti come sottoinsiemi di altri tipi. Ad esempio:
<source lang=pascal>
type
cifra: 0..9
mese_primaverile: marzo..giugno;
lettera: 'a'..'z';
</source>
Abbiamo definito tre dati subrange: il primo tipo permette tutti i numeri dallo 0 al 9, il secondo tutti i mesi (da gennaio a dicembre) e il terzo tutti i caratteri da "a" a "z". Come si può intuire:
* una definizione di un subrange è costituita da un '''limite''' inferiore e uno superiore
* un subrange non è valido se il limite inferiore è maggiore o uguale a quello superiore (ad esempio non è valido il subrange <code>9..5</code>)
* i due limiti devono essere dello stesso tipo di dato (interi, ''char'', o anche definiti dall'utente, come nel caso di <code>mese_primaverile</code> che è un subrange del tipo ''mesi'' definito in precedenza)
 
Una volta definito, lo possiamo utilizzare:
<source lang=pascal>
program secondi2;
var mese: mese_primaverile;
var giorni, ore, min, sec: integer;
totsecondi: longint;
begin
writeln('Introduci il tempo: ');
write(' giorni: '); readln(giorni);
write(' ore: '); readln(ore);
write(' minuti: '); readln(min);
write(' secondi: '); readln(sec);
totsecondi := sec;
totsecondi := totsecondi + min * 60;
totsecondi := totsecondi + ore * 60 * 60;
totsecondi := totsecondi + giorni * 60 * 60 * 24;
writeln(giorni, ' giorno/i, ', ore, ' ora/e, ', min, ' minuti e ', sec, ' secondi equivalgono a ', totsecondi, ' secondi.');
readln;
end.
</source>
}}
In questo caso ad esempio si possono effettuare dichiarazioni come <code>mese := marzo;</code> ma non <code>mese: ottobre;</code>.
 
[[Categoria:Pascal|Tipi di dati]]
{{avanzamentoAvanzamento|100%|31 dicembre 2007}}