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

Slides:



Advertisements
Presentazioni simili
Esercizio Usate il ciclo repeat until (controllo post condizionale) per simulare il prodotto N x M con M somme di N. Esempio: 5 x 3 equivale a fare 5 +5.
Advertisements

Informatica 22/03/2012.
CAPITOLO 2.
Dati strutturati A. Ferrari.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità G1 Dati strutturati.
Ripasso R1 Dati strutturati.
Array multidimensionali
LS Tron Classe 4TC – as 2006/07 LORGANIZZAZIONE DEI PROGRAMMI UD. 8 p. 282.
PROGRAMMARE IN PASCAL (le basi)
I File di testo in Pascal
Universita di Camerino
Algoritmi e Programmazione
Informatica Generale Marzia Buscemi
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
1 Microsoft Access 1. 2 Contenuto Dovete progettare e realizzare, usando Access, una base di dati che riguarda gli esami sostenuti dagli studenti iscritti.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
File.
Università degli Studi di Bergamo Facoltà di Lingue e Letterature Straniere Facoltà di Lettere e Filosofia A.A Informatica generale 1 Appunti.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Laboratorio di Linguaggi lezione XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Ricorsione e Debug.
Primo esercizio Scrivere un programma che legge da input
1. 2 ALCUNE INFORMAZIONI PRELIMINARI Docente: E. Burattini Libri di testo: Deitel H.M., Deitel P.J. – C++ Fondamenti di programmazione,
Cosè un programma? LALA PROGRAMMAZIONE PROGRAMMAZIONELALA PROGRAMMAZIONE PROGRAMMAZIONE UN ELENCO DI ISTRUZIONI, APPARTENENTI A UN BEN DEFINITO LINGUAGGIO,
Programmazione Mod. B - Alberi - prof. E. Burattini
Introduzione agli stream e alle classi
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Introduzione alla programmazione lll
Array Struttura numerate di dati. Memorizzare molti dati In informatica cè spesso bisogno di memorizzare ed elaborare un insieme costituito da molti dati.
Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.
Organizzazione del corso
Algoritmi su Tipi Semplici
Istruzioni Iterative Nicola Fanizzi
Problema Ci sono 5 signore nel parco. Ognuna di loro ha 1 figlio. Ogni bambino ha 10 figurine di calciatori, per un totale quindi di 50 figurine. Questi.
OPERAZIONI CON STRINGHE Le operazioni più interessanti da fare, per ora, con le stringhe sono: determinare la lunghezza della stringa, cioè quanti caratteri.
CAPITOLO 7.
FILE TESTO OUTPUT INPUT + DATI PROGRAMMA OUTPUT INPUT PROGRAMMA CARICAMENTO DATI FILE DATI.
CAPITOLO 10.
RICORDARSI DI PRENOTARE GLI SCRITTI NOTE SUL PROGETTO LA FRASE CHIAVE DEVE POTER CONTENERE SIA SPAZI CHE LETTERE MAIUSCOLE. QUANDO SI MOSTRA IL CONTENUTO.
In Pascal è possibile avere oltre ai file testo, cioè file di char, anche file di interi, stringhe, records. Unica condizione è quella che se un file.
CAPITOLO 6.
Lezione 17 maggio 2007 Parametri da linea di comando FILE Strutture (introduzione)
Array a un dimensione : vettori
Programmazione Mod. B - prof. Burattini - Cap 17 1.
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
1. 2 Struct Al fine di illustrare luso del tipo struct, utilizzando le struct descritte nella lezione precedente, mostriamo come si scrive un programma.
PROBLEMA ALGORITMO PROGRAMMA LINGUAGGI di PROGRAMMAZIONE
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
BIOINFO3 - Lezione 331 SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma.
REDIREZIONE INPUT E OUTPUT
Microsoft Access (parte 5) Introduzione alle basi di dati Scienze e tecniche psicologiche dello sviluppo e dell'educazione, laurea magistrale Anno accademico:
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
ESERCIZIO Assegnata una lista L di caratteri ed un carattere k, scrivere una procedura che cancelli tutte le occorrenze di k in L. PROGRAM Liste(output,input);
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Top STACK Top Le operazioni fondamentali che si fanno sugli stack sono: riempimento e svuotamento. Questo implica che durante lo svolgimento del programma.
Lez. 9 (13/14)Elementi di Programmazione1 Lezione 9 Valutazione di espressioni File di testo sequenziali.
PROVA INTERCORSO MOD.B a.a RICORSIONE ESERCIZI A1.1-A1.6.
Tecnologie Informatiche ed Elettroniche per le Produzioni Animali
In Pascal è possibile avere oltre ai file testo, cioè file di char, anche file di interi, stringhe, records. Unica condizione è quella che se un file.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Procedure - Funzioni. Procedure e funzioni Parti di programma a cui è associato un nome e che può essere attivata mediante una chiamata. Le funzioni a.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 3 L Aprile 2015 Marco D. Santambrogio – Gianluca Durelli -
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
“ Pseudocodice ” Un programma per computer lavorerà su in insieme di “ variabili ” contenenti i dati del problema, soluzioni intermedie, soluzioni finali.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Esercizi sui dati strutturati 13 Tipi di dati strutturati.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Esercizi su stringhe e file 15 Stringhe e file.
Transcript della presentazione:

