UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA ·...

26
Università degli Studi di Bergamo - Esercitazioni di Informaca Facoltà di Ingegneria (modulo di programmazione - 6 CFU) a.a. 2019-2020 Codice corso: 21012 UNIVERSITÀ DI BERGAMO ESAME DI INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA) Prof. G. PSAILA PROVA IN ITINERE DEL 12/01/2017 Per consegnare, si svolgano entrambi gli esercizi. Durata: 90 minuti. Punteggio complessivo: 16 punti. Sufficienza: 9 punti Esercizio (10 punti) Si consideri un programma per gestire la raccolta delle informazioni relative ad un listino prezzi di prodotti da vendere, organizzato in una lista dinamica. Un prodotto è definito da un tipo strutturato denominato PRODOTTO, i cui campi sono il codice (stringa di 12 caratteri) la data di inserimento nel listino (stringa nel formato internazionale aaaa-mm-gg ), il prezzo (numero in virgola mobile), la percentuale IVA (numero intero) e una tipologia di prodotto (un numero intero positivo). Si definisca quindi la struttura dati per una lista dinamica dove il campo informativo del nodo è a sua volta basato sul tipo PRODOTTO. Si scriva la funzione denominata ProdottiTipologiaRedditizia che riceve come parametri la lista dei prodotti, un vettore di numeri interi denominato Tipologie e un numero intero denominato size che indica quanti elementi sono presenti nel vettore Tipologie. Per ogni tipologia nel vettore, la funziona calcola la media dei prezzi dei prodotti di quella tipologia e calcola la tipologia con la media più alta. Quindi, la funzione genera una nuova lista dinamica (basata sugli stessi tipi di quella ricevuta come parametro) che contiene solo e soltanto i prodotti della tipologia con la media più alta e restituisce l’indirizzo della testa di questa nuova lista. Nel caso in cui non vi siano prodotti di nessuna delle tipologia riportate, la funzione restituisce il valore NULL. N.B. Si eviti la duplicazione del codice.

Transcript of UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA ·...

Page 1: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

UNIVERSITÀ DI BERGAMOESAME DI

INFORMATICA 12 CFU – Modulo diProgrammazione

(ING. INFORMATICA)Prof. G. PSAILA

PROVA IN ITINERE DEL 12/01/2017

Per consegnare, si svolgano entrambi gli esercizi. Durata: 90 minuti.Punteggio complessivo: 16 punti. Sufficienza: 9 punti

Esercizio (10 punti)Si consideri un programma per gestire la raccolta delle informazionirelative ad un listino prezzi di prodotti da vendere, organizzato in unalista dinamica. Un prodotto è definito da un tipo strutturato denominatoPRODOTTO, i cui campi sono il codice (stringa di 12 caratteri) la data diinserimento nel listino (stringa nel formato internazionale aaaa-mm-gg ),il prezzo (numero in virgola mobile), la percentuale IVA (numero intero)e una tipologia di prodotto (un numero intero positivo).Si definisca quindi la struttura dati per una lista dinamica dove il campoinformativo del nodo è a sua volta basato sul tipo PRODOTTO.

Si scriva la funzione denominata ProdottiTipologiaRedditizia chericeve come parametri la lista dei prodotti, un vettore di numeri interidenominato Tipologie e un numero intero denominato size che indicaquanti elementi sono presenti nel vettore Tipologie. Per ogni tipologianel vettore, la funziona calcola la media dei prezzi dei prodotti di quellatipologia e calcola la tipologia con la media più alta. Quindi, la funzione genera una nuova lista dinamica (basata sugli stessitipi di quella ricevuta come parametro) che contiene solo e soltanto iprodotti della tipologia con la media più alta e restituisce l’indirizzodella testa di questa nuova lista.Nel caso in cui non vi siano prodotti di nessuna delle tipologia riportate,la funzione restituisce il valore NULL.N.B. Si eviti la duplicazione del codice.

