Sei sulla pagina 1di 4

Universit Politecnica delle Marche, Facolt di Ingegneria

Elementi di Informatica (Prof. C. Morbidoni)


PROVA SCRITTA 16 Febbraio 2016
DURATA: 1 ora e 30 minuti

Avvertenze:

* Consegnare solo fogli formato A4 scritti su un solo lato (no fronte-retro), consegnare anche il presente foglio
* In testa a ciascun foglio (compreso il presente) scrivere: cognome, nome, numero progressivo di pagina rispetto al totale
esempio per il secondo foglio di 3 consegnati: Giuseppe Russo 2/3
* Mantenere sul banco il libretto o altro documento di riconoscimento fino a controllo avvenuto
* Nientaltro deve trovarsi sul banco: non consentito consultare libri, dispense, appunti, ecc. pena lannullamento della prova!
* Non consentito usare il telefonino durante la prova: pena lannullamento della prova stessa!
* La correzione di riferimento per lautovalutazione verr effettuata subito dopo lesame
* Chi si presenter allorale pu, facoltativamente, portare limplementazione al computer della propria soluzione, eventualmente cor-
retta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.

* LEGGERE E CAPIRE BENE IL TESTO DEGLI ESERCIZI PRIMA DI COMINCIARE A SCRIVERE CODICE

Esercizio 1 (14 punti)


Si definisca un nuovo tipo di dato denominato rank che rappresenti una parola e il corrispondente punteggio (un numero intero).
Si consideri che il punteggio di una parola p in relazione ad un documento di testo d pari al numero di volte in cui p appare in d.
Si scriva una funzione C che prenda come parametri:
un array di stringhe, denominato rows con le seguenti caratteristiche
ogni stringa dellarray rappresenta una riga di un documento di testo ed formata da un numero, non conosciuto a priori, di pa-
role separate da uno spazio;
Ogni stringa dellarray termina con la parola FINE_RIGA ;
la lunghezza dellarray rows;
un array R (vuoto) di elementi di tipo rank.
La funzione dovr calcolare il punteggio di ogni parola presente in almeno una delle righe (rows) - ad esclusione della parola
FINE_RIGA - , memorizzare la parola ed il punteggio calcolato in un elemento di tipo rank ed inserirlo nellarray R. Al ter-
mine della funzione R dovr quindi contenere uno e un solo elemento rank per ogni parola.
Nota: si assuma che la lunghezza di una singola parola non superi mai i 50 caratteri.

Esercizio 2 (12 punti)


Facendo riferimento allesercizio precedente, definire una funzione C che, preso come parametro un array di rank e la sua lunghez-
za, ne ordini gli elementi in base al punteggio delle parole, usando lalgoritmo Quick Sort.
Attenzione: Usare un algoritmo di ordinamento diverso da QuickSort comporta una penalit di 4 punti.

Esercizio 3 (4 punti)
Si implementi un metodo main() che agisca da cliente per le due funzioni definite negli esercizi precedenti:
Definisca un array di stringhe row e inizializzi i suoi valori con tre frasi a piacere ;
Calcoli il punteggio di ogni parola invocando la funzione definita allEsercizio 1;
Ordini le parole in base al punteggio (invocando la funzione definita allEsercizio 2);
Stampi a video la lista ordinata delle parole e corrispondenti punteggi.
Esempio: se rows contiene le seguenti 3 stringhe:
"In Pisa it is rainy FINE_RIGA",
"In Milano it will be rainy tomorrow FINE_RIGA",
"In Ancona it will be sunny forever FINE_RIGA"

Il programma dovr stampare:


it:3
In:3
rainy:2
will:2
be:2
Ancona:1
forever:1
sunny:1
tomorrow:1
Pisa:1
is:1
Milano:1
LE REGOLE

