Soluzioni seconda prova intermedia del 30 gennaio 2006 temi 1 e 2. Siano date le seguenti definizioni di costanti e tipi in linguaggio C:

Documenti analoghi
Fondamenti di Informatica 2

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

Compito di Fondamenti di Informatica

Appello di Informatica B

Gestione delle stringhe in C

Gestione dei File in C

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

Gestione di files Motivazioni

Esempio: Array di struct

3. Terza esercitazione autoguidata: progetto gestione voli

I puntatori e l allocazione dinamica di memoria

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

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

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

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

Esercizio 1. Esercizio 1

Programmazione Orientata agli Oggetti in Linguaggio Java

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

RICERCA DI UN ELEMENTO

LISTE, INSIEMI, ALBERI E RICORSIONE

La struttura dati ad albero binario

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

Laboratorio di Fondamenti di Informatica anno accademico Esercizi proposti il

Esercitazione 10. Strutture ed Enumerazioni. Allocazione dinamica di memoria

SOLUZIONE ESERCIZIO 1

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

Record in C: il costruttore struct.

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

Esercizio 1. Esercizio 2

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

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Problem solving elementare su dati vettoriali

Gestione dei File. dischi nastri cd

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

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

Laboratorio di Algoritmi e Strutture Dati

File di testo e file binari Directory

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

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

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

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

Fondamenti di Informatica T. Linguaggio C: File

Esame del 3 febbraio 2010

PIANO DI LAVORO. a.s / 2016

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

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

RICORSIONE - schema ricorsivo (o induttivo) si esegue l'azione S, su un insieme di dati D, mediante eventuale esecuzione di

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Esercizi della lezione 5 di Java

Struttura dati FILE. Concetto di FILE

Introduzione alla programmazione in C

Gest ione di list e in C

PROGRAMMI LINGUAGGIO C

Linguaggio C - Stringhe

RICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3

Esame di Informatica Generale 9 CFU 21 Giugno 2011 Professori: Carulli, Fiorino, Mazzei

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

Caratteri e stringhe Esercizi risolti

