Informatica 1. Prova di recupero 17 Febbraio 2003

Documenti analoghi
Informatica 1. Prova di recupero 21 Settembre 2001

Informatica 1. Prova di recupero 15 Febbraio 2005

Esercizi. I File ed il C

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Esercitazione 6. Array

Scrittura formattata - printf

Gestione dei File. dischi nastri cd

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Lab 10 Gestione file di testo

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Il rapporto (o il suo inverso) tra -2.5 e vale Soluzione. #include <stdio.h> typedef enum{false, true} bool;

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

Linguaggio C. tipi di dati definiti dall utente. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Gestione dei file. File di testo e binari

Esercizio 1: Puntatori impiegati che sono manager

Programmazione I - Laboratorio

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

Linguaggio C - sezione dichiarativa: costanti e variabili

Informatica: arte e mestiere

Esercitazione 4. Comandi iterativi for, while, do-while

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Primi passi col linguaggio C

Gestione dei File in C

Esercizio n.1 FONDAMENTI DI INFORMATICA 1. Esercizio n.2. Soluzione. LINGUAGGIO C Funzioni e gestione file: esercitazione

Il linguaggio C. Notate che...

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Introduzione. L elaborazione dei files in C. Elaborazione dei files (1) Elaborazione dei files (2) D.D. cap. 11+ pp K.P. pp.

Fondamenti di Informatica 2

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Esercizi di programmazione in linguaggio C English Dictionary

void concatenastringhe (char st1[], char st2[], char stout[]) { int n=0,s=0; // dichiarazione variabili con inizializzazioni

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 8 Novembre 2010 COGNOME E NOME RIGA COLONNA MATRICOLA

RIGA COLONNA MATRICOLA. Il presente plico contiene 3 esercizi e deve essere debitamente compilato con cognome e nome, numero di matricola.

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Struct, enum, Puntatori e Array dinamici

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Introduzione ai puntatori in C Definizione

Introduzione al Linguaggio C

Gestione dei File C. Generalità

Esercitazione 12. Esercizi di Ricapitolazione

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Le Funzioni e la Ricorsione

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prima prova in itinere COGNOME E NOME. 13 novembre 2006 RIGA COLONNA MATRICOLA

La gestione della memoria dinamica Heap

1 (4) 2 (4) 3 (7) 4 (5) 5 (6) 6 (6)

Spazio riservato ai docenti

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

I file possono essere manipolati (aperti, letti, scritti ) all interno di programmi C. dischi nastri cd

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

ESERCIZI DI PROGRAMMAZIONE. - condizionali e cicli -

Stringhe e allocazione dinamica della memoria

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 5A di Mercoledì 13 Luglio 2011 tempo a disposizione 2h

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

PROVA SCRITTA DEL CORSO DI CORSO DI LAUREA IN INGEGNERIA BIOMEDICA ED ELETTRICA 17/2/2009

1 (6) 2 (7) 3 (7) 4 (7) 5 (6)

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Appello di Informatica B

Esercizio 1 Liste: calcolo perimetro di un poligono

Programmazione I - Laboratorio

1) definizione di una rappresentazione 2) specificazione di un algoritmo (dipendente dalla rappresentazione) 3) traduzione in un linguaggio

I file. un file è una sorgente/destinazione di dati per diversi attori

$QDOLVLGHOSURJUDPPDTXDGUDWR

Dati aggregati. Violetta Lonati

Strutture Dinamiche. Fondamenti di Informatica

Algoritmi di Ricerca. Esempi di programmi Java

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

Es 1. Scrivere un programma che verifica se una terna di numeri interi e' pitagorica

Fondamenti di Informatica T-1 Modulo 2

RIGA COLONNA MATRICOLA

Gestione dei file. Linguaggio ANSI C Input/Output - 13

Fondamenti di Informatica

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 10 Novembre 2009 COGNOME E NOME RIGA COLONNA MATRICOLA

Algoritmi e basi del C Struttura di un programma

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Ogni parte non cancellata a penna sarà considerata parte integrante della soluzione.