Ogni esercizio vale un certo numero di punti in totale. Lo studente dovr togliere da questo totale il numero di punti specificato per
ogni parte del programma errata.
Lo studente potr presentarsi allorale solo se raggiunger il punteggio minimo di 16 punti.
Durante lorale lo studente dovr, su richiesta, saper spiegare chiaramente ogni parte del suo programma per confermare il risul-
tato dellautovalutazione e quindi per superare lesame.
Il colloquio orale (non facoltativo, ma a discrezione del docente) potr riguardare ogni argomento del programma e alzare cos
come abbassare il voto ottenuto allo scritto (anche sotto la sufficienza).

SOLUZIONE DEGLI ESERCIZI

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

Esercizio 1 (Totale 14 Punti)

// Definizione del tipo strutturato


// 1 Punto
typedef struct {
char word[50];
int score;
} rank;

// Dichiarazione della funzione


// 1 Punto
int do_ranks (char* rows[], int len, rank ranks[]) {
int ranks_len = 0;

// Iterazione sulle righe:


// 1 Punto
for (int i = 0; i < len; i++) {
char* row = rows[i];

// Iterazione sulla parole di ogni riga


// 2 Punti
char word[50] = "";
while (sscanf(row,"%s", word) != EOF) { // NOTA: EOF viene mai raggiunto, usarlo solo una sicurezza in pi

row = &row[strlen(word)+1];

// Controllo fine riga


// 1 Punto
if (strcmp(word,FINE_RIGA") == 0) {
break;
}

// Ricerca del rank e aggiornamento se esistente


// 4 PUNTI
int found = 0;
for (int j = 0; j < ranks_len; j++) {
char * w = ranks[j].word;
if (strcmp(word, w) == 0) {
found = 1;
ranks[j].score++;
}
}

// Inserimento nuovo rank se non trovato


// 4 PUNTI
if (!found) {
rank newRank;
strcpy(newRank.word,word);
newRank.score = 1;
ranks[ranks_len] = newRank;
ranks_len++;
}
}
}

return ranks_len;

Esercizio 2 (Totale 12 Punti)

// Procedura scambia sui rank


// 2 Punti
void scambia (rank* a, rank* b) {
rank t = *b;
*b = *a;
*a = t;
}

// Dichiarazione funzione
// 1 Punto
void quickSort(rank ranks[], int iniz, int fine){

// Algoritmo quick sort: corretta impostazione


// 4 Punti
if (iniz<fine) {
int i=iniz,j=fine;
// Corretto utilizzo del tipo rank nel pivot
// 1 Punto
rank pivot = ranks[(iniz+fine)/2];
do {
// corretto utilizzo delloperatore . (o ->)
// 1 Punto
while (ranks[i].score > pivot.score) i++;
while (ranks[j].score < pivot.score) j;
// corretto uso dei puntatori
2 Punti
if (i < j) scambia(&ranks[i], &ranks[j]);
if (i <= j) i++, j--;
} while (i <= j);
// Chiamate ricorsivi
// 1 Punto
if (iniz < j) quickSort(ranks, iniz, j);
if (i < fine) quickSort(ranks, i, fine);
}
}

Esercizio 3 (Totale 4 Punti)

int main(void) {

//Dichiarazione array e inizializzazione valori


// 1 Punto
char * rows[3];
rows[0] = "In Pisa it is rainy FINE_RIGA";
rows[1] = "In Milano it will be rainy tomorrow FINE_RIGA";
rows[2] = "In Ancona it will be sunny forever FINE_RIGA";
// Corretta invocazione funzione di ranking
// 1 Punto
rank ranks[20];
int ranks_len = do_ranks(rows, 3, ranks);

//Corretta invocazione funzione sorting


// 1 Punto
quickSort(ranks, 0 , ranks_len-1);

// Scrittura contenuto array a video


// 1 Punto
for (int i = 0; i < ranks_len; i++ ) {
char* w = ranks[i].word;
int c = ranks[i].score;
printf("%s:%d\n", w, c);

Potrebbero piacerti anche