/* Esempio di contenuto del file di testo: */ PaoloBellavista marzo.dat PaolaMello aprile.dat FedericoChesani marzo.dat CarloGiannelli marzo.

Documenti analoghi
Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 4A di Martedì 21 Giugno 2011 tempo a disposizione 2h

Esercizio 1. Esercizio 1

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Fondamenti di Informatica T. Linguaggio C: File

Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

Problem solving elementare su dati vettoriali

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

puntatori Lab. Calc. AA 2007/08 1

Appello di Informatica B

Gestione dei File. dischi nastri cd

Struttura dati FILE. Concetto di FILE

Fondamenti di Informatica 2

Lab 11 Gestione file di testo"

Lezione 9: Strutture e allocazione dinamica della memoria

3. Terza esercitazione autoguidata: progetto gestione voli

Creare una funzione float square(float x). La funzione deve restituire il quadrato del parametro x.

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Problem solving avanzato

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

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Linguaggio C - Stringhe

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Files in C++ Fondamenti di Informatica. R. Basili. a.a

Gestione di files Motivazioni

Compito di Fondamenti di Informatica

TUTORATO di LINGUAGGI I

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

I puntatori e l allocazione dinamica di memoria

2) FILE BINARI: è una sequenza di byte avente una corrispondenza uno a uno con la sequenza ricevuta dal dispositivo esterno.

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Esercitazione 10. Strutture ed Enumerazioni. Allocazione dinamica di memoria

Concetti chiave. Struct. Variabili strutturate: il tipo struct Elementi di una struttura typedef e struct Array di strutture

La gestione della memoria

PROGRAMMI LINGUAGGIO C

I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002

Laboratorio di Algoritmi e Strutture Dati

Sistemi Operativi (M. Cesati)

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

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Gestione delle stringhe in C

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

Corso di Informatica Medica Esercitazione 1I ! Alessandro A. Nacci - alessandronacci.com

Verifica che una grammatica sia Context Free nel GrammaReader

Pile (stacks) e code (queues)

Programmazione Orientata agli Oggetti in Linguaggio Java

INFORMATICA 1 L. Mezzalira

Input/output in C e in C++

Algoritmi e Strutture Dati

1 Automi Cellulari (Rev )

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Politecnico di Milano - Facoltà di Ingegneria INFORMATICA A - Corso per allievi GESTIONALI - Prof. C. SILVANO A. A. 2001/ febbraio A

Record in C: il costruttore struct.

Linguaggio C - Funzioni

Esempio: Array di struct

dall argomento argomento della malloc()

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Esercizio 1. Esercizio 2

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

Laboratorio di Algoritmi e Strutture Dati

LISTE, INSIEMI, ALBERI E RICORSIONE

Laboratorio di programmazione

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

SISTEMI OPERATIVI 3 febbraio 2014 corso A nuovo ordinamento e parte di teoria del vecchio ordinamento indirizzo SR

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Laboratorio di Algoritmi e Strutture Dati. La gestione della memoria dinamica Heap

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31

Esercitazione 3. Corso di Fondamenti di Informatica

Fondamenti di Informatica e Laboratorio T-AB Ingengeria dell Automazione a.a. 2008/2009. Lab 13 File Binari

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Fondamenti di Informatica T. Linguaggio C: i puntatori

Laboratorio di Algoritmi e Strutture Dati

Allocazione dinamica della memoria - riepilogo

Alfabeto ed elementi lessicali del linguaggio C

CARATTERI E STRINGHE Caratteri e stringhe Funzioni della libreria standard I/O Funzioni della libreria di gestione delle stringhe

Tipi di dato-prima parte

Vettori Algoritmi elementari di ordinamento

Strutture dati e realizzazione in C. Componenti software:

Esame di Informatica Generale 25 giugno 2010 Professori: Carulli, Fiorino, Mazzei

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

CREARE UNA LIBRERIA IN C

Puntatori Passaggio di parametri per indirizzo

AA LA RICORSIONE

Le system call: fork(), wait(), exit()


FONDAMENTI di INFORMATICA L. Mezzalira

Gestione dei File in C

Grammatica di base: Pointers

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

Il tipo di dato astratto Pila

Introduzione al Linguaggio C

Esercitazione 7. Procedure e Funzioni

strutturare dati e codice

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

RICERCA DI UN ELEMENTO

Inizializzazione, Assegnamento e Distruzione di Classi

