RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di...

56

Transcript of RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di...

Page 1: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.
Page 2: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

Rossi Ugo 3 5 1972 480/8796

Bianchi Carlo 12 2 1971 480/8746

II 25 23 29 28

I 30 25 18 27

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:

………………………………………………………………………………………

…………………………………………………………………………………………

…………………………………………………………………………………………

<eof>

Leggere il file mostrando a video i nomi ordinati per media dei voti riportati e per cognome.

Page 3: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

I TIPI

Integer,Real,Char,String,Array,Enumerated,…………..

Page 4: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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.

Page 5: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

Definizione di RECORD

TYPE NomeRecord = RECORD

Campo1: integer,………..CampoN: real

END;

= Lista dei campi

RECORDidentificatore END

AnagraficaRecord = RECORDCognome,Nome : Stringa20

END;

Page 6: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

ESEMPIO

Studente

Anagrafe Nascita Matricola

Cognome Nome Giorno Mese Anno

AnnoCorso Risultati Media

Studente

Anagrafe Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

Rossi Ugo 3 5 1972 480/8796

Bianchi Carlo 12 2 1971 480/8746

II 25 23 29 28

I 30 25 18 27

Page 7: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

StudenteRecord = RECORD Anagrafe:AnagraficaRecord;

Nascita:DataRecord; Matricola:Stringa20; AnnoCorso:Stringa20; Risultati:RisultatiArray; Media:real;

END;

Studente

Anagrafe Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

TYPEStringa20 = STRING[20]RisultatiArray=ARRAY[1..TotaleProve] OF integer;

AnagraficaRecord = RECORDCognome,Nome : Stringa20END;

DataRecord = RECORDGiorno,Mese,Anno : integerEND;

Page 8: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

TYPEStringa20 = STRING[20]RisultatiArray=ARRAY[1..TotaleProve] OF integer;

AnagraficaRecord = RECORDCognome,Nome : Stringa20END;

DataRecord = RECORDGiorno,Mese,Anno : integerEND;

StudenteRecord = RECORD Anagrafe:AnagraficaRecord;

Nascita:DataRecord; Matricola:StringaNome; AnnoCorso:StringaNome; Risultati:RisultatiArray; Media:real;

END;

VARCompleanno:DataRecord;DatiStudente:StudenteRecord;

UnoStudente:AnagraficaRecord;

Page 9: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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)

Studente

Anagrafe Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

Rossi Ugo 3 5 1972 566/879

Bianchi Carlo 12 2 1971 566/874

II° 25 23 29 28 26,25

I° 30 25 18 27 25,00STRUTTURA DATI

AnagraficaRecord = RECORDCognome,Nome : Stringa20END;

DataRecord = RECORDGiorno,Mese,Anno : integerEND;

StudenteRecord = RECORD Anagrafe:AnagraficaRecord;

Nascita:DataRecord; Matricola:StringaNome; AnnoCorso:StringaNome; Risultati:RisultatiArray; Media:real;

END;