Page 2: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

Soluzione:

struct PRODOTTO { char codice[12+1]; // stringa char dataInserimento[10+1]; // stringa float prezzo; int percentualeIVA; unsigned int tipo;};

struct nodo { PRODOTTO info; nodo * next;};

nodo *ProdottiTipologiaRedditizia(nodo *L, unsigned int Tipologie[], int size);

Page 3: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

nodo *ProdottiTipologiaRedditizia(nodo *L, unsigned int Tipologie[], int size) {

if (size <= 0) return NULL;

node *ptr, *aux, *Lrisultato; int i, count; float accMedia, maxPrezzo; float *prezzoMedio = (float*) new float[size];

for (i = 0; i < size; ++i) { accMedia = 0.0; count = 0; for (ptr = L; ptr != NULL; ptr = ptr->next) { if ( (ptr->info).tipo == Tipologie[i] ) { accMedia += (ptr->info).prezzo; count += 1; } } if ( count != 0 ) prezzoMedio[i] = accMedia / count; else prezzoMedio[i] = 0.0; }

maxPrezzo = prezzoMedio[0]; for (i = 1; i < size; ++i) { if ( prezzoMedio[i] > maxPrezzo ) { maxPrezzo = prezzoMedio[i]; } }

Page 4: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

Lrisultato = NULL; // Scelta: inserimento in testaif (maxPrezzo != 0.0) { // se maxPrezzo == 0 i valori nel

// vettore Tipologie[] non sono // presenti tra i tipi nella lista// cerco maxPrezzo nelle celle del vettore prezzoMediofor (int j = 0; j < size; j++) { if (maxPrezzo == prezzoMedio[j]) { int indexTipoMax = j; for (ptr = L; ptr != NULL; ptr = ptr->next) { if ( (ptr->info).tipo == Tipologie[indexTipoMax] ) { aux = (node*) new node; aux->info = ptr->info; aux->next = Lrisultato; Lrisultato = aux; } // end if } // end for } // end if } // end for j

}delete[] prezzoMedio

return Lrisultato;

} // end ProdottiTipologiaRedditizia

Page 5: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

Domanda Teoria (6 punti)Si consideri un sistema dove per gli indirizzi di memoria vengono usati 24 bit e la memoria vienegestita con il sistema della paginazione con pagine da 1Kbyte e indirizzi logici. Si consideri ilseguente indirizzo logico l=000000000100110000001110.Se nella tabella delle pagine abbiamo le corrispondenze pl→pf (in base 10) 17→1, 18→3,19→5, 20→6, qual è l’indirizzo fisico f su 24 bit corrispondente all’indirizzo logico l ?

Page 6: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

Soluzione

Considerando un’organizzazione della memoria del calcolatore con indirizzamento al Byte(quindi ogni byte in memoria centrale ha un indirizzo); in un sistema operativo che gestiscela memoria del calcolatore con il meccanismo della paginazione (dove le pagine logiche e lepagine fisiche hanno la stessa capacità – misurata in byte): le stringhe binarie corrispondenti alla codifica in binario naturale dell’indirizzo logico e dell’indirizzo fisico di un byte, sono da considerarsi partizionate, rispettivamente, in:

[numero di pagina logica] e [spiazzamento];[numero di pagina fisica] e [spiazzamento].

Poiché la traccia dell’esercizio fissa la capacità di ogni pagina uguale a 1KByte, se ne deduceche sono necessari 10-bit per indirizzare ciascun byte all’interno di una pagina.

Per quanto detto sopra saranno i 10-bit meno significativi di un indirizzo (logico o fisico);restano dunque 14-bit per codificare i numeri di pagina (logica oppure fisica) all’internodella tabella delle pagine mantenuta dal sistema operativo (e dalla MMU).

Considerando l’indirizzo logico assegnato nella traccia dell’esercizio, si deduce: numero di pagina logica = 19dec spiazzamento = 14dec