Linguaggio C. Esercizio 1

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Informatica A a.a. 2010/ /02/2011

Librerie C. Corso di Linguaggi e Traduttori 1 AA

Istruzioni iterative (o cicliche)

Fondamenti di Informatica e Laboratorio T-AB Ingengeria dell Automazione a.a. 2008/2009. Lab 04 Input/Output

Sistemi operativi Modulo II I semafori 2 Select

Laboratorio di Algoritmi e Strutture Dati

Fondamenti di Informatica T-1

Linguaggio C: i file

Struttura dei programmi C

Transcript:

Informatica 1 Prova di recupero 17 Febbraio 2003 Si risolvano i seguenti esercizi. Ai fini della determinazione del voto finale il loro punteggio andrà sommato al punteggio del laboratorio. Il tempo complessivo a disposizione è di 2 ore e ½. Chi dovesse recuperare solo la prima prova dovrà risolvere solo la parte 1 in un tempo di 1 ora e ½. Chi dovesse recuperare solo la seconda prova dovrà risolvere solo la parte 2 in un tempo di 1 ora e ½. Si ricorda che, una volta consegnata una qualsiasi delle due parti, il punteggio acquisito nella corrispondente prova viene annullato.

Recupero parte 1 Esercizio 1 (4 punti) (12 punti) Definire un tipo di dato TipoStrumentista che descrive i dati relativi ad un musicista jazz. Ogni musicista è definito da un nome (massimo 40 caratteri), da una data di nascita, e dallo strumento che suona. Ogni musicista suona un solo strumento, ed il tipo di strumento suonato può essere solo uno dei seguenti (non sono ammessi altri strumenti): pianoforte, basso, batteria, sax, tromba, trombone, flauto, clarinetto, voce. Definire un tipo TipoQuartetto che contiene i dati relativi ad un quartetto di musicisti. Ogni quartetto è caratterizzato da un nome (al massimo 30 caratteri) e da esattamente 4 musicisti (non uno di più, non uno di meno). Definire infine una variabile ElencoQuartetti che può contenere al massimo 100 quartetti. (se si ritiene utile, si possono definire altri tipi di dati, di supporto a quelli richiesti) Esercizio 2 (8 punti) Scrivere un frammento di programma C che, per ogni quartetto senza pianoforte (cioè in cui nessuno strumentista suona il pianoforte) presente nell'elenco ElencoQuartetti, stampa a video il nome del quartetto. In seguito stampa a video il nome di tutti i quartetti con pianoforte. Nel realizzare il frammento di programma si supponga che la variabile ElencoQuartetti di cui al punto precedente sia già stata inizializzata (sia cioè già stata caricata di dati, che non devono essere riletti da tastiera), e si supponga inoltre che un'altra variabile numquartetti, di tipo int (anch'essa già inizializzata) contenga il numero di quartetti effettivamente inseriti in ElencoQuartetti.

Recupero parte 2 (10-12-14 punti) Esercizio 1 (5 punti) Si definiscano i tipi TipoStrumentista e TipoQuartetto come nell'esercizio 1 del recupero della parte 1. Si definisca inoltre un tipo TipoConcerto costituito dal nome della località in cui il concerto si è tenuto (massimo 40 caratteri), dalla data in cui si è tenuto il concerto, e dal quartetto che ha tenuto il concerto. Esercizio 2 Si supponga di avere un file binario contenente un elenco di concerti. Si supponga inoltre che il file sia già stato aperto in modalità (binaria) lettura/scrittura. Si risolva uno (ed uno solo) dei seguenti punti. Variante 2a (punti 5) Dopo avere dichiarato eventuali variabili globali, definire una funzione CancellaConcertiDiQuartetto che riceve in ingresso il nome di un quartetto, e crea un nuovo file (sempre binario), di nome NuovaListaConcerti.dat, contenente l'elenco di tutti i concerti esclusi quelli del quartetto il cui nome è stato passato alla funzione. La funzione ritorna 1 se l'operazione è andata a buon fine, 0 altrimenti. Il file originario con l'elenco dei concerti rimane immutato. Variante 2b (punti 7) Dopo avere dichiarato eventuali variabili globali, definire una funzione CancellaConcertiDiQuartetto che riceve in ingresso il nome di un quartetto, e cancella dal file con l'elenco dei concerti tutti i concerti tenuti dal quartetto il cui come è stato passato alla funzione. La funzione ritorna 1 se l'operazione è andata a buon fine, 0 altrimenti; essa modifica il file originario con l'elenco dei concerti. In questa variante è ammesso (anzi, è consigliato) aprire file temporanei, in aggiunta al file originario. Variante 2c (punti 9) Dopo avere dichiarato eventuali variabili globali, definire una funzione CancellaConcertiDiQuartetto che riceve in ingresso il nome di un quartetto, e cancella dal file con l'elenco dei concerti tutti i concerti tenuti dal quartetto il cui come è stato passato alla funzione. La funzione ritorna 1 se l'operazione è andata a buon fine, 0 altrimenti; essa modifica il file originario con l'elenco dei concerti. In questa variante non è ammesso aprire file temporanei aggiuntivi, si può lavorare solo sul file originario. Aiuto per le varianti 2b e 2c: per troncare un file f alla lunghezza data dalla posizione corrente nel file, l istruzione da usare è la seguente: ftruncate(fileno(f), ftell(f));

Soluzioni Parte 1 (recupero primo compitino) Esercizio 1 #define L_NOME_MUS 40 #define L_NOME_QUAR 30 #define MAX_QUARTETTI 100 short giorno; short mese; int anno; TipoData; typedef enum {pianoforte, basso, batteria, sax, trombone, flauto, clarinetto, voce TipoStrumento; char nome[l_nome_mus+1]; TipoData data_nascita; TipoStrumento strumento; TipoStrumentista; char nome[l_nome_quar+1]; TipoStrumentista musicisti[4]; TipoQuartetto; TipoQuartetto ElencoQuartetti[MAX_QUARTETTI];

Esercizio 2 main() { TipoQuartetto ElencoQuartetti[MAX_QUARTETTI]; int numquartetti[max_quartetti]; /* inizializzazione delle variabili sopra dichiarate, da considerare già fatta */ TipoQuartetto QuartettiSenzaPiano[MAX_QUARTETTI]; TipoQuartetto QuartettiConPiano[MAX_QUARTETTI]; int numquarsenzapiano = 0, numquarconpiano = 0, i, j, trovato; for (i=0; i<numquartetti; i++){ j = 0; trovato = 0; while (trovato == 0 && j<4){ if (ElencoQuartetti[i].musicisti[j].strumento == pianoforte){ trovato = 1; j++; if (trovato == 0) { QuartettiSenzaPiano[numQuarSenzaPiano] = ElencoQuartetti[i]; numquarsenzapiano++; else { QuartettiConPiano[numQuarConPiano] = ElencoQuartetti[i]; numquarconpiano++; printf( Quartetti senza piano:\n ); for (i=0; i<numquarsenzapiano; i++){ printf( %s\n, QuartettiSenzaPiano[i].nome); printf( Quartetti con piano:\n ); for (i=0; i<numquarconpiano; i++){ printf( %s\n, QuartettiConPiano[i].nome);

Parte 2 (recupero secondo compitino) Esercizio 1 #define L_NOME_MUS 40 #define L_NOME_QUAR 30 #define MAX_QUARTETTI 100 short giorno; short mese; int anno; TipoData; typedef enum {pianoforte, basso, batteria, sax, trombone, flauto, clarinetto, voce TipoStrumento; char nome[l_nome_mus+1]; TipoData data_nascita; TipoStrumento strumento; TipoStrumentista; char nome[l_nome_quar+1]; TipoStrumentista musicisti[4]; TipoQuartetto; #define L_NOME_CONC 40 char nome_loc[l_nome_conc+1]; TipoData data; TipoQuartetto quartetto; TipoConcerto;

Esercizio 2a #include <string.h> #include <stdio.h> FILE *f_concerti; int CancellaConcertiDiQuartetto(char nome_quar[]){ TipoConcerto curr_conc; FILE *nf = fopen( NuovaListaConcerti.dat, wb ); if (nf == NULL) return 0; rewind(f_concerti); while (!feof(f_concerti)){ if (fread(&curr_conc, sizeof(tipoconcerto), 1, f_concerti) == 1) { if (strcmp(curr_conc.quartetto.nome, nome_quar)!= 0) { if (fwrite(&curr_conc, sizeof(tipoconcerto), 1, nf)!= 1) { fclose(nf); return 0; else { fclose(nf); return 0; if (fclose(nf) == 0) return 1; else return 0;

Esercizio 2b #include <string.h> #include <stdio.h> FILE *f_concerti; int CancellaConcertiDiQuartetto(char nome_quar[]){ TipoConcerto curr_conc; FILE *tmp_f = fopen( _temp.dat, wb+ ); if (tmp_f == NULL) return 0; rewind(f_concerti); while (!feof(f_concerti)){ if (fread(&curr_conc, sizeof(tipoconcerto), 1, f_concerti) == 1) { if (strcmp(curr_conc.quartetto.nome, nome_quar)!= 0) { if (fwrite(&curr_conc, sizeof(tipoconcerto), 1, tmp_f)!= 1) { fclose(tmp_f); return 0; else { fclose(tmp_f); return 0; rewind(f_concerti); rewind(tmp_f); while (!feof(tmp_f)){ if (fread(&curr_conc, sizeof(tipoconcerto), 1, tmp_f) == 1) { if (fwrite(&curr_conc, sizeof(tipoconcerto), 1, f_concerti)!= 1) { fclose(tmp_f); return 0; else { fclose(tmp_f); return 0; /* tronco il file all ultima posizione in cui ho scritto (il file riscritto è in generale più corto del file originario */ ftruncate(fileno(f_concerti), ftell(f_concerti)); if (fclose(tmp_f) == 0) return 1; else return 0;

Esercizio 2c #include <string.h> #include <stdio.h> FILE *f_concerti; int CancellaConcertiDiQuartetto(char nome_quar[]){ TipoConcerto curr_conc; /* tengo due indici nel file: la prossima posizione in cui devo scrivere (pos_next_write) e la prossima posizione da cui devo leggere (pos_next_read) */ long pos_next_write, pos_next_read; rewind(f_concerti); pos_next_write = ftell(f_concerti); while (!feof(f_concerti)){ if (fread(&curr_conc, sizeof(tipoconcerto), 1, f_concerti) == 1) { if (strcmp(curr_conc.quartetto.nome, nome_quar)!= 0) { /* se il concerto è da mantenere, lo riscrivo nel file f_concerti alla prossima posizione in cui devo scrivere. Prima di scrivere, però, devo memorizzare la poszione corrente nel file, perchè a questa posizione dovrò poi tornare per ricominciare a leggere. */ pos_next_read = ftell(f_concerti); /* mi sposto nel file alla posizione in cui devo scrivere, e poi effettivamente scrivo. */ if (fseek(f_concerti, pos_next_write, SEEK_SET)) return 0; if (fwrite(&curr_conc, sizeof(tipoconcerto), 1, f_concerti)!= 1) return 0; /* memorizzo la posizione corrente, che è la prossima posizione in cui dovrò scrivere, e mi riporto nella posizione che è la prossima da cui devo leggere */ pos_next_write = ftell(f_concerti); if (fseek(f_concerti, pos_next_read, SEEK_SET)) return 0; else { return 0; /* mi riporto sulla posizione che è la prossima in cui scrivere (cioè appena dopo l ultimo concerto che va conservato, e tronco il file (il file riscritto è in generale più corto

del file originario */ if (fseek(f_concerti, pos_next_write, SEEK_SET)) return 0; ftruncate(fileno(f_concerti), ftell(f_concerti)); return 1;