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.