/* esercizio 5. Memorizzare l elenco dei prodotti giacenti in un magazzino in modo da poter effettuare le seguenti operazioni :

Algoritmi di Ricerca. Esempi di programmi Java

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

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Verifica che una grammatica sia Context Free nel GrammaReader

Lezione 9: Strutture e allocazione dinamica della memoria

Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-

Alfabeto ed elementi lessicali del linguaggio C

Esercizi di programmazione in C

Lab 11 Gestione file di testo"

Funzioni. Il modello console. Interfaccia in modalità console

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

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

Cos è una stringa (1) Stringhe. Leggere e scrivere stringhe (1) Cos è una stringa (2) DD Cap. 8 pp KP Cap. 6 pp

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Laboratorio di programmazione

Le variabili. Olga Scotti

dall argomento argomento della malloc()

puntatori Lab. Calc. AA 2007/08 1

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

Le funzioni. Funzioni. Funzioni. Funzioni. Funzioni. Funzioni

Java Native Interface Appunti

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

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.

Problem solving avanzato

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

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

Codifica: dal diagramma a blocchi al linguaggio C++

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Sistemi Operativi (M. Cesati)

DESCRIZIONE CREAZIONE APP Si suddivide in 4 fasi di lavoro: 1. PIANIFICAZIONE; 2. PROGETTAZIONE; 3. SVILUPPO; 4. DISTRIBUZIONE.

(1) - - (4) R4 = R7 * R7 (4) (2) (3) 5 - (4) rinviata perché in WAW con (3) 6 (3) e (4) ritirabili ma attendono il completamento di (2) (2) (3) (4)

Le stringhe. Le stringhe

Linguaggio C - Funzioni

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

Algoritmi e Strutture Dati

Transcript:

Fondamenti Informatica B Soluzioni seconda prova intermedia del 30 gennaio 2006 temi 1 e 2 Esercizio 1 tema 1 Siano date le seguenti definizioni di costanti e tipi in linguaggio C: #define MAX_LENGTH 40 #define MAX_PRENOTAZIONI_UTENTE 10 typedef char Stringa[MAX_LENGTH]; typedef struct { Stringa cognome; Stringa nome; int numpersone; Stringa giornoarrivo; /*nel formato ggmmaaaa */ int giornipermanenza; Prenotazione; /* una variabile di questo tipo contiene la singola prenotazione richiesta da un utente */ typedef struct { Prenotazione vettprenotazioni[max_prenotazioni_utente]; int numprenotazioni; ElencoPrenotazioni;

typedef struct el { Prenotazione info; struct el *next; ElemLista; typedef ElemLista *Lista; Si sviluppi il sottoprogramma void inserisciprenotazionidioggi(elencoprenotazioni prenotazioni, Stringa datacorrente, Lista *l); che inserisce nella lista puntata da l tutte le prenotazioni contenute in prenotazioni che hanno come giorno di arrivo la data corrente. In altre parole, tutte le prenotazioni il cui campo giornoarrivo sia uguale al parametro datacorrente. È possibile utilizzare le funzioni di libreria per la manipolazione delle stringhe (ad esempio, per valutare se due stringhe sono uguali). SOLUZIONE void inserisciprenotazionidioggi(elencoprenotazioni prenotazioni, Stringa datacorrente, Lista *l) { int i; Prenotazione p; for (i=0; i < prenotazioni.numprenotazioni; i++) { p = prenotazioni.vettprenotazioni[i]; if (strcmp(p.giornoarrivo, datacorrente) == 0) inserisciintesta(l, p);

tema 2 Siano date le seguenti definizioni di costanti e tipi in linguaggio C: #define MAX_LENGTH 40 #define MAX_PRENOTAZIONI_UTENTE 10 typedef char Stringa[MAX_LENGTH]; typedef struct { Stringa cognome; Stringa nome; int numpersone; Stringa giornoarrivo; /*nel formato ggmmaaaa */ int giornipermanenza; Prenotazione; /* una variabile di questo tipo contiene la singola prenotazione richiesta da un utente */ typedef struct { Prenotazione vettprenotazioni[max_prenotazioni_utente]; int numprenotazioni; ElencoPrenotazioni; typedef struct el { Prenotazione info; struct el *next; ElemLista;

typedef ElemLista *Lista; Si sviluppi il sottoprogramma void inserisciprenotazionidioggi(elencoprenotazioni prenotazioni, int numerog, Lista *l); che inserisce nella lista puntata da l tutte le prenotazioni contenute in prenotazioni in cui i giorni di permanenza siano in numero inferiore al valore del parametro numerog ed il numero di persone indicato nella prenotazione sia superiore a 5. SOLUZIONE void inserisciprenotazionidioggi(elencoprenotazioni prenotazioni, int numerog, Lista *l) { int i; Prenotazione p; for (i=0; i < prenotazioni.numprenotazioni; i++) { p = prenotazioni.vettprenotazioni[i]; if (p.giornipermanenza < numerog && p.numpersone > 5) inserisciintesta(l, p); Esercizio 2 tema1 Si consideri la seguente funzione ricorsiva: int fric(int a) { if (a < 2) return 0;

else if ((a % 2) == 0) return a + fric(a-2); else return fric(a-1); Si consideri, inoltre, la chiamata di fric all interno del seguente main: void main() { int valore = 5; int risultato; risultato = fric(valore); printf( Risultato della chiamata ricorsiva: %d, risultato); 1. Quale valore viene stampato dal main? Si mostri lo stato della memoria nel momento in cui l ultimo record di attivazione associato a fric è ancora attivo. 2. Qual è in generale il valore calcolato dalla funzione fric? SOLUZIONE 1)

main valore = 5 risultato = fric(valore) risultato = 0 + 2 + 4 = 6 6 fric(5) 1 rec. att. a = 5 return = fric(4) 6 fric(4) 2 rec. att. a = 4 return = 4 + fric(2) 2 fric(2) 3 rec. att. a = 2 return = 2 + fric(0) fric(0) 4 rec. att. a = 0 return = 0 0 2) La funzione calcola la somma dei numeri pari compresi fra il valore passato come parametro e 2. tema 2 Si consideri la seguente funzione ricorsiva: int fric(int a) { if (a < 3) return 0; else if ((a % 3) == 0) return a + fric(a-3); else return fric(a-(a%3));

Si consideri, inoltre, la chiamata di fric all interno del seguente main: void main() { int valore = 10; int risultato; risultato = fric(valore); printf( Risultato della chiamata ricorsiva: %d, risultato); 1. Quale valore viene stampato dal main? Si mostri lo stato della memoria nel momento in cui l ultimo record di attivazione associato a fric è ancora attivo. 2. Qual è in generale il valore calcolato dalla funzione fric? SOLUZIONE 1)

2) La funzione calcola la somma dei multipli di 3 compresi fra il valore passato come parametro e 3.

Esercizio 3 tema 1 I dati relativi ai risultati del campionato di hockey su ghiaccio per l anno 2005 vengono salvati all interno del file di testo risultati2005.txt. Tali dati vengono memorizzati per righe, secondo il seguente formato: Milano Asiago 10 3 Cortina Bolzano 2 3 Ogni riga del file memorizza le informazioni relative a una partita giocata nel 2005. Per ogni partita, le informazioni memorizzate sono (nell ordine in cui appaiono in ogni riga): il nome della squadra di casa; il nome della squadra ospite; il punteggio della squadra di casa; il punteggio della squadra ospite. 1. Si definisca il tipo di dato Partita. Una variabile di questo tipo deve permettere di memorizzare tutti i dati relativi ad una partita. 2. Data la seguente definizione del tipo Stringa: #define MAX_LENGTH 50 typedef char Stringa[MAX_LENGTH]; Si scriva il codice del sottoprogramma int vittorietrasferta(stringa nomefile), che legge dal file risultati2005.txt i dati relativi alle partite e visualizza sullo schermo i dettagli di tutte quelle dove la squadra ospite ha battuto la squadra di casa. Il sottoprogramma restituisce il numero complessivo delle partite in cui la squadra ospite ha battuto la squadra di casa. 3. Dato il seguente main, si scriva la corretta chiamata alla funzione vittorietrasferta....

void main() { Stringa nomefileris = risultati2005.txt ; int vittorie; /* chiamata funzione vittorietrasferta(...) */... SOLUZIONE 1) typedef struct { Stringa nomesquadracasa; Stringa nomesquadraospite; int punteggiocasa; int punteggioospite; Partita; 2) int vittorietrasferta(stringa nomefile) { int contvittorietrasferta = 0; int valorilettidafile; Partita p; FILE *pf= fopen(nomefile, "r"); if (pf == NULL) printf("impossibile aprire il file %s", nomefile);

else { valorilettidafile = fscanf(pf, "%s %s %d %d", p.nomesquadracasa, p.nomesquadraospite, &p.punteggiocasa, &p.punteggioospite); while (valorilettidafile > 0) { if (p.punteggioospite > p.punteggiocasa) { contvittorietrasferta++; printf("dettagli partita: ospite %s batte casa %s %d a %d", p.nomesquadraospite, p.nomesquadracasa, p.punteggioospite, p.punteggiocasa); valorilettidafile = fscanf(pf, "%s %s %d %d", p.nomesquadracasa, p.nomesquadraospite, &p.punteggiocasa, &p.punteggioospite);

if (fclose(pf)!= 0) printf("errore nella chiusura del file"); return contvittorietrasferta; 3) void main() { Stringa nomefileris = "risultati2005.txt"; int vittorie; /* chiamata funzione vittorietrasferta(...) */ vittorie = vittorietrasferta(nomefileris); tema 2 I dati relativi ai risultati del campionato di hockey su ghiaccio per l anno 2005 vengono salvati all interno del file di testo risultati2005.txt. Tali dati vengono memorizzati per righe, secondo il seguente formato: Milano Asiago 10 3 Cortina Bolzano 2 3 Ogni riga del file memorizza le informazioni relative a una partita giocata nel 2005. Per ogni partita, le informazioni memorizzate sono (nell ordine in cui appaiono in ogni riga): il nome della squadra di casa; il nome della squadra ospite;

il punteggio della squadra di casa; il punteggio della squadra ospite. 1. Si definisca il tipo di dato Partita. Una variabile di questo tipo deve permettere di memorizzare tutti i dati relativi ad una partita. 2. Data la seguente definizione del tipo Stringa: #define MAX_LENGTH 50 typedef char Stringa[MAX_LENGTH]; Si scriva il codice del sottoprogramma int memorizzavittorie(stringa nomefile), che acquisisce da tastiera i dati relativi alle partite e salva sul file risultati2005.txt quelli relativi alle partite dove la squadra ospite ha battuto la squadra di casa. Il sottoprogramma restituisce il numero complessivo delle partite in cui la squadra ospite ha battuto la squadra di casa. 3. Dato il seguente main, si scriva la corretta chiamata alla funzione memorizzavittorie.... void main() { Stringa nomefileris = risultati2005.txt ; int vittorie; /* chiamata funzione memorizzavittorie(...) */... SOLUZIONE 1) typedef struct { Stringa nomesquadracasa;

Stringa nomesquadraospite; int punteggiocasa; int punteggioospite; Partita; 2) int memorizzavittorie(stringa nomefile) { int contvittorietrasferta = 0; int valoriscrittisufile; boolean terminalettura; Partita p; FILE *pf= fopen(nomefile, "w"); if (pf == NULL) printf("impossibile aprire il file %s", nomefile); else { do { printf("\ninserisci dati di una partita\n"); printf("nome squadra di casa:"); scanf("%s", p.nomesquadracasa); printf("\nnome squadra ospite:"); scanf("%s", p.nomesquadraospite); printf("\npunteggio squadra di casa:"); scanf("%d", &p.punteggiocasa); printf("\npunteggio squadra ospite:"); scanf("%d", &p.punteggioospite);

if (p.punteggioospite > p.punteggiocasa) { contvittorietrasferta++; valoriscrittisufile = fprintf(pf, "%s %s %d %d", p.nomesquadracasa, p.nomesquadraospite, p.punteggiocasa, p.punteggioospite); printf("terminare lettura (sì = 1)?"); scanf("%d", &terminalettura); while (terminalettura == falso && valoriscrittisufile > 0); if (terminalettura == falso) printf("errore scrittura su file"); if (fclose(pf)!= 0) printf("errore nella chiusura del file"); return contvittorietrasferta; 3) void main() {

Stringa nomefileris = "risultati2005.txt"; int vittorie; /* chiamata funzione memorizzavittorie(...) */ vittorie = memorizzavittorie(nomefileris); Esercizio 4 tema 1 Si indichi quale delle seguenti affermazioni è vera motivando brevemente la risposta (è possibile che una, nessuna o più affermazioni siano vere contemporaneamente): 1. Un indirizzo di rete può essere assegnato contemporaneamente a più calcolatori. 2. Un processo è definito come la coppia (programma eseguibile, stato di esecuzione). 3. La memoria virtuale ci consente di aumentare la capacità di memorizzazione di una memoria di massa. SOLUZIONE 1. falso, 2. vero, 3. falso (aumenta la capacità della memoria centrale!) tema 2 Si indichi quale delle seguenti affermazioni è vera motivando brevemente la risposta (è possibile che una, nessuna o più affermazioni siano vere contemporaneamente): 1. Un processo è un programma eseguibile. 2. Un indirizzo di rete non può mai essere assegnato contemporaneamente a più calcolatori.

3. Un processo può passare dallo stato di attesa allo stato di esecuzione appena il dato che stava aspettando si rende disponibile. SOLUZIONE 1. falso (è necessario anche lo stato di esecuzione), 2. vero, 3. falso (il processo passa sempre prima dallo stato di pronto).