Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE NOME: COGNOME: ============================================================== Esercizio 1 ci sono tante "righe"; non è detto servano tutte... non dovete "scrivere" gli "a capo", ma solo passare alla riga successiva Esercizio 2 su foglio protocollo (ordinatamente!) 1
Matematica - SMID : Programmazione Febbraio 2009 Esercizio 1 Comprensione codice (punti 9 in prima approssimazione) (Versione C++; a richiesta si può avere la versione in C) Consideriamo il seguente codice (che non è un buon esempio di codice!) #include <iostream> using namespace std; const int MAX = 15 ; int k = 5; int ppp( int j ) ; void qqq( float & x, float y ); void rrr( char str [], int & j ); int main() { char sstt [ MAX+1 ] = "73520" ; float a = 1.0; float b = 2.0; k = 3 ; cout << "main 1: " << k << " " << ppp(k) << '\n' ; qqq(a, b) ; cout << "main 2: " << a << " " << b << '\n' ; rrr (sstt, k); cout << "main 3: " << sstt << " $$$ " << k << '\n' ; return (0) ; int ppp( int j ) { return (k + j) ; void qqq( float & x, float y) { x = y; y = 1/y + x; cout << "qqq: " << x << " " << y << '\n' ; void rrr( char str[], int & j) { int k ; j = 0; for (k=0 ; str[k]!= '\0' ; k++) j = 10 * j + (str[k] - '0') ; cout << "rrr: " << str ; cout << " ### " ; cout << j << '\n' ; Sul foglio risposte scrivete tutto l'output del programma, però senza stare a contare gli spazi bianchi...; non confondete maiuscole e minuscole; per i float, scrivete solo le cifre decimali necessarie. 2
Esercizio 2 Progetto di algoritmo (punti 24 in prima approssimazione) Si tratta di progettare un algoritmo che simula (in modo semplificato ed artificiale) la gestione del prestito in una biblioteca. L'enfasi è sul progetto piú che sui dettagli. I dati sono contenuti in due file. File file_libri: i libri sono al piu' MAXlibri (costante nota); per ogni libro, le info sono: - autore, una stringa di lunghezza massima CORTA (costante nota, ad es. 20); - titolo, una stringa di lunghezza massima LUNGA (costante nota, ad es. 80). File file_lettori: i lettori sono al piu' MAXlettori (costante nota); per ogni lettore, le info sono solo un nome, stringa di lunghezza massima CORTA (come sopra); Supponiamo che i dati nei file siano corretti e che non esistano ripetizioni (due libri uguali, due lettori uguali,...). Non si può supporre che libri e lettori compaiano nel file in un qualche ordine. Lo schema (del funzionamento) dell'algoritmo è il seguente: 1) Inizializzazione... 2) Leggi i dati dai file e memorizzali... 3) Ciclo: 3.1) messaggio: biblioteca aperta... 3.2) il lettore si identifica con il nome; il programma controlla; se il lettore non risulta, allora scrive messaggio e riprende il ciclo; altrimenti: 3.3) il lettore fornisce una stringa str 3.4) il programma cerca i libri con titolo che contiene str (vedere oltre); ne memorizza al piu' 10 (i primi che trova); se no ne trova, stampa un messaggio opportuno e riprende il ciclo; altrimenti li stampa nel modo seguente: 1. autore titolo disponibile/in-prestito 2. autore titolo disponibile/in-prestito... 3.5) il lettore risponde con: prendo libro k oppure restituisco libro k 3.6) il programma controlla: nel caso prendo: che il libro sia disponibile e che il lettore non abbia superato il numero massimo di libri in prestito: MAXprestiti (costante nota) nel caso restituisco: che il libro sia tra quelli in prestito al lettore se ok, allora il programma aggiorna i dati... altrimenti scrive un messaggio e riprende il ciclo 3
Il ciclo termina quando: tutti i libri sono in prestito, oppure tutti i lettori hanno MAXprestiti libri in prestito. Note. All'inizio, nessun libro è in prestito. Ogni lettore può avere in prestito in ogni momento al piú MAXprestiti libri. Al punto 3.4 non serve precisare cosa si intende con titolo contiene str; infatti non dovete scrivere codice per questo controllo (vedi domanda c). Specifiche sull'algoritmo: L'algoritmo deve seguire (grosso modo) la struttura delineata sopra. Una parte significativa del ciclo deve essere realizzata tramite procedure o funzioni. Non si devono usare "variabili globali": il passaggio di dati tra "main", procedure e funzioni deve avvenire tramite i parametri e il risultato delle funzioni. Per tutto quello che non è precisato nel testo, siete liberi di decidere voi, ma dovete dichiarare le scelte fatte. Domande a) Precisate come sono codificate le informazioni nei file. b) Precisate le strutture dati usate nell'algoritmo; precisando quali informazioni vengono memorizzate e come. Se non trovo la risposta ad a) e b) non correggo il resto. c) Scrivete, usando lo pseudo-codice utilizzato nelle dispense (oppure il C, ma non ve lo consiglio), l'algoritmo, commentando quando necessario. Non perdete tempo a dettagliare: apertura file, formato nelle istruzioni di input / output,... ed altri aspetti di poco conto. Precisate bene, al contrario: la struttura, il ruolo delle variabili principali, i parametri delle procedure / funzioni... Per lavorare con le stringhe: lettura: fate come se non ci fossero spazi o altri separatori; uguaglianza tra stringhe e controllo s1 contiene s2 : supponete di avere delle procedure/funzioni apposite; non dovete scrivere il codice, dovete solo precisare i prototipi e dire cosa fanno. 4
#include <stdio.h> #define MAX 15 int k = 5; int ppp( int j ) ; void qqq( float * x, float y ); void rrr( char str [], int * j ); int main() { char sstt [ MAX+1 ] = "73520" ; float a = 1.0; float b = 2.0; k = 3 ; printf( "main 1: %d %d \n", k, ppp(k) ) ; qqq(&a, b) ; printf( "main 2: %f %f \n", a, b ) ; rrr (sstt, &k); printf( "main 3: %s $$$ %d \n", sstt, k ) ; return (0) ; int ppp( int j ) { return (k + j) ; void qqq( float * x, float y) { *x = y; y = 1/y + *x; printf( "qqq: %f %f \n", *x, y ) ; void rrr( char str[], int * j) { int k ; *j = 0; for (k=0 ; str[k]!= '\0' ; k++) *j = 10*(*j) + (str[k]-'0') ; printf( "rrr: %s", str ) ; printf( " ### " ); printf( "%d \n", *j) ; 5