1.
Sia dato un file di testo riguardante un insieme di studenti di cui è fornito il
cognome e il nome seguito dalla data di nascita, giorno mese anno dalla
matricola, dall’anno di corso e da un array dei voti riportati.
Il file sarà perciò così composto:
Rossi
Ugo
Bianchi Carlo
3
12
5
2
1972 480/8796
1971 480/8746
II
I
25 23 29 28
30 25 18 27
………………………………………………………………………………………
…………………………………………………………………………………………
…………………………………………………………………………………………
<eof>
Leggere il file mostrando a video i nomi ordinati per media dei voti riportati e per
cognome.
I TIPI
Integer,
Real,
Char,
String,
Array,
Enumerated,
…………..
RECORD
Record: una struttura in cui sono contenuti dati di tipo diverso,
interi, stringhe, reali, vettori, record,….
Si può accedere ai dati di un record facendo riferimento al nome
del dato.
Definizione di RECORD
identificatore
=
RECORD
Lista dei
campi
END
TYPE
NomeRecord = RECORD
AnagraficaRecord = RECORD
Cognome,
Nome : Stringa20
END;
Campo1: integer,
………..
CampoN: real
END;
ESEMPIO
Studente
Anagrafe
Matricola AnnoCorso Risultati
Nascita
Cognome Nome Giorno Mese Anno
Studente
Anagrafe
Nascita
Matricola AnnoCorsoRisultati Media
Cognome Nome Giorno Mese Anno
Rossi
Ugo
Bianchi Carlo
3
12
5
2
1972 480/8796
1971 480/8746
II
I
25 23 29 28
30 25 18 27
Media
Studente
Anagrafe
Nascita
Matricola AnnoCorsoRisultati Media
Cognome Nome Giorno Mese Anno
StudenteRecord = RECORD
Anagrafe:AnagraficaRecord;
Nascita:DataRecord;
Matricola:Stringa20;
AnnoCorso:Stringa20;
Risultati:RisultatiArray;
Media:real;
END;
TYPE
Stringa20 = STRING[20]
RisultatiArray=ARRAY[1..TotaleProve] OF integer;
DataRecord = RECORD
Giorno,
Mese,
Anno : integer
END;
AnagraficaRecord = RECORD
Cognome,
Nome : Stringa20
END;
TYPE
Stringa20 = STRING[20]
RisultatiArray=ARRAY[1..TotaleProve] OF integer;
AnagraficaRecord = RECORD
Cognome,
Nome : Stringa20
END;
DataRecord = RECORD
Giorno,
Mese,
Anno : integer
END;
StudenteRecord = RECORD
Anagrafe:AnagraficaRecord;
Nascita:DataRecord;
Matricola:StringaNome;
AnnoCorso:StringaNome;
Risultati:RisultatiArray;
Media:real;
END;
VAR
Compleanno:DataRecord;
DatiStudente:StudenteRecord;
UnoStudente:AnagraficaRecord;
Studente
Anagrafe
Nascita
Matricola AnnoCorsoRisultati Media
Cognome Nome Giorno Mese Anno
Rossi
Ugo
Bianchi Carlo
3
12
5
2
1972 566/879
1971 566/874
II°
I°
25 23 29 28 26,25
30 25 18 27 25,00
STRUTTURA DATI
E’ possibile trattare i dati
usando i nome dei campi.
writeln(‘Lo studente ‘,
Studente.Anagrafe.Cognome,’ e’’ nato il ‘,
Studente.Nascita.Giorno:1,
Studente.Nascita.Mese:1,
Studente.Nascita.Anno:1)
AnagraficaRecord = RECORD
Cognome,
Nome : Stringa20
END;
DataRecord = RECORD
Giorno,
Mese,
Anno : integer
END;
StudenteRecord = RECORD
Anagrafe:AnagraficaRecord;
Nascita:DataRecord;
Matricola:StringaNome;
AnnoCorso:StringaNome;
Risultati:RisultatiArray;
Media:real;
END;
UN ESERCIZIO DI MOD.A
Siano dati due file testo: studenti.txt e tesi.txt. Il primo contiene informazioni riguardanti tutti
gli studenti di un corso di laurea; il secondo contiene informazioni riguardanti i soli studenti
del medesimo corso di laurea che hanno già fatto richiesta della tesi. Le informazioni per ogni
studente sono così strutturate:
Studenti.txt
Matricola (intero)<eoln>
Cognome e nome<eoln>
Esami sostenuti (intero) Esami da sostenere (intero)<eoln>
Nome esame sostenuto^ voto (intero)<eoln>
…
Nome esame sostenuto^ voto (intero)<eoln>
Tesi.txt
Matricola (intero)<eoln>
Cognome e nome<eoln>
Entrambi i file sono ordinati per numero di matricola crescente. Scrivere una procedura che
mostri a video la matricola e la media di tutti gli studenti che hanno richiesto la tesi e che
hanno svolto tutti gli esami.
Studenti.txt
Matricola (intero)<eoln>
Cognome e nome<eoln>
Esami sostenuti (intero) Esami da sostenere (intero)<eoln>
Nome esame sostenuto^ voto (intero)<eoln>
…
Nome esame sostenuto^ voto (intero)<eoln>
Esempio
Studenti.txt
4010<eoln>
Rossi Marco<eoln>
18 0<eoln>
…
Nome esame sostenuto^ 26<eoln>
4050<eoln>
Antonio Neri<eoln>
10 8<eoln>
…
Nome esame sostenuto^ 22<eoln>
4060<eoln>
Bianchi Matteo<eoln>
16 2<eoln>
…
Nome esame sostenuto^ 23<eoln><eof>
Tesi.txt
Matricola (intero)<eoln>
Cognome e nome<eoln>
Tesi.txt
4010<eoln>
Rossi Marco<eoln>
4060<eoln>
Bianchi Matteo<eoln><eof>
L’output sarà: 4010 seguito dalla media
CONST
TotaleProve=25;
TYPE
Stringa20 = STRING[20]
NomiArray=ARRAY[1..TotaleProve] OF stringa20;
VotiArray=ARRAY[1..TotaleProve] OF integer;
AnagraficaRecord = RECORD
Cognome,
Nome : Stringa20
END;
NumEsRecord = RECORD
Sostenuti,
Sostenere:integer;
END;
SostenutiRecord = RECORD
Esame:NomiArray,
Voti:VotoArray;
StudenteRecord = RECORD
Matricola:StringaNome;
Anagrafe:AnagraficaRecord;
NumEsami:NumEsRecord;
EsamiSost:SostenutiRecord;
END;
USO DELLE VARIABILI RECORD
VAR DataOdierna : DataRecord;
DataRecord = RECORD
Giorno,
Mese,
Anno : integer
END;
FUNCTION DataValida(Data:DataRecord):boolean;
BEGIN
DataValida:=(Data.Mese IN [1..12]) AND (Data.Giorno IN [1..31])
END;
REPEAT
writeln(‘ Introduci la data ‘);
readln(DataOdierna.Giorno, DataOdierna.Mese, DataOdierna.Anno)
UNTIL DataValida(DataOdierna);
Aggiornare la funzione tenendo conto dei mesi di lunghezza variabile
e degli anni bisestili
Problema
Assegnato un file del tipo prima descritto, scrivere una procedura che
mostri i dati di tutti gli studenti.
Studente
Pseudo Codice Main
Apri il file dati in lettura
Carica i dati e mostrali
Pseudo Codice Carica dati
Per ogni studente
Carica record studente
Pseudo Codice
CaricaRecordStudente
Leggi Cognome
Leggi Nome
Leggi Data Nascita
Leggi Matricola, AnnoCorso
Leggi Risultati
Anagrafe
Nascita
MatricolaAnnoCorso
RisultatiMedia
Cognome Nome Giorno Mese Anno
STRUTTURA DATI
AnagraficaRecord = RECORD
Cognome,
Nome : Stringa20
END;
DatataRecord = RECORD
Giorno,
Mese,
Anno : integer
END;
StudenteRecord = RECORD
Anagrafe:AnagraficaRecord;
Nascita:DataRecord;
Matricola:StringaNome;
AnnoCorso:StringaNome;
Risultati:RisultatiArray;
Media:real;
END;
INPUT da File .txt
5
Rossi Carlo 30 11 1968
480/564 II 30 28 18 25
Rossi Lucio 12 10 1969
050/884 I 18 25 22 21
Bianchi Ugo 5 4 1965
050/741 I 18 18 18 18
Verdi Carlo 14 12 1970
480/88 II 30 29 28 30
Esposito Franco 2 8 1969
050/524 I 25 27 29 30
RAPPRESENTAZIONE GRAFICA
Apri il file dati in lettura
Carica Dati
Costruisci Record Studenti
Cognome
Leggi
Cognome
Nome
Matr
Anno
Leggi
Nome
Mese
Giorno
Leggi
Giorno
Leggi
Mese
Leggi
Matr
Leggi
Anno
Corso
Leggi
Corso
Risultati
Leggi
Risultati
Cognome
Nome
Giorno
Mese
Anno
Matr
Corso
Risultati
Scrivi
PROGRAM Txtrecord(output,Studenti);
CONST
Sentinella=' ';
TYPE
LunMax=40;
StringaNome=STRING[LunMax];
TotaleProve=4;
RisultatiArray=ARRAY[1..TotaleProve] OF integer;
MassimoStud=150;
AnagraficaRecord=RECORD
Cognome,
Nome:StringaNome;
END;
NascitaRecord=RECORD
Giorno,
Mese,
Anno:integer;
END;
StudenteRecord=RECORD
Anagrafe:AnagraficaRecord;
Nascita:NascitaRecord;
Matricola:StringaNome;
AnnoCorso:StringaNome;
Risultati:RisultatiArray;
VAR
Media:real;
Iscritti,IndiceArray:IndiceTipo;
END;
StudentiFile:text;
IndiceTipo=0..MassimoStud;
UnoStudente:StudenteRecord;
MAIN
BEGIN
assign(StudentiFile,'C:\TP\ESEMPI\cap12\STUDREC.TXT');
reset(StudentiFile);
CaricaDati(Iscritti,UnoStudente,StudentiFile);
readln
END.
PROCEDURE CaricaDati(VAR Iscritti:IndiceTipo;
VAR UnoStudente:StudenteRecord; VAR StudentiFile:text);
VAR
Indice:IndiceTipo;
BEGIN
readln(StudentiFile,Iscritti);
FOR Indice:=1 TO Iscritti DO
CostruisciRecordStudente(UnoStudente,StudentiFile)
END;
PROCEDURE CostruisciRecordStudente(VAR UnoStudente:StudenteRecord;
VAR StudentiFile:text);
VAR
NumeroProva:integer;
BEGIN
LeggiParola(' ',Unostudente.Anagrafe.Cognome, StudentiFile);
LeggiParola(' ', Unostudente.Anagrafe.Nome, StudentiFile);
read(StudentiFile,Unostudente.Nascita.Giorno);
read(StudentiFile,Unostudente.Nascita.Mese);
read(StudentiFile,Unostudente.Nascita.Anno);
readln(StudentiFile);
LeggiParola(' ',Unostudente.Matricola, StudentiFile);
LeggiParola(' ',Unostudente.AnnoCorso, StudentiFile);
FOR NumeroProva:=1 TO TotaleProve DO
read(StudentiFile,Unostudente.Risultati[NumeroProva]);
readln(StudentiFile);
writeln('Lo studente ',Unostudente.Anagrafe.Cognome,' ',
Unostudente.Anagrafe.Nome,' Matr. ', Unostudente.Matricola);
writeln(' Nato il ',
Unostudente.Nascita.Giorno,'/', Unostudente.Nascita.Mese,'/',Unostudente.Nascita. Anno
' e'' iscritto al ',Unostudente.AnnoCorso,'ø anno di corso');
END;
writeln
END;
PROCEDURE LeggiParola(Sentinella:char;VAR Parola:StringaNome;
VAR Studenti:text);
VAR
Carattere:char;
BEGIN
Parola:='';
read(Studenti,Carattere);
WHILE (Carattere<>Sentinella) DO
BEGIN
Parola:=Parola+Carattere;
read(Studenti,Carattere);
END
END;
L’ISTRUZIONE WITH
Seleziona diversi campi di un record usando solo un riferimento.
WITH
variabile
.
BEGIN
WITH Nome1,Nome2,… DO
BEGIN
………………...
END;
DO
istruzioni
USO DI WITH
Studente
Anagrafe
Nascita
Matricola AnnoCorsoRisultati Media
Cognome Nome Giorno Mese Anno
PROCEDURE CostruisciRecordStudente(VAR UnoStudente:StudenteRecord;
VAR StudentiFile:text);
VAR
NumeroProva:integer;
BEGIN
WITH UnoStudente DO
BEGIN
LeggiParola(' ',Matricola, StudentiFile);
LeggiParola(' ',AnnoCorso, StudentiFile);
END
END;
WITH ANNIDATI
Studente
Anagrafe
Nascita
Matricola AnnoCorsoRisultati Media
Cognome Nome Giorno Mese Anno
PROCEDURE CostruisciRecordStudente(UnoStudente:StudenteRecord;
VAR StudentiFile:text);
VAR
NumeroProva:integer;
BEGIN
WITH UnoStudente DO
WITH Anagrafe DO
BEGIN
LeggiParola(' ',Cognome, StudentiFile);
LeggiParola(' ',Nome, StudentiFile);
END
END;
Studente
Anagrafe
Nascita
Matricola AnnoCorsoRisultati Media
Cognome Nome Giorno Mese Anno
PROCEDURE CostruisciRecordStudente(UnoStudente:StudenteRecord;
VAR StudentiFile:text);
VAR
NumeroProva:integer;
BEGIN
WITH UnoStudente, Anagrafe, Nascita DO
BEGIN
LeggiParola(' ',Cognome, StudentiFile);
LeggiParola(' ',Nome, StudentiFile);
read(StudentiFile,Giorno);
read(StudentiFile,Mese);
read(StudentiFile,Anno);
readln(StudentiFile);
LeggiParola(' ',Matricola, StudentiFile);
LeggiParola(' ',AnnoCorso, StudentiFile);
END
END;
ATTENZIONE l’uso del WITH produce codici meno leggibili
(es. non è sempre chiaro se una variabile è il nome di un campo
o una variabile globale) e quindi aumenta la probabilità di errore.
PROCEDURE CostruisciRecordStudente(UnoStudente:StudenteRecord;
VAR StudentiFile:text);
VAR
NumeroProva:integer;
BEGIN
WITH UnoStudente, Anagrafe, Nascita DO
BEGIN
LeggiParola(' ',Cognome, StudentiFile);
LeggiParola(' ',Nome, StudentiFile);
read(StudentiFile,Giorno);
read(StudentiFile,Mese);
read(StudentiFile,Anno);
readln(StudentiFile);
LeggiParola(' ',Matricola, StudentiFile);
LeggiParola(' ',AnnoCorso, StudentiFile);
END
END;
ARRAY Corso
Anagrafica
Nascita
Matricola AnnoCorsoRisultati Media
1
Cognome Nome Giorno Mese Anno
Anagrafica
Nascita
Matricola AnnoCorsoRisultati Media
2
Cognome Nome Giorno Mese Anno
3
Anagrafica
Nascita
Matricola AnnoCorsoRisultati Media
Cognome Nome Giorno Mese Anno
4
Anagrafica
Nascita
Matricola AnnoCorsoRisultati Media
Cognome Nome Giorno Mese Anno
ARRAY Risultati
Rossi Carlo 30 11 1968
480/564 II 30
28
18
25
1
2
3
4
UN ESERCIZIO DI MOD.A
Siano dati due file testo: studenti.txt e tesi.txt. Il primo contiene informazioni riguardanti tutti
gli studenti di un corso di laurea; il secondo contiene informazioni riguardanti i soli studenti del
medesimo corso di laurea che hanno già fatto richiesta della tesi. Le informazioni per ogni
studente sono così strutturate:
Studenti.txt
Matricola (intero)<eoln>
Cognome e nome<eoln>
Esami sostenuti (intero) Esami da sostenere (intero)<eoln>
Nome esame sostenuto^ voto (intero)<eoln>
…
Nome esame sostenuto^ voto (intero)<eoln>
Tesi.txt
Matricola (intero)<eoln>
Cognome e nome<eoln>
Entrambi i file sono ordinati per numero di matricola crescente. Scrivere una procedura che
mostri a video la matricola e la media di tutti gli studenti che hanno richiesto la tesi e che hanno
svolto tutti gli esami.
Studenti.txt
Matricola (intero)<eoln>
Cognome e nome<eoln>
Esami sostenuti (intero) Esami da sostenere (intero)<eoln>
Nome esame sostenuto^ voto (intero)<eoln>
…
Nome esame sostenuto^ voto (intero)<eoln>
Studente
Matricola
Anagrafe
NumEsami
Cogn Nom
S.ti S.re
EsamiSost
Esami
Voti
Studente
Matricola
Anagrafe
NumEsami
EsamiSost
Cogn Nom
S.ti S.re
Prove
Esame
Voto
Tesi.txt
Matricola (intero)<eoln>
Cognome e nome<eoln>
CONST
TotaleProve=25;
TYPE
Stringa20 = STRING[20]
NomiArray=ARRAY[1..TotaleProve] OF
stringa20;
VotiArray=ARRAY[1..TotaleProve] OF integer;
AnagraficaRecord = RECORD
Cognome,
Nome : Stringa20
END;
NumEsRecord = RECORD
Sostenuti,
Sostenere:integer;
END;
SostenutiRecord = RECORD
Esame:NomiArray,
Voti:VotoArray;
END;
StudenteRecord = RECORD
Matricola:StringaNome;
Anagrafe:AnagraficaRecord;
NumEsami:NumEsRecord;
EsamiSost:SostenutiRecord;
END;
CONST
TotaleProve=25;
TYPE
Stringa20 = STRING[20]
Prove = RECORD
Esame:
StringaNome;
Voto:
Integer;
END;
ProveArray = ARRAY[TotaleProve] OF Prove;
AnagraficaRecord = RECORD
Cognome,
Nome : Stringa20
END;
NumEsRecord = RECORD
Sostenuti,
Sostenere:integer;
END;
StudenteRecord = RECORD
Matricola:StringaNome;
Anagrafe:AnagraficaRecord;
NumEsami:NumEsRecord;
EsamiSost:ProveArray;
END;
INPUT 
5
Rossi Carlo 30 11 1968
480/564 II 30 28 18 25
Rossi Lucio 12 10 1969
050/884 I 18 25 22 21
Bianchi Ugo 5 4 1965
050/741 I 18 18 18 18
Verdi Carlo 14 12 1970
480/88 II 30 29 28 30
Esposito Franco 2 8 1969
050/524 I 25 27 29 30
PROBLEMA
Dato il file testo STUDREC.TXT
5
Rossi Carlo 30 11 1968
480/564 II 30 28 18 25
Rossi Lucio 12 10 1969
050/884 I 18 25 22 21
Bianchi Ugo 5 4 1965
050/741 I 18 18 18 18
Verdi Carlo 14 12 1970
480/88 II 30 29 28 30
Esposito Franco 2 8 1969
050/524 I 25 27 29 30
Scrivere un programma che:
a- elenca gli studenti con i loro dati
b- se richiesto mostra la media di un preassegnato studente
c- se richiesto mostra lo studente con la media migliore
ALGORITMO
•Costruisci un array (Corso) con i dati contenuti nel file
•Stampa i dati a partire dall’array (Corso)
•Chiedi cosa si desidera e esegui:
•CercaMediaStudente
•CercaMigliorStudente
•Cerca gli studenti con media superiore a un prefissato valore
INPUT 
OUTPUT