Page 10: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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:

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.txtMatricola (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.txtMatricola (intero)<eoln>Cognome e nome<eoln>

UN ESERCIZIO DI MOD.A

Page 11: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

Studenti.txtMatricola (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.txtMatricola (intero)<eoln>Cognome e nome<eoln>

Esempio Studenti.txt4010<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.txt4010<eoln>Rossi Marco<eoln>4060<eoln>Bianchi Matteo<eoln><eof>

L’output sarà: 4010 seguito dalla media

Page 12: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

CONST TotaleProve=25;TYPEStringa20 = STRING[20]NomiArray=ARRAY[1..TotaleProve] OF stringa20;VotiArray=ARRAY[1..TotaleProve] OF integer;

AnagraficaRecord = RECORDCognome,Nome : Stringa20END;

NumEsRecord = RECORDSostenuti,Sostenere:integer;END;

SostenutiRecord = RECORDEsame:NomiArray,Voti:VotoArray;

StudenteRecord = RECORD Matricola:StringaNome;

Anagrafe:AnagraficaRecord; NumEsami:NumEsRecord; EsamiSost:SostenutiRecord;

END;

Page 13: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

REPEAT writeln(‘ Introduci la data ‘); readln(DataOdierna.Giorno, DataOdierna.Mese, DataOdierna.Anno)UNTIL DataValida(DataOdierna);

FUNCTION DataValida(Data:DataRecord):boolean;BEGIN

DataValida:=(Data.Mese IN [1..12]) AND (Data.Giorno IN [1..31])END;

DataRecord = RECORDGiorno,Mese,Anno : integerEND;

VAR DataOdierna : DataRecord;

USO DELLE VARIABILI RECORD

Aggiornare la funzione tenendo conto dei mesi di lunghezza variabile e degli anni bisestili

Page 14: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

ProblemaAssegnato un file del tipo prima descritto, scrivere una procedura che mostri i dati di tutti gli studenti.

STRUTTURA DATI

AnagraficaRecord = RECORDCognome,Nome : Stringa20END;

DatataRecord = RECORDGiorno,Mese,Anno : integerEND;

StudenteRecord = RECORD Anagrafe:AnagraficaRecord;

Nascita:DataRecord; Matricola:StringaNome; AnnoCorso:StringaNome; Risultati:RisultatiArray; Media:real;

END;

Pseudo Codice MainApri il file dati in letturaCarica i dati e mostrali

Pseudo Codice Carica datiPer ogni studente Carica record studente

Pseudo Codice CaricaRecordStudenteLeggi Cognome Leggi NomeLeggi Data NascitaLeggi Matricola, AnnoCorsoLeggi Risultati

Studente

Anagrafe Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultatiMedia

Page 15: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

5Rossi Carlo 30 11 1968480/564 II 30 28 18 25Rossi Lucio 12 10 1969050/884 I 18 25 22 21Bianchi Ugo 5 4 1965050/741 I 18 18 18 18Verdi Carlo 14 12 1970480/88 II 30 29 28 30Esposito Franco 2 8 1969050/524 I 25 27 29 30

INPUT da File .txt

Page 16: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

RAPPRESENTAZIONE GRAFICA

Apri il file dati in lettura

Stud

enti

File

StudentiFile

Carica Dati

Iscr

itti

Costruisci Record Studenti

Leggi Cognome

Leggi Nome

Leggi Giorno

Leggi Mese

Leggi Anno

Leggi Matr

Leggi Corso

Leggi Risultati

StudentiFile

Scrivi

Cognome Nome

GiornoMese

Anno

Matr Corso Risultati

CognomeNomeGiornoMeseAnnoMatrCorsoRisultati

Page 17: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

PROGRAM Txtrecord(output,Studenti);CONSTSentinella=' ';LunMax=40;TotaleProve=4;MassimoStud=150;

VARIscritti,IndiceArray:IndiceTipo;StudentiFile:text;UnoStudente:StudenteRecord;

TYPEStringaNome=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;

Page 18: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

MAIN

BEGIN

assign(StudentiFile,'C:\TP\ESEMPI\cap12\STUDREC.TXT');

reset(StudentiFile);

CaricaDati(Iscritti,UnoStudente,StudentiFile);

readln

END.

Page 19: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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;

Page 20: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

PROCEDURE CostruisciRecordStudente(VAR UnoStudente:StudenteRecord; VAR StudentiFile:text);

VARNumeroProva: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; writelnEND;

Page 21: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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;

Page 22: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

L’ISTRUZIONE WITH

Seleziona diversi campi di un record usando solo un riferimento.

variabileWITH DO istruzioni

.

BEGIN WITH Nome1,Nome2,… DO

BEGIN………………...

END;

Page 23: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

PROCEDURE CostruisciRecordStudente(VAR UnoStudente:StudenteRecord;

VAR StudentiFile:text);

VAR

NumeroProva:integer;

BEGIN

WITH UnoStudente DO

BEGIN

LeggiParola(' ',Matricola, StudentiFile);

LeggiParola(' ',AnnoCorso, StudentiFile);

END

END;

USO DI WITH

Studente

Anagrafe Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

Page 24: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

Studente

Anagrafe Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

WITH ANNIDATI

PROCEDURE CostruisciRecordStudente(UnoStudente:StudenteRecord; VAR StudentiFile:text);

VARNumeroProva:integer;BEGIN WITH UnoStudente DO WITH Anagrafe DO BEGIN LeggiParola(' ',Cognome, StudentiFile); LeggiParola(' ',Nome, StudentiFile); ENDEND;

Page 25: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

PROCEDURE CostruisciRecordStudente(UnoStudente:StudenteRecord; VAR StudentiFile:text);

VARNumeroProva: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); ENDEND;

Studente

Anagrafe Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

Page 26: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

ATTENZIONE l’uso del WITH produce codici meno leggibili (es. non è sempre chiaro se una variabile è il nome di un campoo una variabile globale) e quindi aumenta la probabilità di errore.

PROCEDURE CostruisciRecordStudente(UnoStudente:StudenteRecord; VAR StudentiFile:text);

VARNumeroProva: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);ENDEND;

