============================================================================== WWW: http://www.dis.uniroma1.it/~calvanes/didattica/99-00-fond-mec/esercita/10/ cosasifa.txt ============================================================================== Universita' degli Studi di Roma "La Sapienza" Facolta' di Ingegneria Anno Accademico 1999/2000 FONDAMENTI DI INFORMATICA (MECCANICI) -- Prof. D. Calvanese ============================================================================== DECIMA ESERCITAZIONE AUTOGUIDATA COSA SI FA IN QUESTA ESERCITAZIONE ============================================================================== OBIETTIVI DELL'ESERCITAZIONE: (A) Scrivere programmi in PASCAL, di difficolta` pari a quella di un esercizio di esame. (B) Illustrare l'evoluzione della pila dei record di attivazione. 1. con ricorsione semplice 2. con ricorsione multipla ============================================================================== (A) ESERCIZIO DI ESAME DELL'APPELLO DEL 15/2/1999 Il ricevimento clienti di un albergo e' gestito in modo da memorizzare le prenotazioni in un file di record (ad es. PRENOT.DAT) in cui ogni record contiene le seguenti informazioni: - codice della prenotazione (stringa di 5 caratteri) - cognome del cliente (stringa di 10 caratteri) - nome del cliente (stringa di 10 caratteri) - tipo di camera (singola o doppia) - tariffa giornaliera (intero positivo, in EURO) - data di arrivo (nel formato giorno, mese, anno) - data di partenza. Quando il cliente arriva in albergo TUTTE le informazioni relative alla sua prenotazione contenute nel file PRENOT.DAT vengono riportate in un nuovo record che viene aggiunto ad una lista di presenze, realizzata con record e puntatori, contenuta in memoria centrale. Quando il cliente parte il suo record viene eliminato dalla lista di presenze, le informazioni in esso contenute vengono inserite in un nuovo record in un file (ad es. ARCHIVIO.DAT) i cui record hanno la stessa struttura di quelli di PRENOT.DAT. Si richiede di risolvere i problemi seguenti: 1. Progettare (su carta) le strutture dati (cioe` fornire le dichiarazioni di tipo PASCAL) necessarie a risolvere i punti (2) e (3) seguenti. Confrontare le strutture progettate con quelle contenute nel file ALBERDRI.PAS. 2. Scrivere una procedura o funzione PASCAL che, RICEVENDO IN OPPORTUNI PARAMETRI DI INGRESSO: - il nome del file contenente le prenotazioni, - la data odierna, - la lista delle presenze, STAMPI SU VIDEO: - le informazioni relative ai clienti previsti e non arrivati (cioe' quelli la cui prenotazione e' presente nel file delle prenotazioni con data di arrivo uguale alla data odierna e che non sono nella lista delle presenze). N.B. Si supponga che l'identificazione di un cliente nel file e nella lista avvenga in base al codice della prenotazione. 3. Scrivere una procedura o funzione PASCAL che, RICEVENDO IN OPPORTUNI PARAMETRI DI INGRESSO: - il nome del file contenente i dati archiviati sui clienti, - la lista delle presenze, CREI E RESTITUISCA IN UN OPPORTUNO PARAMETRO DI USCITA: una nuova lista, contenente i nominativi dei clienti al momento presenti in albergo (e cioe' contenuti nella lista delle presenze) che hanno soggiornato in albergo per tre o piu' volte. Ogni record della lista di uscita deve contenere le seguenti informazioni: - nome del cliente - cognome del cliente - numero di volte che ha soggiornato nell'albergo (inclusa quella in corso). N.B. Ogni cliente deve comparire soltanto una volta nella lista in uscita. ------------------------------------------------------------------------------ SUGGERIMENTI PER LA SOLUZIONE DELL'ESERCIZIO: per il punto (2): Usare una funzione ausiliaria per verificare se la prenotazione relativa ad un cliente compare nella nella lista delle presenze. per il punto (3): - Per ogni elemento della lista delle presenze in ingresso, contare il numero di volte che l'elemento compare nel file di archivio. Il confronto si deve basare su nome e cognome. - L'esercizio non specifica in che ordine devono essere inseriti gli elementi nella lista in uscita. Quindi conviene scegliere il metodo di inserimento piu` semplice. ------------------------------------------------------------------------------ VERIFICA DELLA CORRETTEZZA DEL CODICE SVILUPPATO: Oltre alle definizioni di tipo, il file ALBERDRI.PAS contiene tutto il codice necessario a verificare la correttezza delle procedure e funzioni sviluppate. In particolare, contiene: - la definizione di una procedura (LeggiPresenze) per la lettura da un file di testo di una lista di presenze da passare come parametro alle procedure sviluppate ai punti (2) e (3); - la definizione di una procedura (StampaSoggiorni) per la stampa di nome, cognome e numero soggiorni dei clienti nella lista restituita dalla procedura sviluppata al punto (3). - il codice di un semplice programma che legge da file una lista di presenze, attiva le procedure o funzioni sviluppate e visualizza i risultati. Il file di testo PRESENZE.TXT e` un esempio di file di testo di input come richiesto dalla procedura LeggiPrenotazioni. Per verificare la correttezza delle procedure o funzioni sviluppate si consiglia di scrivere ed usare ulteriori file di input, tenendo conto del formato richiesto dalla procedura stessa (ed esemplificato dal file PRESENZE.TXT). I file di record PRENOT.DAT e ARCHIVIO.DAT sono esempi di file di record come quelli letti dalle procedure che risolvono i punti (2) e (3). Questi file vengono generati dal programma driver a partire dai file di testo PRENOT.TXT e ARCHIVIO.TXT. ============================================================================== (B1) EVOLUZIONE DELLA PILA DEI RECORD DI ATTIVAZIONE (CON RICORSIONE SEMPLICE) Si consideri il seguente programma Pascal: program Esame1; function Cosafa (x: integer): integer; begin if x = 0 then Cosafa := 0 else if (x mod 2) = 0 then Cosafa := x + Cosafa(x-2) else Cosafa := Cosafa(x-1) end; { Cosafa } begin { Esame1 } writeln(Cosafa(5)) end. { Esame1 } - Descrivere cosa fa (non come lo fa) la funzione Cosafa. - Che valore viene stampato dal programma? Mostrare l'evoluzione della pila dei record di attivazione. - Fornire almeno un valore del parametro attuale per il quale l'attivazione della funzione Cosafa non termina. ============================================================================== (B2) EVOLUZIONE DELLA PILA DEI RECORD DI ATTIVAZIONE (CON RICORSIONE MULTIPLA) Si consideri il seguente programma Pascal: program Esame2; var n, m: integer; function Calc (x:integer; y:integer): integer; begin if (y=1) or (y =0) then Calc := 1 else Calc := Calc(x+1, y-1) + Calc(x, y-2) end; begin { Esame2 } write('n: '); read(n); write('m: '); read(m); writeln(Calc(n,m)) end. { Esame2 } - Descrivere cosa viene stampato quando da input vengono introdotti i seguenti valori: n: 3; m: 4 - Mostrare la pila dei record di attivazione. Quante volte viene attivato Calc(1,1) se la funzione Calc viene invocata dal programma principale con i valori n=3 e m=4? ============================================================================== ==================== BUON LAVORO!!! ==================== ==============================================================================