Fondamenti di Informatica - 9Cfu Corso di Laurea in Ingegneria Informatica (ord. 270)

Transcript:

Fondamenti di Informatica L-A (A.A. 2005/2006) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista Prova d Esame di Venerdì 16 Dicembre 2005 durata 2h30m Compito A ESERCIZIO 1 (12 punti) Una ditta di impianti elettrici tiene un registro dei lavori effettuati per i diversi clienti su diversi file binari, e in un file di testo registra per ogni cliente il nome del file in cui sono registrati i lavori che lo riguardano. In particolare, per ogni lavoro effettuato la ditta salva su un file binario strutture dati di tipo Work: ogni struttura contiene il nome del cliente (una stringa di al più 64 caratteri utili), il giorno in cui il lavoro è stato fatto (un intero che rappresenta il giorno nell anno corrente), e l importo ai fini della fatturazione (un float). I lavori relativi ad uno stesso cliente risiedono tutti nello stesso file, ma uno stesso file contiene i dati dei lavori relativi a più clienti. La ditta salva poi, su ogni riga di un file di testo che funge da chiave, il nome del cliente (sempre una stringa di al più 64 caratteri utili) e, separato da uno spazio, il nome del file in cui i lavori del cliente sono salvati (stringa di al più 64 caratteri utili). Si deve realizzare un programma che calcoli l ammontare delle fatture per tutti i clienti della ditta. A tal fine, il candidato realizzi: /* Esempio di contenuto del file di testo: */ PaoloBellavista marzo.dat PaolaMello aprile.dat FedericoChesani marzo.dat CarloGiannelli marzo.dat 1. una funzione: list findbills(char * filename, char * clientname) che, ricevuti in ingresso il nome del file binario e il nome del cliente, restituisca una lista contenente i soli importi relativi ai lavori eseguiti per il cliente specificato (il candidato presti attenzione al fatto che in uno stesso file ci possono essere i dati relativi a più clienti). Si supponga a tal fine di poter disporre del tipo di dato astratto list visto a lezione, definito per il tipo primitivo float, e si supponga di disporre anche di tutte le funzioni primitive presentate a lezione. Al fine di confrontare le stringhe, si ricorda inoltre al candidato l esistenza della funzione di libreria strcmp( ). (5 punti) 2. un programma main, che chieda all utente il nome del file di testo in cui sono registrate le coppie nome cliente-nome file; per ogni cliente registrato in tale file, il programma deve stampare a video il nome del cliente, la lista degli importi relativi, e la loro somma. Al fine di stampare le liste, il candidato ipotizzi di avere a disposizione la funzione showlist( ) opportunamente modificata, e che quindi non deve essere riportata nella soluzione. (7 punti) ESERCIZIO 2 (11 punti) È dato un file di testo dati.txt contenente alcuni interi. In particolare, in ogni riga del file di testo, il primo intero (sempre positivo e maggiore di 0) indica quanti interi vi sono sulla stessa riga successivamente. Si deve realizzare un programma che, estratti da ogni riga gli interi (escluso il primo che ha la sola funzione di indicare quanti interi vi siano successivamente), calcoli la media di tali valori e salvi le medie in una lista creata opportunamente. Il candidato definisca: 1. una funzione int * readline(file * fp, int * length) che, letto il primo intero, allochi dinamicamente memoria sufficiente per memorizzare gli interi presenti. La funzione salvi nella memoria allocata gli interi successivi al primo valore, e restituisca il puntatore a tale area di memoria come parametro di ritorno della funzione. Inoltre, tramite il parametro length, la funzione restituisca il numero di interi effettivamente memorizzati. Qualora sia stata raggiunta la fine del file fp, la funzione restituisca il valore NULL. (4 punti) 2. Un programma main() che, aperto opportunamente il file dati.txt, utilizzi la funzione readline( ) per ottenere gli interi presenti su ogni riga. Per ogni insieme di interi, il programma calcoli la media aritmetica di tali valori e poi de-allochi la memoria occupata da tali valori; tutte le medie devono poi essere memorizzate tramite una struttura dati di tipo list. Terminata la lettura di tutte le righe, il 1