Page 27: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

ARRAY Corso

Anagrafica Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

Anagrafica Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

Anagrafica Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

Anagrafica Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorsoRisultati Media

1

2

3

4

ARRAY Risultati

1 2 3 4

Rossi Carlo 30 11 1968

480/564 II 30 28 18 25

Page 28: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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:

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.txtMatricola (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.txtMatricola (intero)<eoln>Cognome e nome<eoln>

UN ESERCIZIO DI MOD.A

Page 29: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

Studenti.txtMatricola (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.txtMatricola (intero)<eoln>Cognome e nome<eoln>

Studente

Matricola Anagrafe NumEsami EsamiSost

Cogn Nom S.ti S.re Esami Voti

Studente

Matricola Anagrafe NumEsami EsamiSost

Cogn Nom S.ti S.re Prove

Esame Voto

Page 30: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

CONST TotaleProve=25;TYPEStringa20 = STRING[20]NomiArray=ARRAY[1..TotaleProve] OF stringa20;VotiArray=ARRAY[1..TotaleProve] OF integer;

AnagraficaRecord = RECORDCognome,Nome : Stringa20END;

NumEsRecord = RECORDSostenuti,Sostenere:integer;END;

SostenutiRecord = RECORDEsame:NomiArray,Voti:VotoArray;END;

StudenteRecord = RECORD Matricola:StringaNome;

Anagrafe:AnagraficaRecord; NumEsami:NumEsRecord; EsamiSost:SostenutiRecord;

END;

CONST TotaleProve=25;TYPEStringa20 = STRING[20]Prove = RECORD

Esame: StringaNome;Voto: Integer;END;

ProveArray = ARRAY[TotaleProve] OF Prove; AnagraficaRecord = RECORD

Cognome,Nome : Stringa20END;

NumEsRecord = RECORDSostenuti,Sostenere:integer;END;

StudenteRecord = RECORD Matricola:StringaNome;

Anagrafe:AnagraficaRecord; NumEsami:NumEsRecord;

EsamiSost:ProveArray;END;

Page 31: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

5Rossi Carlo 30 11 1968480/564 II 30 28 18 25Rossi Lucio 12 10 1969050/884 I 18 25 22 21Bianchi Ugo 5 4 1965050/741 I 18 18 18 18Verdi Carlo 14 12 1970480/88 II 30 29 28 30Esposito Franco 2 8 1969050/524 I 25 27 29 30

INPUT

Page 32: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

PROBLEMA

Dato il file testo STUDREC.TXT

Scrivere un programma che:a- elenca gli studenti con i loro datib- se richiesto mostra la media di un preassegnato studentec- 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

5Rossi Carlo 30 11 1968480/564 II 30 28 18 25Rossi Lucio 12 10 1969050/884 I 18 25 22 21Bianchi Ugo 5 4 1965050/741 I 18 18 18 18Verdi Carlo 14 12 1970480/88 II 30 29 28 30Esposito Franco 2 8 1969050/524 I 25 27 29 30

Page 33: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

5Rossi Carlo 30 11 1968480/564 II 30 28 18 25Rossi Lucio 12 10 1969050/884 I 18 25 22 21Bianchi Ugo 5 4 1965050/741 I 18 18 18 18Verdi Carlo 14 12 1970480/88 II 30 29 28 30Esposito Franco 2 8 1969050/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

INPUT

OUTPUT

Page 34: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

RAPPRESENTAZIONE GRAFICA

Apri il file dati in lettura

Stu

dent

iFil

e

Leggi ArrayRisultati

Stu

dent

iFil

e

Ris

ulta

ti

Media

Ris

ulta

ti

Med

ia

Scrivi

Cognome NomeGiorno Mese AnnoMatrAnnoCorsoMediaRisultati

StudentiFile

CostruisciCorso

CorsoIscritti

CercaMediaStudente

CorsoIscritti

CercaMigliore

CorsoIscritti

Leggi Dati

StudentiFile

CognomeNomeGiornoMeseAnnoMatrAnnoCorso

Stu

dent

iFil

e

UnoStudente

Costruisci Record Studenti

StudentiFile Corso[I]

IndiceMigliore

CorsoIscritti

IndiceMigliore

IndiceStudente

CorsoNomeCercato Indice

Array

CercaNome

Anagrafe1 Anagrafe2

booleanCercaInsieme

CorsoIscritti

Page 35: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

PROGRAM Txtrecord(output,Studenti);CONSTSentinella=' ';LunMax=40;TotaleProve=3;MassimoStud=250;TYPEStringaNome=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;

Page 36: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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.

Page 37: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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

Page 38: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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;

Page 39: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

PROCEDURE CostruisciRecordStudente(VAR UnoStudente:StudenteRecord; VAR StudentiFile:text);

VARNumeroProva: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 ENDEND;

Page 40: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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;

Page 41: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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;

Page 42: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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

Page 43: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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;

Page 44: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

FUNCTION CercaNome(Anagrafe1,Anagrafe2:AnagraficaRecord):boolean;

BEGIN

CercaNome:=(Anagrafe1.Cognome=Anagrafe2.Cognome) AND

(Anagrafe1.Nome=Anagrafe2.Nome)

END;

FUNCTION IndiceStudente(VAR Iscritti:IndiceTipo; VAR Corso:CorsoArray;NomeCercato:AnagraficaRecord):IndiceTipo;VARSonda:IndiceTipo;BEGINCorso[0].Anagrafe:=NomeCercato;Sonda:=Iscritti; WHILE NOT CercaNome(Corso[Sonda].Anagrafe,NomeCercato) DO Sonda:=Sonda-1;

IndiceStudente:=SondaEND;

Page 45: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

CercaMigliorStudente

•Usando l’array Corso cerca il record dello studente con laMediaMigliore

•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.

Page 46: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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 THEN TempMigliore:=Indice; MediaMigliore:=TempMigliore END;

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;

Page 47: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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;

Page 48: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

PROGRAM Txtrecord(output,Studenti);…………………………………………………………….VARCorso: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);

Page 49: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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.

Page 50: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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).

