Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 1
Algoritmi di base
{...
MAX=Num; // il primo valore della sequenza è //il ‘primo’ massimo attuale
{ ... // inizia un ciclo per analizzare // gli altri valori nella sequenza
if (Num>MAX) MAX=Num; // aggiorna il massimo attuale // quando trovato un valore // maggiore nella sequenza ....
} // fine ciclo ....
printf (“Massimo = %d”, MAX);
....
}
... Ricerca del valore massimo in una sequenza di valori (ad es. di numeri interi)
Algoritmi di base
{....
MIN=Num; // il primo valore della sequenza è //il ‘primo’ minimo attuale
{... // inizia un ciclo per analizzare // gli altri valori nella sequenza
if (Num<MIN) MIN=Num; // aggiorna il minimoattuale // quando trovato un valore // minore nella sequenza ....
} // fine ciclo ....
printf (“Minimo = %d”, MIN);
...
}
... Ricerca del valore minimo in una sequenza di valori (ad es. di numeri interi)
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 3
{....
Cerca = ... // Inizializza variabile con valore da cercare // e contare occorrenze nella sequenza
....
Volte=0; // Inizializza contatore occorrenze { ... // inizia un ciclo per analizzare // i valori nella sequenza
if (VAL==Cerca)
Volte=Volte+1; // Incrementa contatore occorrenze // ogni volta che il valore è // trovato nella sequenza ...
} // fine ciclo
printf (“Valore %d presente %d volte \n", Cerca, Volte);
....
}
Algoritmi di base
... Ricerca e conteggio occorernze di un dato valore in una sequenza (ad es. di numeri interi)
Algoritmi di base
{....
scanf (“%d”, &N); //legge estremo superiore sommatoria Sommatoria=0; // Inizializza valore della sommatoria for (i=1;i<=N;i++) // ciclo for per calcolare la sommatoria
Sommatoria = Sommatoria + i;
// Incrementa valore di Sommatoria // con il valore i
printf (“Sommatoria = %d \n", Sommatoria);
}
... Calcolo sommatoria dei numeri interi da 1 a N:
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 5
Algoritmi di base
{....
scanf (“%d”, &N); //legge estremo superiore produttoria produttoria=1; // Inizializza valore della produttoria for (i=2;i<=N;i++) // ciclo for per calcolare la produttoria
produttoria = produttoria * i;
// Incrementa valore di produttoria // con il valore i
printf (“Produttoria= %f \n", produttoria);
}
... Calcolo produttoria dei numeri interi da 1 a N:
Algoritmi di base
{....
scanf (“%d”, &N); //legge cardinalità della serie Sommatoria=0; // Inizializza valore della sommatoria for (i=1;i<=N;i++) // ciclo for per calcolare la sommatoria {...
scanf (“%d”, &numero); //legge cardinalità della serie Sommatoria = Sommatoria + numero;
// Incrementa valore di Sommatoria // con il valore i
...
}
printf (“Sommatoria = %d \n", Sommatoria);
}
... Calcolo sommatoria di una serie di N numeri interi
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 7
Algoritmi di base
... qualche considerazione/osservazione ...
... serie/sequenze ‘costruite’ usando una sola variabile ...
... se si volesse fare una nuova elaborazione sulla stessa serie/sequenza ?
... se si volessero stampare tutti i valori della serie/sequenza dopo che sono stati tutti immessi ?
... una serie/sequenza è un insieme di più valori,
... uso di una variabile per ciascun valore ... ???
Necessità di strutture dati che consentono di registrare un insieme di valori .
Tipi strutturati
…. l’informazione può essere decomposta in tipi più semplici ...
…. più informazioni aggregate fra loro in base ad una relazione per costituire una informazione più complessa
Es:
data (giorno, mese, anno)
numero complesso (parte reale, coefficiente immaginario) generalità anagrafiche (cognome, nome, data nascita, indirizzo)
Un tipo strutturato è caratterizzato da:
• tipi componenti
• costruttore
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 9
COSTRUTTORI DI TIPO
Prodotto cartesiano
tipo T = cartesiano (t1, t2, .... , tn)
t1, t2, …, tn: tipi componenti, non necessariemente tutti uguali
forma n-ple ordinate di elementi dei tipi t1,t2, …, tn un tipo strutturato si ottiene mettendo insieme i tipi
componenti attraverso appositi operatori due costruttori:
• prodotto cartesiano
• sequenza
COSTRUTTORI DI TIPO Prodotto cartesiano
… due modi per definire il tipo strutturato:
• indicando solo i tipi componenti tipo T = cartesiano (t1, t2, .... , tn)
tipo complesso: cartesiano(reale, reale) tipo data: cartesiano(intero, intero, intero)
• indicando attributi e tipi componenti
tipo T = cartesiano (a1:t1, a2:t2, .... ,an:tn)
tipo complesso: cartesiano(ParteReale:reale, CoeffImm: reale) tipo data: cartesiano(giorno: intero, mese:intero,anno:intero)
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 11
Sequenza
tipo T = sequenza (t1, t2, ..., tn)
dove t1 = t2 = … = tn tipi componenti tutti uguali COSTRUTTORI DI TIPO
Es.;
parola = sequenza (carattere)
numero decimale = sequenza (cifra decimale) capitolo = sequenza (paragrafi)
coda = sequenza (persone)
Variabili di Tipo strutturato
Una variabile (informazione) di tipo strutturato va dichiarata, come qualsiasi altra variabile, indicandone il tipo ed il nome
<nome_tipo_strutturato> <nome_variabile>;
Es.:
tipo complesso: cartesiano(ParteReale:reale, CoeffImm: reale) complesso Numero;
dichiarazione della variabile di nome Numero di tipo complesso
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 13
Funzione di Accesso
… per potere accedere ad uno degli elementi costituenti la struttura:
• tramite l’indicazione di un attributo:
tipo T = cartesiano (n1:t1, n2:t2, .... ,nk:tk)
indicando con A una informazione del tipo T, con A.nh
si indica l’accesso all’elemento nh (il componente h-esimo) di T Es.:
tipo complesso: cartesiano(ParteReale:reale, CoeffImm: reale) complesso Numero;
Numero.ParteReale
Funzione di Accesso tramite l’indicazione della posizione:
…. Uso di un’informazione indice ...
… indice: informazione di un tipo ordinato ...
Detta A una variabile del tipo strutturato:
A[indice]
indica la componente che occupa la posizione indicata da indice
Es.:
tipo GraduatoriaConcorso:cartesiano(persona, persona, …, persona) GraduatoriaConcorso A;
A[3] indica il componente in terza posizione
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 15
Array monodimensionali
Tipo strutturato praticamente presente in tutti i linguaggi come tipo strutturato primitivo
• Costruttore: Cartesiano
• Tipi componenti: tutti dello stesso tipo
• Funzione d’accesso: per posizione
tipo array monodimensionale = cartesiano(T 1,T 2, … ,T n) con T 1 = T 2 =...= T n = T
bisogna:
definire T, il tipo dei componenti
definire la dimensione (o cardinalità) dell’array
Array monodimensionali
… concettualmente ...
• un nome ‘collettivo’ associato ad un insieme ordinato di elementi tutti dello stesso tipo
• ciascun elemento è direttamente accessibile attraverso una informazione (l’indice) che ne individua la
posizione nella struttura Es.:
classifica campionato: array di squadre graduatoria concorso: array di persone
prenotati esame universitario: array di studenti
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 17
Array monodimensionali
… un modello interpretativo ...
A
[1]
[2]
[3]
[4]
[5]
Valori dell’indice [6]
(posizione componente)
Nome array A[3]
Terzo componente
Accesso diretto ai componenti
Array monodimensionali
… un modello interpretativo ...
Valori dell’indice (posizione componente)
A
[1]
[2]
[3]
[4]
[5]
[6]
34 281 87 623 15 839
Valori elementi array
A[1] = 34 A[3] = 87 A[5] = 15
… non confondere il valore di un elemento dello array con l’indice che esprime la sua posizione in esso …
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 19
Array monodimensionali Parametri caratterizzanti un array:
• Strutturali:
• Nome dello array
• Tipo componente
• Cardinalità: numero di elementi costituenti lo array
Array monodimensionali
Parametri caratterizzanti un array:
• di utilizzo:
• Indice: appartenete ad un tipo ordinato, indica la posizione di un elemento nello array.
Può essere espresso tramite:
• una costante (es. A[4], quarto elemento dello array)
• una variabile (es. A[I], i-esimo elemento dello array)
• una espressione (es. A[c+d*e],
(elemento dello array nella posizione corrispondente al valore di c+d*e)
• Riempimento: numero di elementi effettivamente utilizzati N.B. non confondere Riempimento con Cardinalità Deve sempre essere :
Riempimento Cardinalità
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 21
Array monodimensionali
La dichiarazione di una variabile di tipo array è fatta specificando:
• tipo componente
• nome dello array (nome della variabile)
• cardinalità dello array (racchiusa tra parentesi quadre)
<tipo> <nome_array> [<cardinalità>]
Es.:
int A[10];
float SpesaSettimanale[7];
Array monodimensionali
ad un elemento di un array è possibile assegnare un valore tramite operazioni di:
• lettura Es.:
read(“%d”, A[3]);
legge il valore da assegnare al terzo elemento dello array A
• calcolo e assegnazione Es.:
A[4] = C;
A[I] = 5;
A[I] = f * 9 + d;
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 23
Array monodimensionali
un elemento di un array può essere utilizzato in operazioni di:
• stampa Es.:
write(“%d”, A[3]);
stampa il valore da contenuto nel terzo elemento dello array A
• calcolo e assegnazione Es.:
C = A[4] ;
B= f *9 + d - A[I] ;
• condizione Es.:
if (A[I] > 7) ……
[1]
[2]
[3]
[4]
[5]
[6]
A
21 18 22 5 8
6
B=A[2] + A[4];
printf(“%d --- %d\n”, A[1], A[5]); 18 --- 21
A[1]= 7; =>
A[4]= 41;
[1]
[2]
[3]
[4]
[5]
[6]
21 7 22
5 41
6
=> B=22 + 8=30
Array monodimensionali
……
x = 3;
if (A[x] != 24) printf(“VERO”);
Indici ……
Valori elementi array
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 25
Il tipo stringa di caratteri
• Una stringa di caratteri è una sequenza di caratteri
ASCII, atti a rappresentare una parola, una frase, un testo
• E’ un tipo strutturato costruito con l’operatore sequenza
• Una delle operazioni tipiche sulle stringhe di caratteri è la concatenazione di due o più stringhe, tipicamente
indicata con il simbolo //.
Es.
A=“calcolatore “ B=“elettronico”
C=A//B=“calcolatore elettronico”
Array Bidimensionali
tipo array Bidimensionale= cartesiano(T 1,T 2, … , T n) con T 1 = T 2 =...= T n = T
Tipo T = cartesiano (q1, q2, …, qm) q1=q2= ….. =qm
…. Ovvero un array bidimensionale è un array in cui ciascun elemento è a sua volta un array
… array tutti della stessa dimensione e tipo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 27
Array Bidimensionali
… un modello interpretativo ...
A
Nome array1 2 3 4 5 6
1 2 3 4 5 6 7
Valori dell’indice (posizione componente)
Array Bidimensionali
… la posizione di ciascun elemento è individuata da 2 indici …
… il primo indice, indica la riga … 1
2 3 4 5 6
1 2 3 4 5
[1,1] [1,2] [1,3] [1,4] [1,5]
[2,1] [2,2] [2,3] [2,4] [2,5]
[6,1] [6,2] [6,3] [6,4] [6,5]
A[4,2]
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 29
Array Bidimensionali
… la posizione di ciascun elemento è individuata da 2 indici …
1 2 3 4 5 6
1 2 3 4 5
23 47 63 96 8
27 66 23 44 567
42 28 34 125 47
A[4,2] = 57
57
A[6,3] = 34
… il primo indice, indica la riga …
… il secondo indice, indica la colonna ...
… ciascuna posizione conterrà un (solo) valore …
Array Bidimensionali
Parametri caratterizzanti un array bidimensionale:
• Strutturali:
• Nome dello array
• Tipo componente
• Cardinalità di riga: numero di righe costituenti lo array
• Cardinalità di colonna: numero di colonne costituenti
lo array
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 31
Array Bidimensionali
Parametri caratterizzanti un array bidimensionale:
• di utilizzo:
• Indice di riga: appartenete ad un tipo ordinato
• Indice di colonna: appartenete ad un tipo ordinato
la coppia ordinata [indice di riga, indice di colonna] indica la posizione di un elemento nello array bidimensionale.
Gli indici possono essere espressi tramite:
• una costante (es. A[4,2], elemento in quarta riga e seconda colonna)
• una variabile (es. A[I, J], elemento in riga i-esima e colonna j-esima)
• una espressione (es. A[c+d*e, k],
(elemento dello array nella riga corrispondente al valore di c+d*e, e k-esima colonna)
Array Bidimensionali
Parametri caratterizzanti un array bidimensionale:
• di utilizzo:
• Riempimento: numero di elementi effettivamente utilizzati
• Riempimento di riga
• Riempimento di colonna
N.B. non confondere Riempimento con Cardinalità Deve sempre essere :
indice riga Cardinalità riga
indice colonna Cardinalità colonna Riempimento riga Cardinalità riga
Riempimento colonna Cardinalità colonna
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 33
Array Bidimensionali
La dichiarazione di una variabile di tipo array bidimensionale è fatta specificando:
• tipo componente
• nome dello array (nome della variabile)
• cardinalità di riga e di colonna dello array (racchiusa tra parentesi quadre)
<tipo> <nome_array_bidim> [<cardinalità_riga] [cardinalità_colonna>]
Es.:
int A[10] [15];
float Mat[7] [22];
Array Multidimensionali
… generalizzando opportunamente ….
… un array di array di array di array …. Quante sono le dimensioni
… tutti array dello stesso tipo …
… per ciascuna dimensione, tutti array con stessa cardinalità …
… posizione individuata mediante tanti indici quanti sono le dimensioni
… un indice per ciascuna dimensione ...
<tipo><nome_array_multidim>[<card_dim1] [card_dim2>] …[card_dimK]
Es.:
int A[10] [15] [20];
float Multi [7] [22] [30] [45];
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 35
Il tipo record
• Quando si vogliono rappresentare informazioni che sono collezioni di dati diversi,
– ad esempio:
• un libro è una entità composta da un titolo, un autore, un editore, il testo
• Le generalità anagrafiche di una persona: cognome, nome, data di nascita, luogo di nascita, indirizzo attuale
• Il tipo record è usato per rappresentare e gestire queste collezioni di dati,
• Il tipo record permette di raggruppare le diverse informazioni, elementari o strutturate, che caratterizzano la collezione di dati.
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 37
Il tipo record
• Il record è un tipo strutturato formato da un
predeterminato numero di campi, ciascuno dei quali può essere un tipo semplice o strutturato
• E’ un tipo strutturato costruito con l’operatore prodotto cartesiano
tipo record = cartesiano(a1:T1, a2:T2, …. , an:Tn)
dove a1, …, an sono i nomi dei campi del record e T1, … , Tn i rispettivi tipi anche diversi tra loro
Il tipo record
• dichiarazione in LDP di un tipo record:
record <nome record>=
begin
<nome campo1> :<tipo campo1>;
……
<nome campo_n> : <tipo campo_n>;
end;
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 39
Il tipo record
Es.
record anagrafico = begin
cognome:string;
nome:string;
data_nascita: record begin
giorno:integer;
mese: integer;
anno:integer;
end;
indirizzo:string;
end;
Per indicare un campo del record si usa la notazione:
<nome record>.<nome campo>
Es. anagrafico.nome
Dichiarazione di variabili di tipo record
• E’ simile alla dichiarazione di una qualsiasi altra variabile:
<nome tipo> <nome variabile>;
Es. dichiarazione di una variabile del tipo record anagrafico:
record anagrafico persona;
“persona” è una variabile del tipo record anagrafico
Ciascuna variabile persona è composta dai campi del tipo anagrafico Es: persona.cognome
persona.nome
persona.data_nascita.mese
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 41
Tipo strutturato File
• Tipo strutturato formato da un insieme di elementi tutti dello stesso tipo
• Gli elementi sono registrati su un supporto di memoria di massa
• Individuato da un nome
• Caratterizzato da un metodo di accesso ai suoi elementi (detti genericamente records)
- File ad accesso Sequenziale - File ad accesso Diretto
Accesso sequenziale
Per accedere all' N-mo record bisogna accedere agli N-1 record precedenti (nastro)
Accesso diretto
Individuazione ed accesso diretti ad un record tramite:
- o il riferimento alla sua posizione - o i valori di uno o piu' campi (chiavi)
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 43
FILE SEQUENZIALE
• è una sequenza di oggetti tutti dello stesso tipo T …
• ..ed una ulteriore informazione di tipo T che diremo buffer ed indicheremo con f
• la definizione è completata con le operazioni caratteristiche del tipo file sequenziale
• Operazioni possibili su un file sequenziale:
• Inserimento di un nuovo elemento (WRITEF)
• Lettura degli elementi (READF)
• Riposizionamento all’inizio del file (RESET)
• Riscrittura del file (REWRITE)
• Verifica di fine file (EOF)
operazione WRITEF(f)
• è una operazione di inserzione che modifica lo stato del file
• inserzione del valore del buffer alla fine di f; il buffer avrà valore indefinito dopo l’operazione
… prima di WRITEF(f) ...
f =
f x
… dopo WRITEF (f) ...
f =
a b c d
a b c d x
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 45
...una osservazione
• in ogni istante la sequenza di oggetti di un file f può essere vista come concatenazione di altre due sequenze
....una parte sinistra fs ed una parte destra fd ....
f = f
s/ f
doperazione READF(f)
non modifica il contenuto del file f, ma quello del buffer con un valore di f ben definito, inoltre... modifica ...sinistra..e destra..
f=
f ?
fs fd
… prima di READF(f)...
… dopo READF(f) ...
f f c
fs fd
Nel buffer sarà presente il primo elemento di fd
a b c d
a b c d
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 47
operazione RESET (f)
• posiziona il buffer sul primo elemento del file la parte sinistra risulterà vuota
… prima di RESET (f) ...
… dopo RESET(f) ... f =
f a fs fd f =
f ?
fs fd
a b c d
a b c d
f = f ?
… prima di REWRITE ...
… dopo REWRITE(f) ... f = < >
f ? operazione REWRITE (f)
• cancella gli elementi del file svuotandolo
a b c d
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 49
il predicato EOF (f)
E’ usato per verificare se si è raggiunta la fine del file EOF = End Of File
• EOF(f)
• TRUE se la parte destra della sequenza è vuota
• FALSE se non lo è
Alcune regole
Dopo un RESET sono possibili solo operazioni di READF Dopo un REWRITE sono possibili solo operazioni di WRITEF Non è possibile mescolare/alternare operazioni di WRITEF e READF Generazione di un File:
un REWRITE seguito da una o più operazioni di WRITEF Visita (ispezione/lettura) di un FILE:
un RESET seguito da una o più operazioni di READF, fino alla fine del file