programma stampi ogni valore medio e quanti elementi sono presenti nella lista (tale valore deve essere pari al numero di righe presenti nel file iniziale), e de-allochi la memoria usata per gli elementi della lista. Si supponga di possedere la definizione del tipo di dato astratto list, ma di NON possedere alcuna funzione primitiva per accedervi: il candidato quindi utilizzi direttamente la notazione tramite puntatori. (7 punti) ESERCIZIO 3 (6 punti) Il seguente programma C compila correttamente? In caso affermativo, quali sono i valori stampati a tempo di esecuzione (si motivi opportunamente la risposta data)? typedef struct item { int value; struct item * next; Item; typedef Item * list; int dim = 5; list split(int * p, int dim) { list result1=null, result2=null, temp=null; for (; dim>0; dim--) { temp = (list) malloc(sizeof(item)); temp -> value = p[dim-1]; if ( (*(p+dim-1)) %2 ==0) { temp -> next = result1; result1 = temp; else { temp -> next = NULL; result2 -> next = temp; result2 = temp; if (result1==null) result1=temp; if (result2==null) result2=temp; return result1; int v[] = {1,2,3,4,5,6; list l1, temp; l1 = split(v, v[dim]); while (l1!= NULL) { printf("%d ", l1->value); temp = l1; l1 = l1->next; free(temp); return 0; ESERCIZIO 4 (3 punti) Il candidato illustri brevemente le differenze, anche in termini di occupazione di spazio disco, fra l utilizzo di un file di testo o di un file binario per la memorizzazione di una sequenza di dati numerici di tipo int. 2

ESERCIZIO 1 #include <string.h> #include "list.h" SOLUZIONE #define DIM 65 typedef struct work { char name[dim]; int day; float bill; Work; list findbills(char * filename, char * clientname) { FILE * fworks; list result; Work temp; if ((fworks = fopen(filename, "rb")) == NULL) { printf("error opening the file %s\n", filename); exit(-1); result = emptylist(); while (fread(&temp, sizeof(work), 1, fworks) > 0 ) if (strcmp(temp.name, clientname) == 0) result = cons(temp.bill, result); fclose(fworks); return result; FILE * fclients; char fileclients[dim], clientname[dim], filename[dim]; list tempbill; float totalbill; printf("inserire il nome del file dei clienti: "); scanf("%s", fileclients); if ((fclients = fopen(fileclients, "r")) == NULL) { printf("error opening the file %s\n", fileclients); exit(-1); while (fscanf(fclients, "%s %s",clientname, filename)!= EOF ) { totalbill = 0; tempbill = findbills(filename, clientname); printf("%s: ", clientname); showlist(tempbill); while(! empty(tempbill)) { totalbill = totalbill + head(tempbill); tempbill = tail(tempbill); printf(" Total bill: %6.2f\n", totalbill); fclose(fclients); return 0; 3

ESERCIZIO 2 #include "list.h" int * readline(file *fp, int *length) { int temp, dim, i, *result = NULL; *length = 0; if (fscanf(fp, "%d", &dim)!= EOF) { result = (int *) malloc (sizeof(int) * dim); for (i=0; i<dim; i++) { fscanf(fp, "%d", &temp); result[*length] = temp; *length = *length + 1; return result; FILE * fp; int * v, length, i, total; list average = NULL, temp = NULL; if ((fp = fopen("dati.txt", "r")) == NULL) { printf("error opening the file %s\n", "dati.txt"); exit(-1); while((v=readline(fp, &length))!= NULL) { total = 0; for (i=0; i<length; i++) total = total + v[i]; free(v); temp = (list) malloc(sizeof(item)); temp ->value = total /((float) length); temp->next = average; average = temp; fclose(fp); i=0; while (average!= NULL) { temp = average; printf("%f\n", average->value); average = average->next; free(temp); i++; printf("righe presenti nel file: %d\n", i); return 0; 4

ESERCIZIO 3 Il programma è corretto sintatticamente e la sua esecuzione produce la stampa: 2 4 6 5 3 1 La funzione split( ) controlla, a partire dall ultimo valore fino al primo, i valori memorizzati nell array di interi p. Se i valori sono pari, allora la funzione copia tali valori nella lista result1, ponendoli in testa alla lista; se invece i valori sono dispari, la funzione li pone in coda alla lista (a tal fine tiene traccia dell ultimo elemento della lista tramite result2). Il programma main() si limita a definire un array di interi v, e a passarlo come parametro alla funzione split( ). Da notare che come dimensione dell array viene passato il valore di v che corrisponde all indice di valore dim, variabile definita globalmente. Siccome dim vale 5, v[5] vale 6, e quindi split è invocato con parametri split(v, 6). Infine il programma main() stampa a video il contenuto della lista, e de-alloca opportunamente la memoria occupata. 5