5
Rossi Carlo 30 11 1968
480/564 II 30 28 18 25
Rossi Lucio 12 10 1969
050/884 I 18 25 22 21
Bianchi Ugo 5 4 1965
050/741 I 18 18 18 18
Verdi Carlo 14 12 1970
480/88 II 30 29 28 30
Esposito Franco 2 8 1969
050/524 I 25 27 29 30
Lo studente Rossi Carlo Matr. 480/564
Nato il 30/11/1968 iscritto al II° anno di corso ha una media di 25.25
Lo studente Rossi Lucio Matr. 050/884
Nato il 12/10/1969 iscritto al I° anno di corso ha una media di 21.50
Lo studente Bianchi Ugo Matr. 050/741
Nato il 5/4/1965 iscritto al I° anno di corso ha una media di 18.00
Lo studente Verdi Carlo Matr. 480/88
Nato il 14/12/1970 iscritto al II° anno di corso ha una media di 29.25
Lo studente Esposito Franco Matr. 050/524
Nato il 2/8/1969 iscritto al I° anno di corso ha una media di 27.75
RAPPRESENTAZIONE GRAFICA
Apri il file
dati in lettura
CostruisciCorso
CercaMedia
Studente
CercaMigliore
IndiceMigliore
IndiceMigliore
Costruisci Record Studenti
IndiceStudente
boolean
Leggi
Dati
Leggi Array
Risultati
Media
Risultati
Cognome
Nome
Giorno
Mese
Anno
Matr
AnnoCorso
Risultati
CercaNome
Media
Cognome Nome
Giorno Mese Anno
Matr
AnnoCorso
Media
Risultati
Scrivi
CercaInsieme
PROGRAM Txtrecord(output,Studenti);
CONST
Sentinella=' ';
LunMax=40;
TotaleProve=3;
MassimoStud=250;
TYPE
StringaNome=STRING[LunMax];
RisultatiArray=ARRAY[1..TotaleProve] OF integer;
AnagraficaRecord=RECORD
Cognome,Nome:StringaNome;
END;
NascitaRecord=RECORD
Giorno,
Mese,
Anno:integer;
END;
StudenteRecord=RECORD
Anagrafe:AnagraficaRecord;
Nascita:NascitaRecord;
Matricola:StringaNome;
AnnoCorso:StringaNome;
Risultati:RisultatiArray;
Media:real;
END;
IndiceTipo=0..MassimoStud;
CorsoArray=ARRAY[IndiceTipo] OF StudenteRecord;
MAIN
BEGIN
assign(StudentiFile,'C:\TP\ESEMPI\moda\cap12\STUD2001.TXT');
reset(StudentiFile);
CostruisciCorso(Iscritti,Corso,StudentiFile);
writeln('1 - Mostra la media di un dato studente ');
writeln('2 - Mostra il miglior studente del corso ');
writeln('3 - Mostra tutti gli studenti che hanno una media superiore
a un dato valore');
readln(Scelta);
CASE Scelta OF
1:CercaMediaStudente(Iscritti,Corso);
2:CercaMigliore(Corso,Iscritti);
3:CercaInsieme(Corso,Iscritti)
END;
readln
END.
CostruisciCorso
• Inserisci nell’array monodimensionale Corso i record studenti mediante la
procedura CostruisciRecordStudente
CostruisciRecordStudente
•Leggi l’anagrafica con la procedura LeggiParola
•Leggi Giorno, Mese, Anno
•Leggi Matricola
•Leggi AnnoCorso
•Leggi ArrayRisultati
•Fai la media delle prove
•Mostra i dati dello studente
PROCEDURE CostruisciCorso(VAR Iscritti:IndiceTipo;VAR Corso:CorsoArray;
VAR StudentiFile:text);
VAR
Indice:IndiceTipo;
BEGIN
readln(StudentiFile,Iscritti);
FOR Indice:=1 TO Iscritti DO
CostruisciRecordStudente(Corso[Indice],StudentiFile)
END;
PROCEDURE CostruisciRecordStudente(VAR UnoStudente:StudenteRecord;
VAR StudentiFile:text);
VAR
NumeroProva:integer;
BEGIN
WITH UnoStudente, Anagrafe, Nascita DO
BEGIN
LeggiParola(' ',Cognome, StudentiFile);
LeggiParola(' ',Nome, StudentiFile);
read(StudentiFile,Giorno);
read(StudentiFile,Mese);
read(StudentiFile,Anno);
readln(StudentiFile);
LeggiParola(' ',Matricola, StudentiFile);
LeggiParola(' ',AnnoCorso, StudentiFile);
FOR NumeroProva:=1 TO TotaleProve DO
read(StudentiFile,Risultati[NumeroProva]);
readln(StudentiFile);
Media:=MediaProve(Risultati);
writeln('Lo studente ',Cognome,' ',Nome,' Matr. ',Matricola);
writeln(' Nato il ',Giorno,'/',Mese,'/',Anno,' iscritto al ',
AnnoCorso,'ø anno di corso',' ha una media di ',Media:3:2);
writeln
END
END;
FUNCTION MediaProve(Risultati:RisultatiArray):real;
VAR
NumProva,
Somma:integer;
Media:real;
BEGIN
Somma:=0;
FOR NumProva:=1 TO TotaleProve DO
Somma:=Somma+Risultati[NumProva];
MediaProve:=Somma/TotaleProve
END;
PROCEDURE LeggiParola(Sentinella:char;VAR Parola:StringaNome;
VAR Studenti:text);
VAR
Carattere:char;
BEGIN
Parola:='';
read(Studenti,Carattere);
WHILE (Carattere<>Sentinella) DO
BEGIN
Parola:=Parola+Carattere;
read(Studenti,Carattere);
END
END;
CercaMediaStudente
•Leggi Nome e Cognome dello studente
•Usando l’array Corso cerca il record con i suoi dati
•Stampa la media richiesta ricavata dall’array Corso
PROCEDURE CercaMediaStudente(VAR Iscritti:IndiceTipo;VAR
Corso:CorsoArray);
VAR
NomeCercato:AnagraficaRecord;
BEGIN
writeln;
writeln('Cerca lo studente: Cognome ');
readln(NomeCercato.Cognome);
writeln('Nome ');
readln(NomeCercato.Nome);
IndiceArray:=IndiceStudente(Iscritti,Corso,NomeCercato);
IF IndiceArray<>0 THEN
writeln('Lo studente ',Corso[IndiceArray].Anagrafe.Nome,' ',
Corso[IndiceArray].Anagrafe.Cognome,' ha una media di ',
Corso[IndiceArray].Media:3:2)
END;
FUNCTION IndiceStudente(VAR Iscritti:IndiceTipo;
VAR Corso:CorsoArray;NomeCercato:AnagraficaRecord):IndiceTipo;
VAR
Sonda:IndiceTipo;
BEGIN
Corso[0].Anagrafe:=NomeCercato;
Sonda:=Iscritti;
WHILE NOT CercaNome(Corso[Sonda].Anagrafe,NomeCercato) DO
Sonda:=Sonda-1;
IndiceStudente:=Sonda
END;
FUNCTION CercaNome(Anagrafe1,Anagrafe2:AnagraficaRecord):boolean;
BEGIN
CercaNome:=(Anagrafe1.Cognome=Anagrafe2.Cognome) AND
(Anagrafe1.Nome=Anagrafe2.Nome)
END;
CercaMigliorStudente
•Usando l’array Corso cerca il record dello studente con la
MediaMigliore
•Stampa i dati dello studente trovato
MediaMigliore
•Fai una ricerca lineare sull’array Corso nel campo Media e
memorizza l’indice per il quale la media è massima.
FUNCTION MediaMigliore(VAR Corso:CorsoArray;VAR
Iscritti:IndiceTipo):IndiceTipo;
VAR
TempMigliore,Indice:IndiceTipo;
BEGIN
TempMigliore:=1;
FOR Indice:=2 TO Iscritti DO
IF Corso[Indice].Media > Corso[TempMigliore].Media
TempMigliore:=Indice;
MediaMigliore:=TempMigliore
END;
THEN
PROCEDURE CercaMigliore(VAR Corso:CorsoArray;VAR Iscritti:IndiceTipo);
VAR
IndiceMax:IndiceTipo;
BEGIN
IndiceMax:=MediaMigliore(Corso,Iscritti);
WITH Corso[IndiceMax],Anagrafe DO
BEGIN
write(Nome,' ',Cognome);
writeln(' e'' il migliore del corso con una media di ',
Media:3:2)
END
END;
PROCEDURE CercaInsieme(VAR Corso:CorsoArray; Iscritti:IndiceTipo);
VAR
Indice:integer;
Range:real;
BEGIN
write('La media minima richiesta e'': ');
readln(Range);
FOR Indice:=1 TO Iscritti DO
BEGIN
WITH Corso[Indice],Anagrafe DO
IF Media > Range THEN
BEGIN
write(Nome,' ',Cognome);
writeln(' rientra nell''intervallo con una media
di ',Media:3:2)
END;
END
END;
PROGRAM Txtrecord(output,Studenti);
…………………………………………………………….
VAR
Corso:CorsoArray;
Iscritti,IndiceArray:IndiceTipo;
StudentiFile:text;
UnoStudente:StudenteRecord;
NomeCercato:AnagraficaRecord;
Scelta:integer;
Range:real;
FUNCTION MediaProve(VAR Risultati:RisultatiArray):real;
PROCEDURE LeggiParola(Sentinella:char;VAR Parola:StringaNome;
VAR Studenti:text);
PROCEDURE CostruisciRecordStudente(VAR UnoStudente:StudenteRecord;
VAR StudentiFile:text);
PROCEDURE CostruisciCorso(VAR Iscritti:IndiceTipo;VAR Corso:CorsoArray;
VAR StudentiFile:text);
FUNCTION CercaNome(Anagrafe1,Anagrafe2:AnagraficaRecord):boolean;
FUNCTION IndiceStudente(VAR Iscritti:IndiceTipo;
VAR Corso:CorsoArray;NomeCercato:AnagraficaRecord):IndiceTipo;
PROCEDURE CercaMediaStudente(VAR Iscritti:IndiceTipo;
VAR Corso:CorsoArray);
FUNCTION MediaMigliore(VAR Corso:CorsoArray;
Iscritti:IndiceTipo):IndiceTipo;
PROCEDURE CercaMigliore(VAR Corso:CorsoArray; Iscritti:IndiceTipo);
PROCEDURE CercaInsieme(VAR Corso:CorsoArray; Iscritti:IndiceTipo);
OSSERVAZIONI
Usare l’algoritmo giusto per la variabile giusta.
Es. Se si vuole fare una ricerca dello studente con la media più alta,
l’algoritmo deve prevedere di trattare dati reali.
Per accedere ai dati di un record messo in un array basta conoscere
l’indice dell’array in cui il record è contenuto.
SUGGERIMENTI
Scegliere la struttura dei dati in funzione del tipo di dati da gestire.
• per una lista di oggetti omogenei (che hanno cioè lo stesso
significato es. i voti di uno studente) si può scegliere un array
monodimensionale.
• per una lista di oggetti omogenei ma caratterizzati da proprietà
diverse si possono usare array multidimensionali (es. pezzi degli
scacchi e coordinate X,Y sulla scacchiera).
SYNTAX ERROR
Indice:=3;
WITH Corso DO
BEGIN ………………… END
Non confronta il type
ma solo i singoli campi
Corso[Indice]
SYNTAX ERROR
IF Corso[Indice].Anagrafe=UnUomo.AnagrafeTHEN
BEGIN ……………………. END
.cognome
.cognome
Non è possibile fare un FOR sui campi di un
record:
FOR I:=Anagrafe TO Età DO …………………
WITH Corso[Indice].Anagrafe DO
BEGIN ………………… END
Si selezionano solo i campi Nome e Cognome
WITH Corso[Indice],Anagrafe DO
BEGIN ………………… END
Si selezionano i campi Nome e Cognome e tutti
i campi di Corso[Indice]
WITH Corso[Indice],Anagrafe DO
FOR Indice:=1 TO Iscritti DO
Writeln(Cognome, Nome)
ERRORE !!!!!!!!!!! Scriverà sempre lo stesso
Cognome e Nome per Iscritti volte
FOR J:=1 TO Iscritti DO
WITH Corso[J],Anagrafe DO
Writeln(Cognome, Nome)
RICERCA LINEARE
Una funzione di Search lineare può essere del tipo
Linear(UnArray, Chiave, TotalElements)
dove si presuppone che il subrange di candidati sia tra 1.. TotalElements.
Esempio
Supponiamo di avere un Array di record Studenti, di operare su un subrange che vada 1..NumeroStudenti. Uno dei
campi del record supponiamo sia MATRICOLA. Su questo campo vogliamo fare delle ricerche. Una chiamata di
funzione tipica è
Indice:=Linear(Studenti; MatrCercata; NumeroStudenti)
Studente
Anagrafe
Cognome
Nome
Nascita
Giorno
Mese
Matricola
Risultati
Media
Anno
TYPE
Stringa20 = STRING[20]
RisultatiArray=ARRAY[1..TotaleProve] OF integer;
AnagraficaRecord = RECORD
Cognome,
Nome : Stringa20
END;
AnnoCorso
DataRecord = RECORD
Giorno,
Mese,
Anno : integer
END;
StudenteRecord = RECORD
Anagrafe:AnagraficaRecord;
Nascita:DataRecord;
Matricola:StringaNome;
AnnoCorso:StringaNome;
Risultati:RisultatiArray;
Media:real;
Esercizio
Progettare e costruire un record per la descrizione dei dati studenti sotto
riportati aggiungendo le informazioni relative al corso di studi.
COD
566
MAT COGNO NOME DT_NASC SE DOMIC COM PR CAP
S ILIO
ME
VITO 02/08/1979 M VIA F. NAP NA 80144
ABBA
14
OLI
ANNO TIP
EMAIL
DESCRIZI PREFI TEL
_CORS
SSO
ONE
C
701183 [email protected] 4
081
NAPOLI
t
8
Piano di
studio
Programmaz Programmaz
ione Mod A ione Mod B
Analisi
Architettura
elab.
Algebra
…………………………….
PROBLEMA
Supponiamo di voler descrivere l’anagrafica di un medico di
famiglia, il Dr.Ippocrate . I dati di ogni paziente sono
memorizzati su un file testo alla maniera seguente:
Codice Paziente, Cognome, Nome, Data di Nascita,Indirizzo
(Via, N°,Piano), telefono, <eoln>
Elenco delle patologie curate (max 10)<eoln>
Elenco dei parametri clinici per ogni patologia (max 5 x
patologia) con i valori normali.
Data Ultima Visita Ambulatoriale e Domiciliare
Si vuole sapere quale è la patologia più frequente tra i
pazienti del Dr. Ippocrate.
Tra i pazienti che soffrono di questa patologia quale è il
più grave.
Scarica

LEZIONE Record