quindi il numero di pagina fisica richiesto dall’esercizio, vista la tabella delle pagine riportatanella traccia, vale: numero di pagina fisica = 5dec

L’indirizzo fisico sarà ottenuto come la concatenazione delle codifiche binarie di:

numero di pagina fisica = 5dec, spiazzamento = 14dec

f = 00000000000101 0000001110

Page 7: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

Page 8: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

Soluzione:

struct BUONO { char codice[10+1]; // stringa char dataEmissione[10+1]; // stringa char emailCliente[250+1]; // stringa

float valoreBuono; char dataScadenza[10+1]; // stringa

unsigned int stato; // 1 – non ancora utilizzato // 2 – è stato utilizzato // 3 - scaduto };

struct nodo { BUONO info; nodo * next;};

nodo* BuoniNonUtilizzati(nodo* L, char* dateScadenza[], int size);

Crea una nuova lista con buoni non scaduti e con dataScadenza dS uguale a una di quellenel vettore. Detta dsV una data di scandeza nel vettore, il titolare di un buono (email) con

dsV non deve aver usato nessun altro buono presente nella lista.

// Restituisce +1 se l’utente con email passata come // secondo parametro ha utilizzato almeno un altro // buono oltre quello con codice passato come terzo parametro.// Restituisce 0, altrimenti.

int altriBuoniUsati(nodo* L, char* email, char* codice){ nodo* ptr; for (ptr = L; ptr != NULL; ptr = ptr->next) { if ( strcmp(ptr->info.emailCliente, email) == 0 && strcmp(ptr->info.codice, codice) != 0 && ptr->info.stato == 2 ) return +1; } // end for return 0;

Page 9: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

} // end altriBuoniUsati

// Ritorna +1 nel caso in cui l’inserimento fallisca, 0 altrimenti

int inserimentoInTesta(nodo* &L, BUONO b) { nodo *aux = new nodo; if (aux == NULL) return +1; aux->info = b; aux->next = L; L = aux; return 0; } // end inserimentoInTesta

nodo* BuoniNonUtilizzati(nodo *L, char* dateScadenza[], int size) {

nodo *ptr = NULL, *nuovaLista = NULL; int flag;

for (ptr = L; ptr != NULL; ptr = ptr->next) { if (ptr->info.stato != 3) { for (int i = 0; i < size; i++) { if (strcmp(ptr->info.dataScadenza, dateScadenza[i]) == 0 && altriBuoniUsati(L, ptr->info.emailCliente, ptr->info.codice) == 0) { flag = inserimentoInTesta(nuovaLista, ptr->info); if (flag == 1) return NULL;

} // end if } // end for } // end if } // end for return nuovaLista; } // end BuoniNonUtilizzati

Page 10: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

La dichiarazione nel main di un vettore di stringhe da utilizzare come secondo parametrodel sottoprogramma richiesto dall’esercizio, può essere fatta in almeno due modi distinti:(1) con un vettore di stringhe – come variabile automatica (2) con un vettore di stringhe dinamico

(1) – ipotizzando di utilizzare un vettore di 3 stringhe (ciascuna con massimo 60caratteri)....

typedef char mystring[60+1];typedef mystring vett[3];

int main(){ vett W; strcpy(W[0], "2018-12-21");

strcpy(W[1], "2018-11-10"); strcpy(W[2], "2018-10-08"); ... ... ... nodo *L = NULL; ... ... ...

L = BuoniNonUtilizzati(L, W, 3) ... ... ...

}

(2) – ipotizzando di utilizzare un vettore di 3 stringhe (ciascuna con massimo 60caratteri)....

int main(){ char* *W = new char*[3]; W[0] = new char[60+1]; W[1] = new char[60+1]; W[1] = new char[60+1]; strcpy(W[0], "2018-12-21");

strcpy(W[1], "2018-11-10"); strcpy(W[2], "2018-10-08"); ... ... ... nodo *L = NULL; ... ... ...

L = BuoniNonUtilizzati(L, W, 3) ... ... ...

}

Page 11: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

Soluzione (estesa) della domanda di teoriaLa convenzione di codifica dei simboli stampabili chiamata ASCII a 8-bit (adottata nellinguaggio C e C++ per la codifica delle varibili di tipo unsigned char) dove ad ogni

simbolo è associata una delle 256 stringhe binarie a 8-bit su per i caratteri degli alfabetidelle lingue occidentali europee e USA coincide con la codifica standard pubblicatacongiuntamente dall'International Standard Organization (ISO) e dall'InternationalElectrotechnical Commission (IEC), chiamata ISO/IEC-8859-1 (chiamata anche Latin-1).L'ISO ha standardizzato 15 tabelle per le lettere accentate e i simboli usati in tutte le lingue: ISO/IEC-8859-1, ISO/IEC-8859-2,..., ISO/IEC-8859-11, ISO/IEC-8859-13, ..., ISO/IEC-8859-16; utili per qualunque industria di componentistica hardware e software per garantirel'interscanbialità di informazioni testuali.

Unicode è un sistema di codifica che assegna un numero univoco ad ogni carattere usatoper la scrittura di testi, in maniera indipendente dalla lingua, dal sistema operativo e dalprogramma utilizzato. Incorpora, la codifica ASCII 8 bit (ISO/IEC-8859-1), ma va molto oltre,codificando i caratteri usati in quasi tutte le lingue vive e in alcune lingue morte, nonchésimboli matematici e chimici, cartografici, l'alfabeto Braille, ideogrammi ecc.Il codice assegnato a ciascun simbolo stampabile viene rappresentato con U+, seguito dalle

quattro o sei cifre esadecimali del numero che individua in simbolo in esame.Per esempio, i 128 simboli della codifica ASCII a 7 bit si indicano come U+0000 a U+007F.

L’UTF-8 (Unicode Transformation Format, 8 bit) è una codifica di caratteri Unicode in sequenze di lunghezza variabile di byte. UTF-8 usa da 1 a 4 byte per rappresentare un carattere Unicode.I simboli nell'intervallo UniCode 0x000000-0x00007F sono codificati usando 1 solo byte con la convenzione del codice

ASCII a 7 bit. Formato binario (un byte con il primo bit a 0): 0xxxxxxx

0x000080-0x0007FF sono codificati usando due byte. Il primo byte inizia per 110, mentre il successivo deve iniziare con 10.Formato binario: 110xxxxx 10xxxxxx

0x000800-0x00FFFF sono codificati usando tre byte. Il primo byte inizia con 1110, mentre i due byte successivi devono iniziare ciascuno con 10. Formato binario: 1110xxxx 10xxxxxx 10xxxxxx

0x010000-0x10FFFF sono codificati usando quattro byte. Il primo byte inizia con 11110, mentre i tre byte successivi devono iniziare ciascuno con 10.Formato binario: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

La notazione UniCode U+0130 rientra nell’intervallo UniCode 0x000080-0x0007FF, che in UTF-8 vede l’uso di due byte: 110xxxxx 10xxxxxx.

Page 12: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

La sequenza esadecimale 0130 in binario diventa 0000 0001 0011 0000 e dunque in UTF-8 (scorrendo la precedente stringa binaria da destra a sinistra) otteniamo:

11000100 10110000(sostituendo i bit della stringa binaria ordinatamente con le x, nel procedere da destra a sinistra e scartando gli 0 restanti nella stringa binaria originale).

Page 13: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

TEMA ESAME-1

Si consideri un programma che gestisce percorsi stradali. Un percorso stradale è composto da una sequenza di segmenti;

un segmento è costituito da una coordinata iniziale (stringa di 20caratteri),

una coordinata finale (stringa di 20 caratteri) e la lunghezza del segmento stesso (numero con virgola, indicante i Km

del segmento). Un percorso è quindi una lista dinamica di segmenti.Il nodo in testa alla lista contiene sempre il segmento iniziale del percorso,mentre i nodi della lista successivi al primo non sono in ordine dipercorrenza. (Per esempio, il terzo nodo potrebbe contenere il 2do segmento delpercorso, il quinto nodo il potrebbe contenere il 3zo segmento del percorsoetc..)

Dopo aver definito la struttura dati, si scriva la funzione

...LunghSegmento(...)

che riceve come parametri un percorso (quindi, l'indirizzo del nodo in testaalla lista che descrive il percorso) e un numero di “segmenti percorribili”lungo il percorso stesso. Se il numero di “segmenti percorribili” passato come parametro non esistenella lista, allora il sottoprogramma restituisce 0, altrimenti restituisce lalunghezza totale del numero di “segmenti percorribili” ricevuto comeparametro.

Page 14: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

struct node { char begin[20+1]; char end[20+1]; double len;

node *next;};

unsigned int lenPath(node *head) { if (head == NULL) return 0; return 1+lenPath(head->next);} // end lenPath;

double LungSegmento(node *head, unsigned int progressive) { node *lastVisited, *cur; unsigned int prog; bool found = false;

if (head == NULL || progressive == 0 || progressive > lenPath(head)) return 0.0; lastVisited = head; prog = 1; lenTot = head->len;

while (prog < progressive) {cur = head->next;

found = false; while (cur != NULL && found == false) { if (strcmp(lastVisited->end, cur->begin) == 0) { lastVisited = cur;

lenTot += cur->len; found = true;

} else cur = cur->next;

} // end while

Page 15: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

if (found == false) return 0.0; prog += 1; } // end while

return lenTot;

} // LungSegmento

TEMA ESAME-2

Il comando di polizia locale vi commissiona la realizzazione della funzione

...AggiungiMulta(...)

con la quale si aggiunge un nuovo nodo alla lista passata come parametro. Il nodo deve contenere le informazioni dell'intestatario della targaautomobilistica, anch'essa passata come parametro, disponibili nel fileMotorizzazione.dat, il cui nome viene passato come terzo parametro allafunzione ...AggiungiMulta(...).

Dopo aver definito una possibile struttura dati della lista e un esempio ditracciato record del file, implementare la funzione (in C/C++) in modo che:

1. riceva i tre parametri descritti, 2. estragga dal file i dati necessari alla creazione di un nuovo nodo da

inserire nella lista in base alla targa dell'automobile che ha effettuatol'infrazione e

3. aggiunga un nuovo nodo con tali dati alla lista.

Page 16: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

struct node { char fiscalCode[16+1]; char plateNumber[7+1]; node* next;};// Il file Motorizzazione.dat contiene su ogni linea:// fiscalCode<spazio>plateNumber<\n>

bool checkString(char line[], char plate[]);char *getFiscalCode(char line[]);// ritorno false, se non riesco ad aprire il file // oppure se la targa non è contenuta nel filebool AggiungiMulta(node* &head, char targa[], char fileName[]) { ifstream fin; bool flag = false; char line[24+1]; fin.open(filename); if (fin.is_open() == false) { cerr << “File not opened”; return false; } while (feof(fin) == false && flag == false) { fin.getline(line, 25, '\n'); flag = checkString(line, targa); } fin.close(); if (flag == true) { node* aux = new node; strcpy(aux->fiscalCode, getFiscalCode(line)); strcpy(aux->numberPlate, targa); if (head == NULL) // aggiungo nodo in testa head = aux; else {

aux->next = head; head = aux; } return true; } return false;

Page 17: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

} // end AggiungiMulta

bool checkString(char line[], char plate[]) { unsigned int i = 0, j = 0; while (line[i] != '\0' && line[i] != ' ') i++; if (line[i] == '\0') return false; else i = i + 1; while (line[i] != '\0' && plate[j] != '\0' && line[i] == plate[j]) { i++; j++; } return line[i] == '\0' && plate[j] == '\0'; } // end checkString

char *getFiscalCode(char line[]) {

char *fc = new char[16+1]; unsigned int i = 0;

while (line[i] != ' ') { fc[i] = line[i]; i++; } fc[i] = '\0';

return fc;} // end getFiscalCode

Page 18: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

TEMA ESAME-3.1

Si consideri un programma che gestisce i biglietti di un teatro.

Ogni biglietto è caratterizzato da un numero progressivo (intero), la data diemissione (stringa di 10 caratteri), dal prezzo del biglietto e dal titolo dellospettacolo (stringa di 50 caratteri). I biglietti sono raccolti in una lista dinamica.

Dopo aver definito la struttura dati, si scriva la funzione...ImportoMassimo(...), che riceve come parametri la lista dibiglietti, una data (stringa di 10 caratteri) e un numero in virgolamobile denominato soglia; la funzione restituisce l'importo massimo dei prezzi dei bigliettivenduti nella data specificata, il cui prezzo è maggiore o ugualedella soglia indicata dal terzo parametro. Se in quella data non vi sono biglietti con queste caratteristiche, la funzionerestituisce il valore -1.

Page 19: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

struct node { unsigned int progressive; char issueDate[10+1]; double price; char performance[50+1];

node* next;};

double ImportoMassimo(node* head, char date[], double soglia) {

double maxPrice = -1.0; while (head != NULL) { if (strcmp(head->issueDate, date) == 0 && head->price >= soglia) {

if (maxPrice < head->price) maxPrice = head->price; } head = head->next; } return maxPrice;} // end ImportoMassimo

Page 20: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

TEMA ESAME-3.2

Si consideri un programma che gestisce i biglietti di un teatro.

Ogni biglietto è caratterizzato da un numero progressivo (intero), la data di emissione (stringa di 10 caratteri), dal prezzo del biglietto e dal titolo dello spettacolo (stringa di 50 caratteri). I biglietti sono raccolti in una lista dinamica.

Dopo aver definito la struttura dati, si scriva la funzione ...ImportoMedio(...), che riceve come parametri la lista di biglietti e una data (stringa di 10 caratteri), e restituisce l'importo medio dei prezzi dei biglietti venduti nella data specificata. Se in quella data non vi sono biglietti, la funzione restituisce il valore -1.

Page 21: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

struct node { unsigned int progressive; char issueDate[10+1]; double price; char performance[50+1];

node* next;};

double ImportoMedio(node* head, char date[]) {

double avg = 0.0; unsigned int count = 0; while (head != NULL) { if (strcmp(head->issueDate, date) == 0) { avg = avg + head->price; count++; } head = head->next; } if (count != 0) avg = avg / count; else avg = -1.0;

return avg;

} // end ImportoMedio

Page 22: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

TEMA ESAME-4.1

Il nuovo navigatore satellitare VM.GP necessita della funzione

...RemainingRoute(...)

che, dato un percorso e la lunghezza percorsa, genera il percorsorimanente. Vediamo nel dettaglio.

Un percorso è descritto da una lista dinamica, dove ogni elemento dellalista descrive un segmento di strada da percorrere, con le coordinate iniziali(stringa di 10 caratteri), le coordinate finali (stringa di 10 caratteri), lalunghezza del segmento di strada (numero in virgola mobile indicante ichilometri).

La funzione ...RemainingRoute(...) riceve due parametri: uno è l'indirizzo della testa della lista che descrive il percorso calcolato,l'altro è la lunghezza già percorsa (numero in virgola mobile indicante ichilometri) di quel percorso. La funzione produce un'altra lista, definita sulla stessa struttura dati el'indirizzo della cui testa viene restituito dalla funzione, che contiene solo isegmenti del percorso iniziale successivi al segmento raggiunto con ichilometri percorsi (secondo parametro della funzione).

Per esempio, se il percorso calcolato è composto da tre segmenti, il primo di5 Km, il secondo di 10 Km e il terzo di 2 Km, e la lunghezza percorsa è 7Km, la funzione produrrà una lista che descrive un percorso costituito solodal terzo segmento (perché successivo al segmento raggiunto percorrendo 7Km).

Definire la struttura dati della lista e implementare in C/C++ la funzionerichiesta.

Page 23: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

// Si assume che nodi consecutivi della lista contengano segmenti// consecutivi lungo il percorso.

struct node { char begin[10+1]; char end[10+1]; double km;

node* next; };node* copyNode(node* p);node* RemainingRoute(node* head, double len) { node *headRet = NULL, *curr = NULL; double count = 0.0; while (count <= len && head != NULL) { count += head->km; head = head -> next; } if (head != NULL) { headRet = copyNode(head); curr = headRet; head = head->next; while (head != NULL) { curr->next = copyNode(head); curr = curr->next; head = head->next; } } return headRet;} // end RemainingRoute

node* copyNode(node* p) { node * c = NULL; if (p != NULL) { c = new node; strcpy(c->begin, p->begin); strcpy(c->end, p->end); c->km = p->km; c->next = NULL; } return c; }

Page 24: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

TEMA ESAME-4.2

Il nuovo navigatore satellitare VM.GP necessita della funzione

...BackRoute(...)

che, dato un percorso e la lunghezza percorsa, genera il percorsorimanente. Vediamo nel dettaglio.

Un percorso è descritto da una lista dinamica, dove ogni elemento dellalista descrive un segmento di strada da percorrere, con le coordinate iniziali(stringa di 10 caratteri), le coordinate finali (stringa di 10 caratteri), lalunghezza del segmento di strada (numero in virgola mobile indicante ichilometri).

La funzione ...BackRoute(...) riceve due parametri: uno è l'indirizzo della testa della lista che descrive il percorso calcolato,l’altro è la lunghezza già percorsa (numero in virgola mobile indicante ichilometri) di quel percorso.

La funzione produce un'altra lista, definita sulla stessa struttura dati el'indirizzo della cui testa viene restituito dalla funzione, che contiene solo isegmenti del percorso fino a quel momento attraversati, quindi dal primofino al segmento raggiunto con i chilometri percorsi (secondo parametrodella funzione).

Per esempio, se il percorso calcolato è composto da tre segmenti, il primo di5 Km, il secondo di 10 Km e il terzo di 2 Km, e la lunghezza percorsa è 7Km, la funzione produrrà una lista che descrive un percorso costituito dalprimo e dal secondo segmento.

Definire la struttura dati della lista e implementare in C/C++ la funzionerichiesta.

Page 25: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

// Si assume che nodi consecutivi della lista contengano segmenti// consecutivi lungo il percorso.

struct node { char begin[10+1]; char end[10+1]; double km;

node* next; };

node* copyNode(node* p);

node* BackRoute(node* head, double len) { node *headRet = NULL, *curr = NULL; double count = 0.0;

headRet = copyNode(head); if (headRet != NULL) { curr = headRet; count = headRet->km; head = head->next; while (count <= len && head != NULL) { curr->next = copyNode(head); count += head->km;

curr = curr->next; head = head->next; } } return headRet;} // end BackRoute

node* copyNode(node* p) { node * c = NULL; if (p != NULL) { c = new node; strcpy(c->begin, p->begin); strcpy(c->end, p->end); c->km = p->km; c->next = NULL; } return c;

Page 26: UNIVERSITÀ DI BERGAMO INFORMATICA 12 CFU – Modulo di Programmazione (ING. INFORMATICA · 2020-01-08 · Università degli Studi di Bergamo - Esercitazioni di Informatica Facoltà

Università degli Studi di Bergamo - Esercitazioni di InformaticaFacoltà di Ingegneria (modulo di programmazione - 6 CFU)

a.a. 2019-2020 Codice corso: 21012

}