RossiUgo /8796 BianchiCarlo /8746 II I 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: ……………………………………………………………………………………… ………………………………………………………………………………………… 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 TYPE NomeRecord = RECORD Campo1: integer, ……….. CampoN: real END; = Lista dei campi RECORD identificatore END AnagraficaRecord = RECORD Cognome, Nome : Stringa20 END;

ESEMPIO Studente Anagrafe Nascita Matricola CognomeNome GiornoMeseAnno AnnoCorsoRisultatiMedia Studente AnagrafeNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia RossiUgo /8796 BianchiCarlo /8746 II I

StudenteRecord = RECORD Anagrafe:AnagraficaRecord; Nascita:DataRecord; Matricola:Stringa20; AnnoCorso:Stringa20; Risultati:RisultatiArray; Media:real; END; Studente AnagrafeNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia TYPE Stringa20 = STRING[20] RisultatiArray=ARRAY[1..TotaleProve] OF integer; AnagraficaRecord = RECORD Cognome, Nome : Stringa20 END; DataRecord = RECORD Giorno, Mese, Anno : integer 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 ;

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 AnagrafeNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia RossiUgo /879 BianchiCarlo /874 II° ,25 I° ,00 STRUTTURA DATI 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;

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.txt Matricola (intero) Cognome e nome Esami sostenuti (intero) Esami da sostenere (intero) Nome esame sostenuto^ voto (intero) … Nome esame sostenuto^ voto (intero) Tesi.txt Matricola (intero) Cognome e nome UN ESERCIZIO DI MOD.A

Studenti.txt Matricola (intero) Cognome e nome Esami sostenuti (intero) Esami da sostenere (intero) Nome esame sostenuto^ voto (intero) … Nome esame sostenuto^ voto (intero) Tesi.txt Matricola (intero) Cognome e nome Esempio Studenti.txt 4010 Rossi Marco 18 0 … Nome esame sostenuto^ Antonio Neri 10 8 … Nome esame sostenuto^ Bianchi Matteo 16 2 … Nome esame sostenuto^ 23 Tesi.txt 4010 Rossi Marco 4060 Bianchi Matteo 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;

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 = RECORD Giorno, Mese, Anno : integer END; VAR DataOdierna : DataRecord ; USO DELLE VARIABILI RECORD 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. 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; 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 Studente AnagrafeNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia

5 Rossi Carlo /564 II Rossi Lucio /884 I Bianchi Ugo /741 I Verdi Carlo /88 II Esposito Franco /524 I INPUT da File.txt 

RAPPRESENTAZIONE GRAFICA Apri il file dati in lettura StudentiFile Carica Dati Iscritti Costruisci Record Studenti Leggi Cognome Leggi Nome Leggi Giorno Leggi Mese Leggi Anno Leggi Matr Leggi Corso Leggi Risultati StudentiFile Scrivi CognomeNome Giorno Mese Anno MatrCorsoRisultati Cognome Nome Giorno Mese Anno Matr Corso Risultati

PROGRAM Txtrecord(output,Studenti); CONST Sentinella=' '; LunMax=40; TotaleProve=4; MassimoStud=150; VAR Iscritti,IndiceArray:IndiceTipo; StudentiFile:text; UnoStudente:StudenteRecord; 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;

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. variabile WITHDO istruzioni. BEGIN WITH Nome1,Nome2,… DO BEGIN ………………... END;

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 AnagrafeNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia

Studente AnagrafeNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia WITH ANNIDATI 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;

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; Studente AnagrafeNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia

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 AnagraficaNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia AnagraficaNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia AnagraficaNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia AnagraficaNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia ARRAY Risultati 1234 Rossi Carlo /564 II

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.txt Matricola (intero) Cognome e nome Esami sostenuti (intero) Esami da sostenere (intero) Nome esame sostenuto^ voto (intero) … Nome esame sostenuto^ voto (intero) Tesi.txt Matricola (intero) Cognome e nome UN ESERCIZIO DI MOD.A

Studenti.txt Matricola (intero) Cognome e nome Esami sostenuti (intero) Esami da sostenere (intero) Nome esame sostenuto^ voto (intero) … Nome esame sostenuto^ voto (intero) Tesi.txt Matricola (intero) Cognome e nome Studente MatricolaAnagrafeNumEsamiEsamiSost CognNomS.tiS.re EsamiVoti Studente MatricolaAnagrafeNumEsamiEsamiSost CognNomS.tiS.re Prove EsameVoto

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;

5 Rossi Carlo /564 II Rossi Lucio /884 I Bianchi Ugo /741 I Verdi Carlo /88 II Esposito Franco /524 I INPUT 

PROBLEMA Dato il file testo STUDREC.TXT 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 5 Rossi Carlo /564 II Rossi Lucio /884 I Bianchi Ugo /741 I Verdi Carlo /88 II Esposito Franco /524 I

5 Rossi Carlo /564 II Rossi Lucio /884 I Bianchi Ugo /741 I Verdi Carlo /88 II Esposito Franco /524 I Lo studente Rossi Carlo Matr. 480/564 Nato il 30/11/1968 iscritto al II° anno di corso ha una media di Lo studente Rossi Lucio Matr. 050/884 Nato il 12/10/1969 iscritto al I° anno di corso ha una media di Lo studente Bianchi Ugo Matr. 050/741 Nato il 5/4/1965 iscritto al I° anno di corso ha una media di Lo studente Verdi Carlo Matr. 480/88 Nato il 14/12/1970 iscritto al II° anno di corso ha una media di Lo studente Esposito Franco Matr. 050/524 Nato il 2/8/1969 iscritto al I° anno di corso ha una media di INPUT  OUTPUT 

RAPPRESENTAZIONE GRAFICA Apri il file dati in lettura StudentiFile Leggi Array Risultati StudentiFile Risultati Media Risultati Media Scrivi Cognome Nome Giorno Mese Anno Matr AnnoCorso Media Risultati StudentiFile CostruisciCorso Corso Iscritti CercaMedia Studente Corso Iscritti CercaMigliore Corso Iscritti Leggi Dati StudentiFile Cognome Nome Giorno Mese Anno Matr AnnoCorso StudentiFile UnoStudente Costruisci Record Studenti StudentiFile Corso[I] IndiceMigliore Corso Iscritti IndiceMigliore IndiceStudente Corso NomeCercato Indice Array CercaNome Anagrafe1 Anagrafe2 boolean CercaInsieme Corso Iscritti

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 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; VAR Sonda:IndiceTipo; BEGIN Corso[0].Anagrafe:=NomeCercato; Sonda:=Iscritti; WHILE NOT CercaNome(Corso[Sonda].Anagrafe,NomeCercato) DO Sonda:=Sonda-1; IndiceStudente:=Sonda 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 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;

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

Indice:=3; WITH Corso DO BEGIN ………………… END SYNTAX ERROR Corso[Indice] IF Corso[Indice].Anagrafe=UnUomo.AnagrafeTHEN BEGIN ……………………. 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

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)

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) RICERCA LINEARE 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; Studente AnagrafeNascitaMatricola CognomeNomeAnnoMeseGiorno AnnoCorsoRisultatiMedia

Esercizio Progettare e costruire un record per la descrizione dei dati studenti sotto riportati aggiungendo le informazioni relative al corso di studi. ……………………………. Piano di studio Programmaz ioneMod A Programmaz ioneMod B AnalisiArchitettura 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, Elenco delle patologie curate (max 10) 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.