Page 51: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

Indice:=3;WITH Corso DOBEGIN ………………… END

SYNTAX ERRORCorso[Indice]

IF Corso[Indice].Anagrafe=UnUomo.AnagrafeTHENBEGIN ……………………. END

SYNTAX ERROR

Non è possibile fare un FOR sui campi di un record:FOR I:=Anagrafe TO Età DO …………………

Non confronta il type ma solo i singoli campi

.cognome .cognome

Page 52: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

WITH Corso[Indice].Anagrafe DOBEGIN ………………… END

Si selezionano solo i campi Nome e Cognome

WITH Corso[Indice],Anagrafe DOBEGIN ………………… END

Si selezionano i campi Nome e Cognome e tuttii campi di Corso[Indice]

Page 53: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

WITH Corso[Indice],Anagrafe DOFOR Indice:=1 TO Iscritti DOWriteln(Cognome, Nome)

ERRORE !!!!!!!!!!! Scriverà sempre lo stessoCognome e Nome per Iscritti volte

FOR J:=1 TO Iscritti DOWITH Corso[J],Anagrafe DOWriteln(Cognome, Nome)

Page 54: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

Una funzione di Search lineare può essere del tipoLinear(UnArray, Chiave, TotalElements) dove si presuppone che il subrange di candidati sia tra 1.. TotalElements.

EsempioSupponiamo 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)

RICERCA LINEARE

TYPEStringa20 = STRING[20]RisultatiArray=ARRAY[1..TotaleProve] OF integer;

AnagraficaRecord = RECORDCognome,Nome : Stringa20END;

DataRecord = RECORDGiorno,Mese,Anno : integerEND;

StudenteRecord = RECORD Anagrafe:AnagraficaRecord;

Nascita:DataRecord; Matricola:StringaNome; AnnoCorso:StringaNome; Risultati:RisultatiArray; Media:real;

END;

Studente

Anagrafe Nascita Matricola

Cognome Nome AnnoMeseGiorno

AnnoCorso Risultati Media

Page 55: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

COD MAT COGNOME

NOME DT_NASC SES

DOMICILIO

COM PR CAP DESCRIZIONE

PREFISSO

TEL EMAIL ANNO_CORS

TIP

566 14 ABBA VITO 02/08/1979 M VIA F. NAPOLI

NA 80144 NAPOLI 081 7011838

[email protected]

4 C

EsercizioProgettare e costruire un record per la descrizione dei dati studenti sotto riportati aggiungendo le informazioni relative al corso di studi.

…………………………….

Piano distudio

Programmazione Mod A

Programmazione Mod B

Analisi Architetturaelab.

Algebra

Page 56: RossiUgo351972480/8796 BianchiCarlo1221971480/8746 II25 23 29 28 I30 25 18 27 1.Sia dato un file di testo riguardante un insieme di studenti di cui è.

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.