Sei sulla pagina 1di 69

Universit Politecnica delle Marche, Facolt di Ingegneria,

Corsi di Laurea in Ingegneria Gestionale

Fondamenti di Informatica (Prof. E. Frontoni)


PROVA SCRITTA 08 aprile 2014

Avvertenze:

* Consegnare solo fogli formato A4 scritti su un solo lato (no fronte-retro)


* In testa a ciascun foglio 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.
* 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 corretta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.

1. (16 punti)
Un file contiene una sequenza di date, una per riga, ordinate cronologicamente. Ciascuna data `e
scritta nel formato GG/MM/AAAA. Come esempio si consideri il seguente file

23/6/1999
12/4/2001
16/4/2001
18/12/2003
20/12/2003
4/4/2004

Si scriva una funzione C che prenda come parametri il nome del file ed una data di riferimento e
restituisca la prima data presente nel file che sia posteriore alla data passata come parametro.
Nel caso che tutte le date siano anteriori al parametro, la funzione deve restituire il valore del
parametro stesso.
Ad esempio, nel caso del file precedente e della data di riferimento 23/2/2003, la funzione deve
restituire la data 18/12/2003. Se invece la data di riferimento 4/11/2006, la funzione deve
restituire la data 4/11/2006.

2. (14 punti)
Si definisca la funzione C che elimina da una lista di interi tutti gli elementi doppi (con lo stesso
valore di un altro elemento) rendendo disponibile al sistema la memoria da essi occupata.
1. (16 punti)
#include <stdio.h>
#include <stdlib.h>

struct Data
{
int giorno;
int mese;
int anno;
};

int main(int argc, char *argv[])


{ /* non richiesto per il compito*/
struct Data d1,d2;
if (argc != 3)
{
printf("Numero di parametri sbagliato\n");
exit(1);
}
sscanf(argv[2],"%d/%d/%d",&d1.giorno,&d1.mese,&d1.anno);
d2 = UltimaDataPrecedente(argv[1],d1);
printf("La prima data successiva nel file al %d/%d/%d %d/%d/%d\n",
d1.giorno,d1.mese,d1.anno, d2.giorno,d2.mese,d2.anno);
return 0;
}

struct Data UltimaDataPrecedente(char nome_file[], struct Data soglia)


{
struct Data d;
FILE *fp;
fp = fopen(nome_file,"r");
while (fscanf(fp,"%d%*c%d%*c%d",&d.giorno,&d.mese,&d.anno) != EOF)
if (ComparaDate(d,soglia) == 1)
return d;
return soglia;
}

int ComparaDate(struct Data d1, struct Data d2)


{
if (d1.anno < d2.anno
|| (d1.anno == d2.anno && d1.mese < d2.mese)
|| (d1.anno == d2.anno && d1.mese == d2.mese && d1.giorno < d2.giorno))
return -1;
else if (d1.anno == d2.anno && d1.mese == d2.mese && d1.giorno == d2.giorno)
return 0;
else
return 1;
}
2. (14 punti)

void delete_copies(struct list * head_ptr);

struct list{
int value;
struct list * next_ptr;
};

void delete_copies(struct list * head_ptr) {


struct list * moving_ptr, tmp_ptr;

while (head_ptr != NULL) {


moving_ptr = head_ptr;
while (moving_ptr->next_ptr != NULL) {
if (moving_ptr->next_ptr->value == head_ptr->value) {
tmp_ptr = moving_ptr->next_ptr;
moving_ptr->next_ptr = moving_ptr->next_ptr->next_ptr;
free(tmp_ptr);
}
else moving_ptr = moving_ptr->next_ptr;
}
head_ptr = head_ptr->next_ptr;
}
}
Universit Politecnica delle Marche, Facolt di Ingegneria,

Elementi di Informatica (Prof. C. Morbidoni)


PROVA SCRITTA 24 Giugno 2014

Avvertenze:

* Consegnare solo fogli formato A4 scritti su un solo lato (no fronte-retro)


* In testa a ciascun foglio 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.
* 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 corretta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.

1. (16 punti)
Si consideri il seguente file di testo:

Mario_Pizza 23.56 50.78


Jack_Hot_Dogs 40.5 72.78
Chu_China 45.56 5.4
Grab&Go 80.61 10.9
McDowelson 35.5 70.78
Il_Cinghiale 72.56 15.89
Piadineria_del_Corso 12.2 15.54

Esso contiene per ogni riga, separati da uno spazio, il nome di un ristorante seguito dalle coordinate
X e Y in un sistema cartesiano. Il nome del ristorante non contiene mai spazi.

Si scriva una funzione C che prenda come parametri il nome del file e un punto nel sistema
cartesiano (rappresentato da due valori X e Y entrambe numeri in virgola mobile) e che scriva nello
standard output il nome del ristorante pi vicino al punto specificato (tra quelli contenuti nel file).
Ad esempio se i valori di X e Y sono rispettivamente 40.1 e 72.2, loutput dovr essere:
Jack_Hot_Dogs

2. (14 punti)
Si definisca la funzione C che elimina da una lista di interi tutti gli elementi che sono multipli di un
altro elemento nella lista, rendendo disponibile al sistema la memoria da essi occupata.
1. (16 punti)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Ristorante
{
char nome[30];
float x;
float y;
};

float distanza(struct Ristorante r, float x, float y)


{
float d = (x - r.x) * (x - r.x) + (y - r.y) * (y - r.y);
return d;
}

void ristoranteVicino(char* nome_file, float x, float y) {


printf("Opening file: %s\n",nome_file);
FILE *fp;
if ((fp = fopen(nome_file,"r")) == NULL) {
printf("File error\n");
return;
};

struct Ristorante r;
char nome_rist[30];
float min_dist = 0;
while (fscanf(fp,"%s %f %f",r.nome,&r.x,&r.y) != EOF) {
printf("%s %f:%f\n",r.nome,r.x,r.y);
float d = distanza(r, x, y);
printf("Distanza: %f\n",d);
if (min_dist == 0 || d < min_dist) {
printf("Nuova didtanza minima: %f\n",d);
min_dist = d;
strcpy(nome_rist,r.nome);
}
}
printf("Il ristorante pi vicino : %s\n", nome_rist);
}

int main(int argc, char *argv[]){


/* non richiesto per il compito*/
if (argc != 3) {
printf("Numero di parametri sbagliato\n");
exit(1);
}
float x;
float y;
sscanf(argv[2], "%f:%f",&x, &y);

ristoranteVicino(argv[1], x, y);

return 0;
}
2. (14 punti)

void cancella_multipli (struct list * head_ptr);

struct list{
int value;
struct list * next_ptr;
};

void cancella_multipli(struct list * head_ptr) {


struct list * moving_ptr, tmp_ptr;

while (head_ptr != NULL) {


moving_ptr = head_ptr;
while (moving_ptr->next_ptr != NULL) {
if ( (moving_ptr->next_ptr->value % head_ptr->value) == 0) {
tmp_ptr = moving_ptr->next_ptr;
moving_ptr->next_ptr = moving_ptr->next_ptr->next_ptr;
free(tmp_ptr);
}
else moving_ptr = moving_ptr->next_ptr;
}
head_ptr = head_ptr->next_ptr;
}
}
Universit Politecnica delle Marche, Facolt di Ingegneria,
!
Elementi di Informatica (Prof. C. Morbidoni)

!! !
PROVA SCRITTA 24 Luglio 2014

!
Avvertenze:

* Consegnare solo fogli formato A4 scritti su un solo lato (no fronte-retro)


* In testa a ciascun foglio 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.
* 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 corretta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.
!
1. (23 punti)

Si consideri il seguente file di testo contenente alcuni nomi di citt e il relativo numero di abitanti :
!
Ancona:101258
Torino:900873
Pisa:88627
Genova:596958
Palermo:678412
Pescara:121342
!
Si scriva una procedura in linguaggio C che legga le informazioni dal file e che scriva sullo
standard output i numeri di abitanti in ordine crescente. Utilizzare lalgoritmo QuickSort per
lordinamento. Si assuma inoltre che il file non contenga pi di 30 righe e che i nomi delle citt non
siano pi lunghi di 30 caratteri.
Nel caso del file di esempio loutput dovr quindi essere:
!
88627
101258
121342
596958
678412
900873
!
2. (7 punti)

Si definisca in C una struttura dati per rappresentare un albero binario di numeri in virgola mobile.
!
!
!
1. (23 punti)

#include <stdio.h>

!
#include <stdlib.h>

//5 punti
void scambia(int* a, int* b) {
int c = *a;
*a = *b;
*b = c;

!
}

//10 punti
void quickSort(int v[],int iniz,int fine){
if (iniz<fine) {
int i=iniz,j=fine,pivot=v[(iniz+fine)/2];
do {
while (v[i] < pivot) i++;
while (v[j] > pivot) j--;
if (i < j) scambia(&v[i], &v[j]);
if (i <= j) i++, j--;
} while (i <= j);
if (iniz < j) quickSort(v, iniz, j);
if (i < fine) quickSort(v, i, fine);
}

!
}

int main() {
//2 punti
FILE *fp;
if ((fp = fopen("citta.txt","r")) == NULL) {
printf("File error\n");
return 1;
};
//2 punti
int ab[30];
char buff[30];
//2 punti
int i = 0;
while (fscanf(fp,"%s %d",buff,&ab[i]) != EOF) {
i++;
}
quickSort(ab,0,i);
//2 punti
for (int k=0;k<i;k++) {
printf("%d\n",ab[k]);
}
return 0;

}
!
2. (7 punti)

!!
struct tree {
float dato;
struct tree *sx;
struct tree *dx;
};
Universit Politecnica delle Marche, Facolt di Ingegneria,
!
Elementi di Informatica (Prof. C. Morbidoni)

!!
PROVA SCRITTA 1 Ottobre 2014
!
!
Avvertenze:

* Consegnare solo fogli formato A4 scritti su un solo lato (no fronte-retro)


* In testa a ciascun foglio 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.
* 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 corretta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.
!
1. (15 punti)

Scrivere una procedura RICORSIVA in C che, data una stringa di lunghezza massima di 30
caratteri, scriva a video tutte le stringhe ottenute eliminando di volta in volta il primo carattere fino
ad ottenere una stringa di un solo carattere.
Ad esempio data la stringa BOCCIATO, loutput della funzione dovr essere:
!
BOCCIATO
OCCIATO
CCIATO
CIATO
IATO
ATO
TO
O
!
2. (15 punti)

Scrivere un programma C che chieda ripetutamente allutente di digitare una parola da tastiera,
finche lutente non digiti due parole consecutive uguali (solo in questo caso il programma termina).
!
!
!
!
!
!
!
!
!
!
SOLUZIONE
!
1. (15 punti)

!
void eco(char str[], int l, int i){

!
if(i < l){

for (int k = i; k < l; k++) {


printf("%c",str[k]);

}

printf("\n");

i++;

eco(str,l, i);

}

!
2. (15 punti)

!
#include <stdio.h>

void copy_string(char s1[], char s2[]) {


int i;


for(i=0; s1[i]!='\0'; ++i)


{


s2[i]=s1[i];


}


s2[i]='\0';

}

int compare_string(char s1[], char s2[]) {


int i;


for(i=0; s1[i]!='\0'; ++i) {


if (s2[i]!=s1[i]) {



return 1;


};


}


return 0;

}

int main() {


char parola1[30];


char parola2[30];


printf ("Digita una parola: ");


scanf("%s",parola1);


printf ("Digita una parola: ");


scanf("%s",parola2);


while (strcmp(parola1,parola2)!=0) {



copy_string(parola2, parola1);



printf ("Digita una parola: ");



scanf("%s",parola2);


}


return 0;

}

!
Oppure

!
#include <stdio.h>

#include <string.h>

int main() {


char parola1[30];


char parola2[30];


printf ("Digita una parola: ");


scanf("%s",parola1);


printf ("Digita una parola: ");


scanf("%s",parola2);


while (strcmp(parola1,parola2)!=0) {



strcpy(parola1, parola2);



printf ("Digita una parola: ");



scanf("%s",parola2);


}


return 0;

}

Universit Politecnica delle Marche, Facolt di Ingegneria,

Elementi di Informatica (Prof. C. Morbidoni)


PROVA SCRITTA 15 Dicembre 2014
DURATA: 1 ora e 30 minuti

Avvertenze:

* Consegnare solo fogli formato A4 scritti su un solo lato (no fronte-retro)


* In testa a ciascun foglio 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.
* 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 corretta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.

* ATTENZIONE:
* Non consentito consultarsi ne parlare con i compagni, pena lannullamento della prova.
* LEGGERE E CAPIRE BENE IL TESTO DEGLI ESERCIZI PRIMA DI COMINCIARE SCRIVERE CODICE

1. Separatore di liste (15 punti)


Scrivere una procedura C che data una lista L-Int di interi, separi gli elementi pari da quelli dispari
e li inserisca in testa a due nuove liste L-Pari e L-Dispari, passate alla procedura come parametri.
Attenzione: E necessario il passaggio per riferimento delle liste L-Pari e L-Dispari.
Attenzione: Implementare le liste utilizzando la rappresentazione tramite puntatori e strutture.
Esempio:
Se L-Int la seguente: 1 --> 2 --> 5 --> 8 --> NULL
La procedura produrr le due liste: L-Pari = 2 --> 8 --> NULL ; L-Dispari = 1 --> 5 --> NULL

2. Autocomplete (15 punti)


Scrivere un programma in linguaggio C che legga da standard input una stringa di caratteri Q lunga
al massimo 30 caratteri che non contiene spazi.
Dopo aver definito un array di stringhe S contenente le seguenti stringhe:
Pippo","Pluto","Paperino","Topolino","Paperone"
il programma scriva a video tutte le stringhe dellarray S i cui caratteri iniziali coincidono esatta-
mente con quelli della stringa Q. Il programma dovr inoltre scrivere a video No match found se
una tale stringa non esiste nellarray S.

Esempio I/0:
Input: Q = Pip >> Output: Pippo
Input: Q = Pa >> Output: Paperino Paperone
Input: Q = Tal >> Output: No match found

Attenzione: non consentito usare la funzione di libreria strcmp per confrontare le stringhe.
Attenzione: implementare il programma utilizzando la notazione array ( [] ) per accedere ai singoli
caratteri.
SOLUZIONE

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

//Dichiarazione della struttura per l'elemento della lista


//ERRORE: - 4 punti
typedef struct lista {
int val;
struct lista * next;
} nodo;

//Inserimento di un elemento nella lista


//Meglio fare una funzione (NON OBBLIGATORIO)
nodo* inserisci(nodo* p, int num) {
//Inserimento in testa
//ERRORE: -5 punti
nodo* pnew = (nodo*) malloc(sizeof(nodo));
pnew->next = p;
pnew->val = num;

return pnew;
}

// Dichiarazione corretta dei parametri della funzione


// ERRORE: - 4 punti
// Dichiarazione corretta del tipo di ritorno della procedura
// ERRORE: - 3 punti
// Uso del doppio puntatore per modificare i puntatori iniziali
// ERRORE: - 3 punti
void separa_lista(nodo* p, nodo** ppari, nodo** pdispari) {
// Iterare sugli elementi della lista "P"
// Errore: -4 punti
while (p != NULL) {
//Controllo numero pari/dispari
//ERRORE: -3 punti
if (p->val % 2 == 0) {
*ppari = inserisci(*ppari, p->val);
} else {
*pdispari = inserisci(*pdispari, p->val);
}
//Incremento del puntatore
//ERRORE: -3 punti
p = p->next;

// NON RICHIESTO PER L'ESAME


void scriviLista(nodo* p) {
while (p!=NULL) {
printf("%d\n",p->val);
p = p->next;
}
}

//NON RICHIESTA PER L'ESAME


int main() {
nodo* p = NULL;
p = inserisci(p,4);
p = inserisci(p,2);
p = inserisci(p,9);
p = inserisci(p,6);
nodo* ppari = NULL;
nodo* pdispari = NULL;
separa_lista(p, &ppari, &pdispari);
printf("PARI:\n");
scriviLista(ppari);
printf("DISPARI:\n");
scriviLista(pdispari);
}

2. (15 punti)

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

//Metodo main
//ERRORE: -2 punti
int main() {

//Definizione dell'array "S"


//ERRORE: -3 punti
char* s[5] = {"Pippo","Pluto","Paperino","Topolino","Paperone"};
//Dichiarzione della stringa "Q"
//ERRORE: -3 punti
char q[30];
do {
//Leggere una stringa da tastiera
//ERRORE: -3 punti
scanf("%s",q);

//Il programma chiede ripetutamente l'inserimento di una stringa da tastiera.


//Non richiesto per l'esame!
if (strcmp("quit",q) != 0) {

int matched = 0;

//Iterare sugli elementi dell'array si stringhe "S"


//ERRORE: -4 punti
for (int i = 0; i < 5; i++) {
int j = 0;
int match = 1;
//Iterare su tutti i caratteri della stringa "Q"
//ERRORE: -4 punti
while (q[j]!='\0') {
//Controllare l'uguaglianza dei singoli caratteri in "S[i]" e "Q"
//ERRORE: -3 punti
if (s[i][j] != q[j]) {
match = 0;
//Interrompere l'iterazione se i caratteri non coincidono!
//Non c' bisogno di controllare tutta la stringa "Q"
//ERRORE: -2 punti
break;
}
//Incrementare l'indice per scorrere i caratteri dell'array "Q"
//Errore: - 2 punti
j++;
}
//Scrivere a video la stringa "S[i]" solo se trovata!
//ERRORE: -3 punti
if (match==1) {
//Utilizzo della funzione di libreria per scrivere a video
//ERRORE: -3 punti
printf("Match: %s\n",s[i]);
matched = 1;
}

}
// Scrivere a video No atch found solo se non esiste alcuna stringa "S[i]"
// ERRORE: -3 punti
if (matched == 0) {
//Utilizzo della funzione di libreria per scrivere a video
//ERRORE: -3 punti
printf("No matches found.\n");
}

//NON RISCHIESTO
} while (strcmp("quit",q) !=0);

//Ritornare l'intero 0
//ERRORE: -1 punto
return 0;
}
Universit Politecnica delle Marche, Facolt di Ingegneria, Corsi di Laurea in Ingegneria:
Elettronica, Biomedica

Elementi di Informatica (Docente C. Morbidoni)


PROVA SCRITTA 4 Febbraio 2014

Avvertenze:

* Consegnare solo fogli formato A4 e scrivere su un solo lato (no fronte-retro)


* In testa a ciascun foglio 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.
* La consegna delle fotocopie dei compiti avverr al termine della correzione
* La prova orale si terr subito dopo il termine degli scritti nella stessa aula

1. Scrivere il codic C necessario per:

o (5 punti)
a) Definire un tipo di dato o una struttura che rappresenti un prodotto, con le seguenti
caratteristiche:
o ID, un intero come codice identificativo del prodotto (esempio 12, 34, etc.)
o Marca. Il nome dellazienda che produce il prodotto. Esempi di valori: Indesit,
Merloni.
o Tipologia. Indica il tipo di prodotto, esempi di valori: Coltello, Lavatrice, Forno.
o Prezzo. Il prezzo in euro. Esempio valori: 24.99 , 130.50

b) Definire il tipo lista di prodotti (utilizzando le liste collegate mediante puntatore).

o (10 punti) Implementare una funzione INSERISCI che data una lista di prodotti ed un
prodotto, inserisca questo ultimo nella lista in modo che essa risulti ordinata in ordine
crescente di prezzo dei prodotti.
(Nota: La funzione assume che la lista in ingresso sia gi ordinata e si limita ad inserire il
nuovo elemento nella posizione giusta)

o (12 punti) Implementare una funzione SCRIVI_ORDINE che prenda come parametri una
lista di prodotti ordinati per prezzo crescente e un float indicante il budget in euro. La
funzione deve scrivere a video le caratteristiche del maggior numero possible di prodotti
acquistabili con il budget dato (i cui prezzi sommati siano quindi minori o uguali al budget).
Loutput deve essere della forma:
o Marca: Iguzzini, Tipologia: Tazza, Prezzo: 9.90;
Marca: Gibson, Tipologia: Corde per chitarra, Prezzo: 13.50;

o (3 punti) Implementare il metodo main che:


o Inizializzi 4 variabili di tipo prodotto, assegnando is valori alle relative
caratteristiche (a piacere dellesaminando)
o Inserisca i 4 elementi in una lista usando la funzione INSERISCI
o Usi la funzione SCRIVI_ORDINE per scrivere a video i prodotti acquistabili con un
certo budget.
SOLUZIONE
#include <stdio.h>
#include <stdlib.h>

typedef struct {
int id;
float prezzo;
char* marca;
char* tipologia;
} prodotto;

typedef struct lista_prod_tag {


prodotto prod;
struct lista_prod_tag *next;
} lista_prodotti;

void scriviOrdine (lista_prodotti* lp, float budjet) {


float danaro = budjet;
int i = 0;
while ( lp != NULL && danaro > 0) {
if (lp->prod.prezzo <= danaro) {
danaro -= lp->prod.prezzo;
printf("\nPrezzo %f\n Marca %s\n Tipologia %s\n",lp->prod.prezzo,lp-
>prod.marca,lp->prod.tipologia);
}
i++;
lp = lp->next;
}

void scrivi (lista_prodotti* lp) {


while ( lp != NULL ) {
printf("\nPrezzo %f\n Marca %s\n Tipologia %s\n",lp->prod.prezzo,lp->prod.marca,lp-
>prod.tipologia);
lp = lp->next;
}
}

void inserisci_ordinato (lista_prodotti** lpp, prodotto prod) {


while (*lpp != NULL && (*lpp)->prod.prezzo < prod.prezzo) {
lpp=&((*lpp)->next);
}
lista_prodotti* tmp_lp;
tmp_lp=*lpp; //salvo resto della lista
*lpp=(lista_prodotti *)malloc(sizeof(lista_prodotti));
(*lpp)->prod=prod;
(*lpp)->next=tmp_lp;
}
int main() {

prodotto p1;
p1.id = 1;
p1.prezzo = 133;
p1.marca = "indesit";
p1.tipologia = "forno";

prodotto p2;
p2.id = 2;
p2.prezzo = 29.34;
p2.marca = "indesit";
p2.tipologia = "padella";

prodotto p3;
p3.id = 3;
p3.prezzo = 1033;
p3.marca = "gibson";
p3.tipologia = "chitarra";

prodotto p4;
p4.id = 4;
p4.prezzo = 2.45;
p4.marca = "indesit";
p4.tipologia = "tappo";

prodotto p5;
p5.id = 5;
p5.prezzo = 56.99;
p5.marca = "gibson";
p5.tipologia = "Cavo";

lista_prodotti l = {p1,NULL};
lista_prodotti* lp = &l;
inserisci_ordinato(&lp,p2);
inserisci_ordinato(&lp,p3);
inserisci_ordinato(&lp,p4);
inserisci_ordinato(&lp,p5);

//scrivi(lp);
scriviOrdine(lp, 3000);

}
Universit Politecnica delle Marche, Facolt di Ingegneria,

Elementi di Informatica (Prof. C. Morbidoni)


PROVA SCRITTA 5 Febbraio 2015
DURATA: 1 ora e 15 minuti

Avvertenze:

* Consegnare solo fogli formato A4 scritti su un solo lato (no fronte-retro)


* In testa a ciascun foglio 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.
* 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 corretta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.

* ATTENZIONE:
* Non consentito consultarsi ne parlare con i compagni, pena lannullamento della prova.
* LEGGERE E CAPIRE BENE IL TESTO DEGLI ESERCIZI PRIMA DI COMINCIARE SCRIVERE CODICE

Esercizio 1 (15 punti)


Scrivere un programma in linguaggio C che legga una serie di numeri interi positivi inseriti dallu-
tente (attraverso standard input) e li inserisca in una lista ordinata, stampandola poi a video. Il pro-
gramma crei poi un array contenente i soli numeri pari presenti nella lista e ne stampi il contenuto a
video.

Nota: rappresentare la lista tramite puntatori e strutture.


Nota: lutente dovr anche specificare il numero di valori che andr ad inserire nulla lista.

Esercizio 2 (12 punti)


Un file rappresenta una serie di rettangoli in un sistema cartesiano. Tutti i rettangoli hanno un verti-
ce nellorigine e vengono rappresentati con le coordinate del vertice opposto. I valori sono numeri
reali e sono separati da uno spazio, come nel seguente file:

23.56 50.78
40.5 72.78
45.56 -5.4
80.61 -10.9
35.5 70.78
72.56 15.89
-12.2 -15.54

Scrivere una funzione ordina_rettangoli che, dato il nome del file, ritorni un array contenente le
aree di tutti i rettangoli, ordinati in modo crescente. La scelta dellalgoritmo di ordinamento la-
sciata allo studente.
Nota: si assuma che il file non possa contenere pi di 100 righe.
Nota: se necessario possibile usare la funzione abs(double), contenuta nella libreria math.c, per
ottenere il valore assoluto di un numero.
SOLUZIONE

Esercizio 1

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

typedef struct nodo {


int info;
struct nodo *next;
} list;

//4 punti
void inserisci_ordinato(list **lpp, int value) {
list *tmp_lp;
while (*lpp!=NULL && (*lpp)->info < value)
lpp=&((*lpp)->next);
tmp_lp=*lpp;
*lpp=(list *)malloc(sizeof(list));
(*lpp)->info=value;
(*lpp)->next=tmp_lp;
}

//4 punti
int leggi_lista(list ** primo) {
int i, n;
printf("Numero di elementi: ");
scanf("%d", &n);

printf("inserisci %d numeri interi positivi: ", n);


for (i=0; i<n; i++) {
int n;
scanf("%d", &n);
inserisci_ordinato(primo,n);
}
return(n);
}

//2 punti
void stampa_lista(list *p) {
while (p != NULL) {
printf("%d ", p->info);
p = p->next;
}
printf("\n");
return;
}

//2 punti
void stampa_array(int arr[], int len) {
for (int i=0; i<len; i++) {
printf("%d ",arr[i]);
}
printf("\n");
}
//3 punti
int main(void) {
list *p;
p = NULL;
int plen = leggi_lista(&p);
stampa_lista(p);
int result[plen], i =0;
while (p != NULL) {
if (p->info%2==0) {
result[i] = p->info;
i++;
}
p = p->next;
}
stampa_array(result,i);
return(0);
}

Esercizio 2

void scambia(int* a, int* b) {


int t = *a;
*a = *b;
*b = t;
}

//Ordinamento: 6 punti
void bubble_sort(int v[], int n){
int i; boolean ordinato = false;
while (n>1 && !ordinato){
ordinato = true;
for (i=0; i<n-1; i++)
if (v[i]>v[i+1]) {
scambia(&v[i],&v[i+1]);
ordinato = false;
}
n--;
}
}

//1 punto
void stampa_array(int arr[], int len) {
for (int i=0; i<len; i++) {
printf("%d ",arr[i]);
}
printf("\n");

//5 punti
void ordina_rettangoli(char* nome_file) {
FILE *fp;
if ((fp = fopen(nome_file,"r")) == NULL) {
printf("File error\n");
return;
};
float aree[100];
int i = 0;
while (fscanf(fp,"%f %f, &r.x,&r.y) != EOF) {
float area = abs(x*y);
aree[i] = area;
i++;
}
bubble_sort(aree, i);
stampa_array(aree, i)
return;
}
Universit Politecnica delle Marche, Facolt di Ingegneria,

Elementi di Informatica (Prof. C. Morbidoni)


PROVA SCRITTA 1 Marzo 2015
DURATA: 1 ora

Avvertenze:

* Consegnare solo fogli formato A4 scritti su un solo lato (no fronte-retro)


* In testa a ciascun foglio 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.
* 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 corretta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.

* ATTENZIONE:
* Non consentito consultarsi ne parlare con i compagni, pena lannullamento della prova.
* LEGGERE E CAPIRE BENE IL TESTO DEGLI ESERCIZI PRIMA DI COMINCIARE A SCRIVERE CODICE

Esercizio 1 (12 punti)


Si scriva una funzione C che prende in ingresso un array di numeri interi e restituisce una stringa in
cui il carattere i-esimo corrisponde, nella tabella di codifica ASCII, al numero intero contenuto nel-
lelemento i-esimo dell array in ingresso.
Esempio: se larray in ingresso {78, 101, 114, 100}, la stringa restituita sar Nerd.

Esercizio 2 (14 punti)


Si scriva una funzione C che prenda come parametri un intero ed un puntatore a puntatore ad una
lista bidirezionale e che appenda - ovvero inserisca in coda - il numero intero alla lista (usare la
rappresentazione collegata mediante puntatore).

Esercizio 3 (4 punti)
Si esprimano le seguenti dichiarazioni di variabili e funzioni in linguaggio C:
a un array di 20 puntatori a stringhe.
b un puntatore a un array di 10 puntatori a char.
f una funzione che ha come parametro un array di numeri reali e che ritorna un puntatore ad un
file.
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 risultato dellautovalutazione.
Il colloquio orale (non facoltativo!) potr riguardare ogni argomento del programma e alzare cos
come abbassare il voto ottenuto allo scritto (anche sotto la sufficienza).

SOLUZIONE DEGLI ESERCIZI

Esercizio 1 (12 punti)


//Dichiaro la funzione con due parametri: larray e la sua lunghezza - 2 punti
char * codifica(int arr[], int len) {
//Dichiaro la variabile stringa come puntatore o come array di char - 1 punti
char * str; int i;
//Ciclo sul vettore da O a len - 1 - 2 punti
for (i = 0; i < len; i++) {
// assegno il valore ai singoli elementi dellarray.
// La conversione da intero a carattere avviene automaticamente! - 4 punti
str[i] = arr[i];
}
// Inserisco il terminatore di stringa - 2 punti
str[i] = '\0';
//Ritorno la stringa - 1 punti
return str;
}

Esercizio 2 (14 punti)

//Dichiaro la struttura o il tipo per gli elementi della lista


//Usando due puntatori (al successivo e al precedente) - 1 punto
typedef struct l_tag {
int value;
struct l_tag *prev;
struct l_tag *next;} list;

//Dichiaro la funzione usando il doppio puntatore e lintero per la lunghezza - 2 punti


void append(list **lpp, int value) {
//Dichiaro il puntatore temporaneo - 1 punto
list *tmp_prev=NULL;
//Ciclo sulla lista - 1 punto
while (*lpp!=NULL) {
//salvo parte anteriore della lista usando il puntatore temporaneo - 1 punti
tmp_prev=*lpp;
//riposizionamento allelemento successivo della lista - 1 punti
lpp=&((*lpp)->next);
}

//Inizializzaione del puntatore usando malloc e il casting - 2 punti


*lpp=(list *)malloc(sizeof(list));
//Assegnazione del valore intero e del puntatore a NULL - 1 punto
(*lpp)->value=value;
//Collego il nuovo elemento al successivo: NULL, poich lultimo elemento della lista - 2 punti
(*lpp)->next=NULL;
//Collego il nuovo elemento al precedente, precedentemente salvato nel puntatore temporaneo - 2 punti
(*lpp)->prev=tmp_prev;
// -1
return;
}

Esercizio 3 (4 punti)

// 1 punto
char ** a[20];
// 1 punto
char * (*b)[10];
// 2 punti
FILE * f(float vett[],
);
Universit Politecnica delle Marche, Facolt di Ingegneria,

Elementi di Informatica (Prof. C. Morbidoni)


PROVA SCRITTA 20 Marzo 2015
DURATA: 1 ora

Avvertenze:

* Consegnare solo fogli formato A4 scritti su un solo lato (no fronte-retro)


* In testa a ciascun foglio 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.
* 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 corretta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.

* ATTENZIONE:
* Non consentito consultarsi ne parlare con i compagni, pena lannullamento della prova.
* LEGGERE E CAPIRE BENE IL TESTO DEGLI ESERCIZI PRIMA DI COMINCIARE A SCRIVERE CODICE

Esercizio 1 (12 punti)


Si scriva una funzione C che prende in ingresso il nome di un file e copi tutte le righe che iniziano
per un numero minore di 30 in un secondo file, ritornando il puntatore al file creato.

Si consideri che il file in ingresso ha il seguente formato:

22 Giulio Paldo
34 Marco Valdo
52 Batrice Pollenzi
18 Pablo Pincio
.

Esercizio 2 (14 punti)


Si scriva una funzione C che prenda in ingresso il puntatore alla radice di un albero binario di ri-
cerca ed un numero intero, ed inserisca il numero intero nella giusta posizione dellalbero.
Universit Politecnica delle Marche, Facolt di Ingegneria,

Elementi di Informatica (Prof. C. Morbidoni)


PROVA SCRITTA 8 Maggio 2015
DURATA: 1 ora e 15 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. o usare il telefonino
pena lannullamento immediato della prova!
* La correzione di riferimento per lautovalutazione verr effettuata subito dopo lesame
* Chi si presenta allorale pu, facoltativamente, portare limplementazione al computer della propria soluzione, even-
tualmente corretta, corredata di tutto quanto necessario alla verifica del corretto funzionamento.

Esercizio 1 (13 punti)


Si definisca una procedura C che prenda come parametri una matrice M di interi di 3 colonne, il
numero R di righe della matrice e il nome di un file di testo F. La procedura dovr modificare il val-
ore intero memorizzato in ogni cella di M sommando ad esso lindice di colonna della cella. La
procedura dovr poi scrivere nel file corrispondente a F la matrice trasposta di quella ottenuta modi-
ficando i valori della matrice iniziale M (nel formato illustrato nel seguente esempio).
Esempio: per una ipotetica matrice M di ordine 2x3 in ingresso:
1 2 3
4 5 6
la procedura dovr scrivere nel file:
riga 0, colonna 0 = 1
riga 0, colonna 1 = 4
riga 1, colonna 0 = 3
riga 1, colonna 1 = 6
riga 2, colonna 0 = 5
riga 2, colonna 1 = 8
Nota: una matrice trasposta si ottiene scambiando le righe con le colonne della matrice originale

Esercizio 2 (11 punti)


Si definiscano due funzioni C, una iterativa ed una ricorsiva, che, preso in ingresso il puntatore al
primo elemento di una lista di interi di lunghezza arbitraria (in rappresentazione collegata mediante
puntatori), calcolino la somma di tutti gli interi contenuti nella lista e restituiscano tale somma.

Esercizio 3 (6 punti)
Si esprimano le seguenti dichiarazioni di variabili e funzioni (prototipi) in linguaggio C:
A e un array di 30 puntatori a puntatori a interi
B un record (struttura) composto da due puntatori a carattere
C e un array di 30 record (strutture) composti da un intero e 2 array di 25 caratteri
D una funzione che ritorna un puntatore a float ed ha come parametri un intero e un puntatore a
puntatore a float
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 18 punti.
Durante lorale lo studente dovr, su richiesta, saper spiegare chiaramente ogni parte del suo
programma per confermare il risultato 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 sufficien-
za).

Soluzione Esercizio 1

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

//Dichiarazione procedura e parametri 2 punti


void modifica_matrice(int M[][3], int R, char * F) {
int i,j;
//Apertura file in scrittura 2 punti
FILE * file;
if ((file = fopen(F,"w")) == NULL) {
printf("Errore di lettura file");
exit(1);
}
//Modifica valori della matrice 4 punti
for (i=0; i<R; i++)
for (j=0; j<3; j++)
M[i][j] += j;
//Stampa matrice trasposta 5 punti
//Alternativa 1
for (j=0; j<3; j++)
for (i=0; i<R; i++)
fprintf(file, riga %d , colonna %d = %d\n", j, i, M[i][j]);
//Alternativa 2
int T[3][R];
for (i=0; i<3; i++)
for (j=0; j<R; j++)
T[i][j] = M[j][i];
fprintf(file, riga %d , colonna %d = %d\n", i, j, T[i][j]);

fclose(file);
return;
}

Soluzione Esercizio 2

//Dichiarazione struttura 1 punti


typedef struct list_tag {int value; struct list_tag *next;} list;
//Funzione iterativa 5 punti
int sommaI(list *lp) {
int somma=0;
while (lp!=NULL) {
somma += lp->value;
lp=lp->next;
}
return somma;
}
//Funzione ricorsiva 5 punti
int sommaR(list *lp) {
if(lp==NULL) return 0;
else return lp->value + sommaR(lp->next);
}

Soluzione Esercizio 3

int ** A [30]; \\ 1 punto


struct {char * a, char * b} B \\ 1 punto
struct { int a; char b[25]; char c[25]; } C [30]; \\ 2 punti
float * D(int, float **); \\ 2 punti
Universit Politecnica delle Marche, Facolt di Ingegneria

Elementi di Informatica (Prof. C. Morbidoni)


PROVA SCRITTA 8 Luglio 2015
DURATA: 1 ora e 15 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, even-
tualmente corretta, 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 (12 punti)


Si scriva una funzione C che prenda come parametri un vettore di interi V1, la rispettiva lunghezza
L2, un vettore di interi V2 e la rispettiva lunghezza L2. La funzione ritorni il valore 1 se e solo se
tutti i valori contenuti in V1 sono contenuti almeno una volta in V2, e ritorni il valore 0 in caso con-
trario.

Esercizio 2 (15 punti)


Si dichiari una struttura (denominata tertree) dati in grado di rappresentare un albero ternario di
interi, in cui ogni nodo ha tre nodi figli denominati rispettivamente left, center e right, utiliz-
zando record (strutture) e puntatori.
Si scriva poi una procedura che prenda come parametri: P, un puntatore a puntatore ad una struttura
tertree e V, un array di numeri interi positivi terminati dal valore -1. La procedura dovr creare un
albero ternario avente come nodo radice la struttura puntata da *P e contenente tutti gli interi del
vettore V in modo che per ogni nodo dellalbero: il nodo figlio left contenga sempre un numero
minore della met del numero contenuto nel nodo padre, il nodo figlio right contenga sempre un
numero maggioro del doppio del numero contenuto nel nodo padre, il nodo figlio center contenga
sempre un numero compreso tra la met ed il doppio nel numero contenuto nel nodo padre.
Nota: il valore terminatore -1 non va incluso nellalbero.

Esercizio 3 (3 punti)
Si scrivano le seguenti dichiarazioni in linguaggio C:
A un record contenente una stringa di 20 caratteri ed un puntatore a puntatore ad un carattere
B una funzione che ritorna un puntatore a intero e prende come parametro un array di stringhe e la
sua lunghezza
C una procedura che prende come parametro un numero decimale, un array di interi e la sua lun-
ghezza
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 risultato 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 sufficien-
za).

SOLUZIONE DEGLI ESERCIZI

Esercizio 1 - 12 punti

Versione 1:

//Dichiarazione dela funzione - 2 punti


int contenuto (int V1[], int L1, int V2[], int L2) {
//Iterazione sul primo array - 2 punti
for (int i =0; i<L1; i++) {
int found = 0;
//Iterazione sul secondo array - 2 punti
for (int j=0; j<L2; j++) {
//Controllo della presenza del numero - 2 punti
if (V1[i] == V2[j]) {
found = 1;
//interruzione del ciclo se il numero viene trovato - 2 punti
break;
}
}
//Interruzione della funzione se un valore non stato trovato - 2 punti
if (!found) return 0;
}
return 1;
}
Esercizio 2 - 15 punti

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

//Dichiarazione della struttura dati (o tipo) - 3 punti


typedef struct elem {
int value;
struct elem * left;
struct elem * center;
struct elem * right;
} tertree;

//Dichiarazione corretta della procedura e dei parametri - 2 punti


void crea_albero(int V[], tertree **tipp) {

//Iterazione sullarray V - 3 punti


int i = 0;
while (V[i] != -1) {
inserisci(tipp, V[i]);
i++;
}

void inserisci(tree_item** tipp, int N) {

//Posizionamento nellalbero ternario - 3 punti


while (*tipp != NULL) {
if ((*tipp)->value > N*2) {
tipp = &((*tipp)->right);
} else if ((*tipp)->value > N/2 && (*tipp)->value < N*2) {
tipp = &((*tipp)->center);
} else if ((*tipp)->value < N/2){
tipp = &((*tipp)->left);
}
}

//Creazione del nuovo elemento e inserimento del valore - 2 punti


*tipp = (tree_item *) malloc(sizeof(tertree));
(*tipp) -> value = N;

//Corretta assegnazione dei puntatori agli elementi successivi (NULL) - 2 punti


(*tipp) -> left = NULL;
(*tipp) -> right = NULL;
(*tipp) -> center = NULL;

Esercizio 3 - 3 punti
struct A { char s[20]; char** c;} // 1 punto
int* B(char* ss[], int len); //1 punti
void C (float f, int v[], int len); //1 punto
Universit Politecnica delle Marche, Facolt di Ingegneria
Elementi di Informatica (Prof. C. Morbidoni)
PROVA SCRITTA 14 Gennaio 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 (12 punti)


Si consideri un file di testo dati.txt in cui ogni riga contiene:
- una stringa senza spazi (rappresentante una pagina di Wikipedia);
- un il numero di accessi alla pagina;
- la data in cui gli accessi sono avvenuti.
I tre campi sono separati da un numero arbitrario di spazi.
Si assuma che:
- righe contenti la medesima pagina abbiano contengano sempre date diverse tra loro;
- il file non contenga mai pi di 1000 righe;
- il nome delle pagine non sia mai pi lungo di 100 caratteri.

Esempio:
dati.txt
Canone_televisivo_in_Italia 2050 12/01/2016
Iraq 1300 12/01/2016
Stato_Islamico 4040 12/01/2016
Canone_televisivo_in_Italia 300 13/01/2016
Guerra_civile_siriana 1500 13/01/2016
Arabia_Saudita 560 13/01/2016
Canone_televisivo_in_Italia 2350 14/01/2016
Guerra_civile_siriana 1500 14/01/2016

Si scriva un programma in C che:


- Dichiari un nuovo tipo di dati (struttura) per rappresentare una pagina di Wikipedia e la rispettivo numero di accessi.
- Legga il file dati.txt e generi un array di strutture (precedentemente definite) contenenti tutte le diverse pagine assieme al
corrispondente totale di accessi (calcolato su tutti le date presenti nel file).

Esercizio 2 (12 punti)


Scrivere una funzione C ricorsiva che, dati come parametri un array di numeri interi e la sua lunghezza, restituisca il minimo tra i
valori compresi nellarray.

Esercizio 3 (6 punti)
Nel seguente codice sono presenti degli errori. Correggerlo scrivendo qui a fianco il codice corretto (3 punti)

int x = 3; printf("%.2f", x);

cosa stampa il seguente codice? (fare una X sulla risposta corretta) (3 punti)

char* s = "Pippo"; int x = 1;


printf("%s %d", ++s, x++);

(a) i 2
(b) i 1
(c) ippo 1
(d) Pipp 2
Universit Politecnica delle Marche, Facolt di Ingegneria
Elementi di Informatica (Prof. C. Morbidoni)
PROVA SCRITTA 14 Gennaio 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 (12 punti)


Si consideri un file di testo dati.txt in cui ogni riga contiene:
- una stringa senza spazi (rappresentante una pagina di Wikipedia);
- un il numero di accessi alla pagina;
- la data in cui gli accessi sono avvenuti.
I tre campi sono separati da un numero arbitrario di spazi.
Si assuma che:
- righe contenti la medesima pagina abbiano contengano sempre date diverse tra loro;
- il file non contenga mai pi di 1000 righe;
- il nome delle pagine non sia mai pi lungo di 100 caratteri.

Esempio:
dati.txt
Canone_televisivo_in_Italia 2050 12/01/2016
Iraq 1300 12/01/2016
Stato_Islamico 4040 12/01/2016
Canone_televisivo_in_Italia 300 13/01/2016
Guerra_civile_siriana 1500 13/01/2016
Arabia_Saudita 560 13/01/2016
Canone_televisivo_in_Italia 2350 14/01/2016
Guerra_civile_siriana 1500 14/01/2016

Si scriva un programma in C che:


- Dichiari un nuovo tipo di dati (struttura) per rappresentare una pagina di Wikipedia e la rispettivo numero di accessi.
- Legga il file dati.txt e generi un array di strutture (precedentemente definite) contenenti tutte le diverse pagine assieme al
corrispondente totale di accessi (calcolato su tutti le date presenti nel file).

Esercizio 2 (12 punti)


Scrivere una funzione C ricorsiva che, dati come parametri un array di numeri interi e la sua lunghezza, restituisca il minimo tra i
valori compresi nellarray.

Esercizio 3 (6 punti)
Nel seguente codice sono presenti degli errori. Correggerlo scrivendo qui a fianco il codice corretto (3 punti)

float x = 3.5; printf("%f", &x);

cosa stampa il seguente codice? (fare una X sulla risposta corretta) (3 punti)

char* s = "Pippo"; int x = 3;


printf("%s %d", s, ++x);

(a) Pippo 3
(b) P 3
(c) Pippo 4
(d) i 4
Universit Politecnica delle Marche, Facolt di Ingegneria
Elementi di Informatica (Prof. C. Morbidoni)
PROVA SCRITTA 14 Gennaio 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 (12 punti)


Si consideri un file di testo dati.txt in cui ogni riga contiene:
- una stringa senza spazi (rappresentante una pagina di Wikipedia);
- un il numero di accessi alla pagina;
- la data in cui gli accessi sono avvenuti.
I tre campi sono separati da un numero arbitrario di spazi.
Si assuma che:
- righe contenti la medesima pagina abbiano contengano sempre date diverse tra loro;
- il file non contenga mai pi di 1000 righe;
- il nome delle pagine non sia mai pi lungo di 100 caratteri.

Esempio:
dati.txt
Canone_televisivo_in_Italia 2050 12/01/2016
Iraq 1300 12/01/2016
Stato_Islamico 4040 12/01/2016
Canone_televisivo_in_Italia 300 13/01/2016
Guerra_civile_siriana 1500 13/01/2016
Arabia_Saudita 560 13/01/2016
Canone_televisivo_in_Italia 2350 14/01/2016
Guerra_civile_siriana 1500 14/01/2016

Si scriva un programma in C che:


- Dichiari un nuovo tipo di dati (struttura) per rappresentare una pagina di Wikipedia e la rispettivo numero di accessi.
- Legga il file dati.txt e generi un array di strutture (precedentemente definite) contenenti tutte le diverse pagine assieme al
corrispondente totale di accessi (calcolato su tutti le date presenti nel file).

Esercizio 2 (12 punti)


Scrivere una funzione C ricorsiva che, dati come parametri un array di numeri interi e la sua lunghezza, restituisca il minimo tra i
valori compresi nellarray.

Esercizio 3 (6 punti)
Nel seguente codice sono presenti degli errori. Correggerlo scrivendo qui a fianco il codice corretto (3 punti)

int x = 3; scanf("%d", x);

cosa stampa il seguente codice? (fare una X sulla risposta corretta) (3 punti)

char* s = "Pluto"; int x = 0;


printf("%c %d", s[x++], x++);

(a) l 2
(b) P 1
(c) P 2
(d) l 1
Universit Politecnica delle Marche, Facolt di Ingegneria
Elementi di Informatica (Prof. C. Morbidoni)
PROVA SCRITTA 14 Gennaio 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 (12 punti)


Si consideri un file di testo dati.txt in cui ogni riga contiene:
- una stringa senza spazi (rappresentante una pagina di Wikipedia);
- un il numero di accessi alla pagina;
- la data in cui gli accessi sono avvenuti.
I tre campi sono separati da un numero arbitrario di spazi.
Si assuma che:
- righe contenti la medesima pagina contengano sempre date diverse tra loro;
- il file non contenga mai pi di 1000 righe;
- il nome delle pagine non sia mai pi lungo di 100 caratteri.
Esempio:
dati.txt
Canone_televisivo_in_Italia 2050 12/01/2016
Iraq 1300 12/01/2016
Stato_Islamico 4040 12/01/2016
Canone_televisivo_in_Italia 300 13/01/2016
Guerra_civile_siriana 1500 13/01/2016
Arabia_Saudita 560 13/01/2016
Canone_televisivo_in_Italia 2350 14/01/2016
Guerra_civile_siriana 1500 14/01/2016

Si scriva un programma in C che:


- Dichiari un nuovo tipo di dati (struttura) per rappresentare una pagina di Wikipedia e la rispettivo numero di accessi.
- Legga il file dati.txt e generi un array di strutture (precedentemente definite) contenenti tutte le diverse pagine assieme al
corrispondente totale di accessi (calcolato su tutti le date presenti nel file).

Esercizio 2 (12 punti)


Scrivere una funzione C ricorsiva che, dati come parametri un array di numeri interi e la sua lunghezza, restituisca il minimo tra i
valori compresi nellarray.

Esercizio 3 (6 punti)
Nel seguente codice sono presenti degli errori. Correggerlo scrivendo qui a fianco il codice corretto (3 punti)

char x = '3'; scanf("%s", x);

cosa stampa il seguente codice? (fare una X sulla risposta corretta) (3 punti)

char* s = "Pluto"; int x = 1;


printf("%c %d", s[++x], x++);

(a) u 3
(b) P 1
(c) u 1
(d) u 2
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

Esercizio 1 (16 punti)

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

struct pageView {
int views;
char* page;
char* date;
};

int getIndexOf(struct pageView pv[], int len, char* page) {


for (int i = 0; i < len; i++) {
if (pv[i].page == page) {
return i;
}
}
return -1;
}

int main() {
FILE* f1 = fopen("file1.txt","r");
if (f1 == NULL) {
exit(0);
}
struct pageView pv[1000];
int len = 0;
int views;
char page[100];
char* data;
while (fscanf(f1,%s%d %s,page,&views, data)!=EOF) {
int index = getIndexOf(pv, len, page);
if (index != -1) {
pv[index].views += views;
} else {
len++;
struct pageView newItem;
newItem.page = page;
newItem.views = views;
pv[len] = newItem;
}
}
}

Esercizio 2 (13 punti)

#include <stdio.h>

int minimo (int v[], int len) {


if (len > 0) {
int minrel = minimo(v, len-1);
if (v[len] < minrel)
return v[len];
else
return minrel;
} else return v[0];
}

int main() {
int v[10] = {2,123,4,5,6};
printf("%d",minimo(v,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);

}
Universit Politecnica delle Marche, Facolt di Ingegneria
Elementi di Informatica (Prof. C. Morbidoni)
PROVA SCRITTA 29 Aprile 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 IL CODICE

Esercizio 1 (10 punti)


Si definisca una struttura (record), denominata analisi, in grado di memorizzare i seguenti dati relativi alle analisi del sangue di un
paziente: nome del paziente (stringa), livello di glicemia (numero intero), livello di colesterolo (numero intero), livello di trigliceridi
(numero intero).
Si consideri che i livelli minimi e massimi per ogni valore misurato siano memorizzati in un file nel seguente formato:

trigliceridi 50 70
glicemia 60 100
colesterolo 130 200

dove ogni riga contiene tre valori separati da uno spazio che rappresentano, nellordine, il nome del valore, il livello minimo, il livel-
lo massimo.
Si definisca infine una funzione che prenda come parametri un array di analisi e il nome del file contenente livelli minimi e massi-
mi dei valori misurati e che stampi il nome di ogni paziente le cui analisi del sangue presentano livelli anomali (maggiori del mas-
simo o minori del minimo) per almeno uno dei valori misurati.

Esercizio 2 (10 punti)


Si definisca una procedura che prenda come parametro un vettore di numeri reali V di lunghezza L, rappresentante un segnale cam-
pionato. La funzione dovr prima chiedere ripetutamente allutente di inserire un valore intero N fino a che esso non sia un divisore
di L. Successivamente la funzione dovr comprimere il segnale creando un nuovo vettore VC, di lunghezza L / N, i cui valori sono
uguali alla media aritmetica dei valori del segnale originale in N istanti di campionamento successivi. In altre parole, il primo valore
in VC sar la media dei primi N valori di V (da 0 a N-1), il secondo sar la media dei secondi N valori di V (da N a 2N-1), e cos via.
Infine la funzione dovr stampare il contenuto di VC a video.
Ad esempio, se V
[2.3 , 2.6 , 3.2 , 2.5 , 2.8 , 2.2]
e lutente ha inserito il numero N = 3, il vettore VC sar:
[2.7 , 2.5]

Esercizio 3 (10 punti)


Si definisca una funzione ricorsiva che, data una lista di interi (rappresentazione collegata con puntatori e strutture), ne restituisca il
valore massimo.
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

Esercizio 1 (10 Punti)

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

//Definizione struttura: 1 Punti


typedef struct {
char* nome;
int colesterolo;
int glicemia;
int trigliceridi;
} analisi;

//Dichiarazione funzione: 1 Punto


void alert(analisi v[], int l, char* f) {
//Apertura file: 1 Punto
FILE* file;
if ((file = fopen(f,"r")) == NULL) {
exit(0);
}
char * valore; int min; int max;
//Scansione file e lettura valori: 3 Punti
while (fscanf(file, "%s%d%d",valore,&min, &max) != EOF) {
//Scansione array e lettura misurazioni: 3 Punti
for (int i = 0; i < l; i++) {
int misurazione;
if (strcmp(valore,"glicemia")==0) {
misurazione = v[i].glicemia;
} else if (strcmp(valore,"colesterolo")==0) {
misurazione = v[i].colesterolo;
} else if (strcmp(valore,"trigliceridi")==0) {
misurazione = v[i].trigliceridi;
}
//Controllo livelli e output a video : 1 Punti
if ( misurazione > max || misurazione < min) {
printf("%s\n", v[i].nome);
}
}
}

// Non richiesto
int main() {
analisi a[2];

a[0].trigliceridi = 60;
a[0].glicemia = 70;
a[0].colesterolo = 150;
a[0].nome = "Pippo Baudo";

a[1].trigliceridi = 60;
a[1].glicemia = 30;
a[1].colesterolo = 150;
a[1].nome = "Tizio Inventato";

alert(a,2,"analisi.txt");
}

Esercizio 2 (10 Punti)

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

//Dichiarazione funzione: 1 Punto


void compress(float v[], int l) {
int n;
// Richiesta ripetuta inserimento valore: 2 Punti
do {
printf("Inserisci un numero intero divisore di %d\n", l);
scanf("%d",&n);
} while (l % n!=0);
//Dichiarazione nuovo vettore e lunghezza: 1 Punto
int lc = l/n;
float vc[lc];
//Iterazioni sui due vettori e calcolo somma: 4 Punti
for (int i = 0; i<lc; i++) {
float acc = 0;
for (int j = 0; j<n; j++) {
acc += v[j+i*n];
}
//Memorizzazione valore medio: 1 Punto
vc[i] = acc / n;
//Stampa vettore a video: 1 Punto
printf("%f\n",vc[i]);
}
}

//Non richiesto
int main() {
float v[] = {2.3 , 2.6 , 3.2 , 2.5 , 2.8 , 2.2};
compress(v, 6);
}

Esercizio 3 (10 Punti)

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

//Definizione lista: 1 Punto


typedef struct elem {
int value;
struct elem * next;
} list;

//Dichiarazione funzione: 1 Punto


int max(list * p) {
// Controllo puntatore null: 1 Punto
if (p == NULL) {
exit(0);
}
// Condizione di stop ricorsione: 3 Punti
if (p->next == NULL) {
return p->value;
} else {
Chiamata ricorsiva: 4 Punti
int m = max(p->next);
return (p->value > m) ? p->value : m;
}
}

//Non richiesto
list* inserisci(list* p, int num) {
list* pnew = (list*) malloc(sizeof(list));
pnew->next = p;
pnew->value = num;
return pnew;
}

//Non richiesto
int main() {
list* p = NULL;
p = inserisci(p,13);
p = inserisci(p,2);
p = inserisci(p,9);
p = inserisci(p,56);
int m = max(p);
printf("MAX: %d", m);
}
Universit Politecnica delle Marche, Facolt di Ingegneria
Elementi di Informatica (Prof. C. Morbidoni)
PROVA SCRITTA 13 Luglio 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 progressi-
vo 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 corretta, corredata di tutto quanto necessario alla verifica
del corretto funzionamento.

* LEGGERE E CAPIRE BENE IL TESTO DEGLI ESERCIZI PRIMA DI COMINCIARE A SCRIVE-


RE IL CODICE

Esercizio 1 (14 punti)


Si considerino due file, chiamati rispettivamente rubrica.txt e tabulato.txt. Il primo contiene in ogni riga
un nome, un cognome ed un numero di telefono separati da uno spazio. Il secondo contiene in ogni riga il
numero di telefono del chiamante, quello del destinatario della chiamata e la durata della chiamata in minuti
(numero in virgola mobile) separati da uno spazio.
Si scriva un programma C che, dopo aver chiesto allutente di inserire il nome e cognome di una persona,
cerchi il corrispondente numero telefonico nella rubrica, individui la chiamata pi lunga fatta da tale persona
e stampi a video, se presente nella rubrica, il nome e cognome del destinatario di tale chiamata, oppure il
numero di telefono se questo non presente in rubrica.
Nota: si assuma che ogni stringa letta da file non superi mai i 100 caratteri.

Esempio, rubrica.txt
Alberto Rossi 3385555123
Giovanni Bianchi 3385555456
Matteo Verdi 3405555777
.

Esempio, tabulato.txt
3385555123 3385555456 20.54
3385555123 3405555777 32.60
3405555777 3205555666 5.30
.
Esercizio 2 (12 punti)
Si definisca una funziona C che prenda come parametri un array di float, la sua lunghezza e un numero intero
K, e che stampi a video la sequenza di K elementi contigui la cui somma sia massima.

Esercizio 3 (4 punti)
Si definisca:
1) Un tipo di dato A che rappresenti un elemento di una lista collegata bidirezionale di valori double
2) Una variabile B di tipo puntatore ad A
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 risultato dellautovalutazione e quindi per superare lesame.
Il colloquio orale (non facoltativo, ma a discrezione del docente) potr riguardare ogni argomento del pro-
gramma e alzare cos come abbassare il voto ottenuto allo scritto (anche sotto la sufficienza).

SOLUZIONE DEGLI ESERCIZI

Esercizio 1 (14 punti)

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

int main() {

// Apertura e controllo esistenza dei file: 2 punti


FILE * ft;
if ((ft = fopen("tabulato.txt","r")) == NULL) {
printf("File error");
exit(1);
}
FILE * fr;
if ((fr = fopen("rubrica.txt","r")) == NULL) {
printf("File error");
exit(1);
}

//Inserimento nome e cognome da tastiera: 2 punti


printf("Inserisci un nome in rubrica:");
char nome[100];
char cognome[100];
scanf("%s%s",nome, cognome);

//Ricerca del numero in rubrica: 3 punti


char n[100];
char c[100];
char tel[100];
int found = 0;
while ( (fscanf(fr,"%s%s%s", n, c, tel)) != EOF ) {
if ( (strcmp(n,nome) == 0) && (strcmp(c,cognome) == 0) ) {
found = 1;
break;
}
}
if (!found) {
printf("Contatto non trovato");
exit(1);
}

//Individuazione delle chiamata pi lunga: 3 punti


char chiamante[100];
char chiamato[100];
float durata;
char chiamato_best[100];
float durata_best = 0;
found = 0;
while ( (fscanf(ft,"%s%s%f", chiamante, chiamato, &durata)) != EOF ) {
if ( (strcmp(chiamante,tel) == 0) && durata > durata_best) {
strcpy(chiamato_best, chiamato);
durata_best = durata;
found = 1;
}
}
if (!found) {
printf("Nessuna chiamata trovata");
exit(2);
}

// Ricerca e stampa del nome e cognome della persona chiamata in rubrica: 3 punti
fseek(fr,0,SEEK_SET);
found = 0;
while ( (fscanf(fr,"%s%s%s", n, c, tel)) != EOF ) {
if ( (strcmp(tel,chiamato_best) == 0) ) {
printf("%s %s %f", n, c, durata_best);
found = 1;
break;
}
}
//Stampa del numero se non presente in rubrica: 1 punto
if (!found) {
printf("Numero chiamato non in rubrica: %s %f", chiamato_best, durata_best);
}
return 0;
}

Esercizio 2 (12 punti)

//Stampa array: 2 punti


void stampa_array(float V[], int n) {
int i;
for(i=0; i<n; i++)
printf("%f ", V[i]);
printf("\n");
return;
}

//Calcolo somma di una serie: 3 punti


float somma(float V[], int k) {
int i;
float somma=0.0;

for (i=0; i<k; i++)


somma += V[i];
return(somma);
}

//Dichiarazione funzione: 2 punti


void max_sequenza(float V[], int n, int k) {
int i, i_max;
float max, s;
//Inizializzazione somma: 1 punto
max = somma(&V[0], k);
i_max = 0;
// Iterazione fino a n-k: 2 punti
for (i=1; i<=n-k; i++) {
//Controllo somma e aggiornamento massimo: 2 punti
s = somma(&V[i], k);
if (s > max) {
max = s;
i_max = i;
}
}
stampa_array(&V[i_max], k);
}

Esercizio 3 (4 punti)

//2 punti
typedef struct elem {
double val;
struct elem * next;
struct elem * previous;
} A;

//2 punti
A * B;
Universit Politecnica delle Marche, Facolt di Ingegneria
Elementi di Informatica (Prof. C. Morbidoni)
PROVA SCRITTA 20 Dicembre 2016
DURATA: 1 ora e 30 minuti

Esercizio 1 (15)

Scrivere un programma C che, prese come argomenti della funzione main due stringhe rappresentati il nome di due file,
crei per ogni file un vettore contente tutte le parole incluse nel file stesso, senza ripetizioni, e calcoli il coefficiente di
similarit di Jaccard tra i due vettori cos ottenuti, scrivendone il valore a video.
Il coefficiente di Jaccard il rapporto tra le parole in comune tra i due vettori e il numero totale di parole diverse pre-
senti nei due vettori.
Nota: una parola una stringa non contenente spazi. Le parole sono separate lun laltra da spazi.

Esercizio 2 (15 punti)

Scrivere una procedura C che, dati come parametri un puntatorep al primo elemento di una lista collegata di numeri
reali e un array v di numeri reali terminato dal valore zero, elimini dalla lista p tutti gli elementi contenuti in v.
Nota: la funzione deve essere in grado di rimuovere qualsiasi elemento sia necessario (compreso il primo).
REGOLE

Ogni studente ricever una copia del suo elaborato e durante la correzione degli esercizi dovr assegnare un punteggio
ad ogni esercizio (auto valutazione) secondo le modalit indicate durante la correzione stessa.

Lo studente potr scegliere di sostenere la prova orale solo se raggiunger il punteggio minimo di 16 punti totali.

Lo studente dovr presentarsi allorale con la fotocopia del proprio elaborato e il punteggio assegnato ben visibile.

Durante lorale lo studente dovr, su richiesta, saper spiegare chiaramente ogni parte del suo programma per con-
fermare il risultato dellautovalutazione.

Durante la prova orale, che si tiene lo stesso giorno dopo quella scritta, lo studente dovr rispondere a 2 domande aperte
sul programma del corso.
Il voto finale verr assegnato dal docente tenendo conto del compito scritto e delle risposte alle domande.
SOLUZIONE DEGLI ESERCIZI

Esercizio 1 (15 punti)

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

//Controllo inserimento parole duplicate / rimozione dei duplicati: 3 punti


int isIn(char* word, char* words[], int l) {
for (int i = 0; i<l; i++) {
if (strcmp(word,words[i]) ==0) return 1;
}
return 0;
}

int leggiTesto(char* fileName, char* text[]) {

//Apertura file e controllo: 1 punti


FILE * f = fopen(fileName, "r");
if (f == NULL) exit(1);

//Lettura degli array di parole da file: 3 punti


char word[100];
char* words[1000];
int i = 0;
while(fscanf(f,"%s",word) != EOF) {
if (!isIn(word, words, i)) {
strcpy(words[i],word);
i++;
}

}
return i;
}

//calcolo coefficiente di Jaccard: 4 punti


float jaccardSimilarity(char* vett1[], int l1, char* vett2[], int l2) {
float sim = 0;
for (int i = 0; i<l1; i++) {
char* term1 = vett1[i];
for (int j = 0; j<l2; j++) {
char* term2 = vett2[j];
if (strcmp(term1,term2) == 0) {
sim++;
}
}
}
sim = sim / ( l1 + l2 - sim);
return sim;
}

//Dichiarazione main: 2 punti


int main(int argl, char* argv[]) {

//lettura argomenti main: 2 punti


char* file1; strcpy(file1, argv[1]);
char* file2; strcpy(file2, argv[2]);

char* text1[1000];
char* text2[1000];
int l1 = leggiTesto(file1, text1);
int l2 = leggiTesto(file2, text2);
float sim = jaccardSimilarity(text1,l1,text2,l2);

printf("Similarity is: %f", sim);

Esercizio 2 (15 punti)

//Definizione lista: 1 punto


typedef struct node {
float value;
struct node * next;
} list;

//Dichiarazione funzione: 2 punti


void clean(list** p, float v[]) {
//iterazione sulla lista: 2 punti
while ( *p != NULL) {
//Iterazione sull'array: 2 punti
for (int i = 0; v[i]!=0; i++) {
//Controllo valori uguali: 1 punto
if (v[i] == (*p)->value) {
//Eliminazione elemento: 3 punti
list* tmp = *p;
*p = (*p)->next;
//Deallocazione puntatore: 1 punto
free(tmp);
//Controllo: Se abbiamo rimosso l'ultimo elemento
//lo scorrimento da errore, occorre fermarsi: 1 punto
if (*p == NULL) return;
break;
}
}
//scorrimento: 2 punti
p = & ( (*p) -> next );
}
return;
}
Universit Politecnica delle Marche, Facolt di Ingegneria
Elementi di Informatica (Prof. C. Morbidoni)
PROVA SCRITTA 21 Giugno 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 IL CODICE

Esercizio 1 (12 punti)


Si definisca una procedura C denominata merge che prenda come parametri:
- un array A di interi ordinati in modo crescente e la rispettiva lunghezza
- un array B di interi ordinati in modo crescente e la rispettiva lunghezza
- un array C di interi
La procedura dovr fondere gli array A e B e scrivere il risultato nellarray C. In altre parole C dovr essere un array ordinato di interi
contenere tutti i numeri inclusi in A e B.

Esempio:
Se A {1, 3, 5} e B {2, 4, 6, 8} larray C, risultante dalla fusione di A e B, sar il seguente: {1, 2, 3, 4, 5, 6, 8}

Esercizio 2 (12 punti)


Si implementi allinterno della funzione main() un programma C che:
- legga da tastiera due array di interi chiedendo allutente per ognuno dei due array:
- a) di specificarne la lunghezza
- b) di inserire uno dopo laltro i numeri interi da includere nellarray, assicurandosi che ogni numero inserito sia maggiore del
precedente, e richiedendo il reinserimento del numero se tale condizione non verificata.
- invochi la funzione definita allesercizio 1 per effettuare la fusione ordinata dei due array
- stampi a video larray risultante da tale fusione

Esercizio 3 (6 punti)
Si dichiarino in linguaggio C le seguenti variabili:

- A, array di stringhe di lunghezza 10


- B, puntatore a puntatore ad array di interi
- C, struttura dati composta da un intero, un float e una stringa.
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

Esercizio 1 (12 punti)

//Dichiarazione della funzione: 2 punti


void merge( int A[], int na, int B[], int nb, int C[] ){
int i,j,k;
i=j=k=0;
//Interazione sui due array e fusione: 5 punti
while (i<na && j<nb)
if (A[i]<B[j])
C[k++]=A[i++];
else
C[k++]=B[j++];
//Riempimento array nel caso A e B siano di lunghezza diversa: 5 punti
while (i<na)
C[k++]=A[i++];
while (j<nb)
C[k++]=B[j++];
}

Esercizio 2 (12 punti)

//Stampa a video dellarray: 2 punti


void print(int v[], int len) {
for (int i= 0; i<len; i++) {
printf("%d\n",v[i]);
}

int main() {

//Inserimento lunghezza array: 2 punti


int l1;
printf("Inserisci la lunghezza del primo array\n");
scanf("%d",&l1);
//Inserimento valori ordinati nell'array: 5 punti
int a[l1];
for (int i=0; i<l1; i++) {
int limit;
if (i==0)
limit = 0;
else
limit = a[i-1];
int n;
do {
printf("Inserisci un numero intero maggiore di %d:\n",limit);
scanf("%d",&n);
} while (n<=limit);
a[i] = n;
}

int l2;
printf("Inserisci la lunghezza del secondo array\n");
scanf("%d",&l2);
int b[l2];
for (int i=0; i<l2; i++) {
int limit;
if (i==0)
limit = 0;
else
limit = b[i-1];
int n;
do {
printf("Inserisci un numero intero maggiore di %d:\n",limit);
scanf("%d",&n);
} while (n<=limit);
b[i] = n;
}

//dichiarazione array risultate dalla fusione: 2 punti


int c[l1+l2];
//Invocazione funzione merge: 1 punti
merge(a, l1, b, l2, c);
printf("Risultato della fusione:\n");
//Stampa array a video: 2 punti
print(c, l1+l2);
}

Esercizio 3 (6 punti)

// 2 punti
char * A[10];

// 2 punti
int *** B;

// 2 punti
struct {
int i;
float f;
char * s;
}C;
Universit Politecnica delle Marche, Facolt di Ingegneria
Elementi di Informatica (Prof. C. Morbidoni)
PROVA SCRITTA 22 Settembre 2016
DURATA: 2 ore

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 (21 punti)

A. (4 punti) Definire una funzione denominata similarity che, date due stringhe come parametri, ritorni il
numero di caratteri uguali e nella stessa posizione allinterno delle due stringhe.

Esempio: similarity(pippo,pap) = 1 + 1 = 2
similarity(pippo,tavolo) = 0

B. (8 punti) Definire una procedura denominata similarityMatrix che, dati come parametri un array di strin-
ghe V ed una matrice di stringhe M, calcoli la similarit tra ogni coppia di stringhe in V (invocando la fun-
zione similarity definita al punto A) e popoli le celle della matrice M, in cui righe e colonne rappresentano le
diverse stringhe (nellordine in cui appaiono nellarray). Tutte le celle sulla diagonale della matrice M do-
vremmo essere poste a zero, le atre dovranno contenere il valore della similarit tra la stringa corrispondente
alla colonna e quella corrispondente alla riga.

Esempio: Se V = {"Pippo","Pippolo","Gervaso", "Paperino", "Plutarco", Geffa"}

La matrice di similarit sar la seguente:

0 5 0 2 1 0
5 0 1 2 1 0
0 1 0 0 1 3 Esempio:
2 2 0 0 2 0 Similarit tra le parole
1 1 1 2 0 1 Pippo e Paperino
0 0 3 0 1 0

C. (9 punti) Si scriva un programma C in cui


Venga inizializzato un array V di stringhe a piacere;
Si ottenga la matrice di similarit dellarray V invocando la funzione similarityMatrix definita al punto B.
Si chieda allutente di inserire una parola da tastiera
Se la parola inserita contenuta nellarray V, si individui nella matrice e si stampi a video le parola pi
simile a quella inserita.
Esercizio 2 (9 punti)
Dopo aver analizzato i seguenti programmi C:
- Se il programma corretto, scrivere a lato il relativo output
- Sottolineare nel codice eventuali errori, spiegandoli brevemente e chiaramente a lato

#include <stdlib.h>
#include <stdio.h>
int printLink() {
printf("%s\n",link);
}
int main() {
char* link = "example.org";
printLink();
return 0;
}

#include <stdlib.h>
#include <stdio.h>
int printTwos(char* s) {
int found = 0;
while(s[0]!='\0') {
if (s[0]=='2') {
printf("%c\n",s[0]);
found++;
}
s++;
}
return found;
}
int main() {
int n = printTwos("p23kuk42k6");
return 0;
}

#include <stdlib.h>
#include <stdio.h>
int main() {
char mat[3][3];
for(int i = 0; i<3; i++) {
for (int j = 0; j<3; j++) {
mat[i][j] = i==j ? 0 : i*j;
printf("%d",*mat[i]);
}
printf("\n");
}
return 0;
}
Esercizio 2 (9 punti)
Dopo aver analizzato i seguenti programmi C:
- Se il programma corretto, scrivere a lato il relativo output
- Sottolineare nel codice eventuali errori, spiegandoli brevemente e chiaramente a lato

#include <stdlib.h>
#include <stdio.h>
char* link = "example.org";

int printLink(char* link) {


printf("%s\n",link);
}
int main() {
printLink(link);
return 0;
}

#include <stdlib.h>
#include <stdio.h>
int printTwos(char* s) {
int found = 0;
while(s[0]!='\0') {
if (s[0]=='2') {
printf("%c\n",s[0]);
found++;
}
}
s++;
return found;
}
int main() {
int n = printTwos("p23kuk42k6");
return 0;
}

#include <stdlib.h>
#include <stdio.h>
void popolaMatrice() {
for(int i = 0; i<3; i++) {
for (int j = 0; j<3; j++) {
mat[i][j] = i==j ? 0 : i*j;
printf("%d",mat[i][j]);
}
printf("\n");
}
}
int main() {
char mat[3][3];
popolaMatrice();
return 0;
}
Esercizio 2 (9 punti)
Dopo aver analizzato i seguenti programmi C:
- Se il programma corretto, scrivere a lato il relativo output
- Sottolineare nel codice eventuali errori, spiegandoli brevemente e chiaramente a lato

#include <stdlib.h>
#include <stdio.h>
char* link = "example.org";
int printLink(char* link) {
printf("%s\n",link);
link = "google.com";
}
int main() {
printLink(link);
printLink(link);
return 0;
}

#include <stdlib.h>
#include <stdio.h>
int printTwos(char* s) {
while(s[0]!='\0') {
if (s[0]=='2') {
printf("%c\n",s[0]);
}
s++;
}
return s;
}
int main() {
int n = printTwos("p23kuk42k6");
return 0;
}

#include <stdlib.h>
#include <stdio.h>
void popolaMatrice(char[3][3] mat) {
for(int i = 0; i<3; i++) {
for (int j = 0; j<3; j++) {
mat[i][j] = i==j ? 0 : i*j;
printf("%d",mat[i][j]);
}
printf("\n");
}
}
int main() {
char mat[3][3];
popolaMatrice();
return 0;
}
REGOLE

Ogni studente ricever una copia del suo elaborato e durante la correzione degli esercizi dovr assegnare un
punteggio ad ogni esercizio (auto valutazione) secondo le modalit indicate durante la correzione stessa.

Lo studente potr scegliere di sostenere la prova orale solo se raggiunger il punteggio minimo di 16 punti
totali.

Lo studente dovr presentarsi allorale con la fotocopia del proprio elaborato e il punteggio assegnato ben
visibile.

Durante lorale lo studente dovr, su richiesta, saper spiegare chiaramente ogni parte del suo programma
per confermare il risultato dellautovalutazione.

Durante la prova orale, che si tiene lo stesso giorno dopo quella scritta, lo studente dovr rispondere a 2 do-
mande aperte sul programma del corso.
Il voto finale verr assegnato dal docente tenendo conto del compito scritto e delle risposte alle domande.
SOLUZIONE DEGLI ESERCIZI

Esercizio 1 (21 punti)

A.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 100

//Parte A - 4 punti
int similarity(char* s1, char* s2) {
int sim = 0;
while(*s1!='\0' && *s2!='\0') {
if (s1[0]==s2[0]) {
sim++;
}
s1++; s2++;
}
return sim;
}

//Parte B - 8 punti
void similarityMatrix(char* V[], int vl, int M[][MAX]) {
for(int i = 0; i < vl; i++) {
for(int j = 0; j < vl; j++) {
int sim;
if (i==j) sim = 0;
else sim = similarity(V[i],V[j]);
M[i][j] = sim;
printf("%d ",sim);
}
printf("\n");
}
}

//Parte C - 9 punti
//Trovare il valore massimo nella corrispondente riga della matrice di similarit (3 punti)
int findMax(int v[], int l) {
int max = 0;
int maxValue = 0;
for (int i = 0; i< l; i++) {
if (v[i]>maxValue) {
max = i;
maxValue = v[i];
}
}
return max;
}
int main() {
//Inizializzazione variabili: 1 punto
int M[MAX][MAX];
char* V[] = {"Pippo","Pippolo","Gervaso", "Paperino", "Plutarco", "Geffa"};
//Chiamata funzione: 1 punto
similarityMatrix(V, 6, M);
//lettura da standard input in variabile: 2 punti
char q[MAX];
printf(Inserisci parola:\n");
scanf("%s",q);
//Iterazione per trovare la riga corrispondente alla parola: 3 punti
for (int i = 0; i < 6; i++) {
if (strcmp(V[i], q) == 0 ) {
int imax = findMax(M[i], 6);
printf("%s ha %d lettere in comune",V[imax],M[i][imax]);
}
}
}
Universit Politecnica delle Marche, Facolt di Ingegneria

Elementi di Informatica (Prof. C. Morbidoni)


PROVA SCRITTA 10 Settembre 2015
DURATA: 1 ora e 15 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, even-
tualmente corretta, 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)


Un segnale elettrico campionato ad una data frequenza pu essere rappresentato come un vettore di numeri in virgola mobile, in cui
lelemento i-esimo contiene la misura del segnale al tempo t(i).
Scrivere in linguaggio C un procedura che presi come parametri larray A di lunghezza N rappresentate il segnale compianto e un
numero intero P, calcoli il valore medio del segnale ogni P istanti di tempo (t(P), t(2*P) t(N/P*P)) e scriva i risultanti valori in un
nuovo array passato alla funzione tramite puntatore. Se N non divisibile per P, considerare che le ulteriori misurazioni dopo list-
ante t(N) siano uguali a zero.
Ad esempio se P = 4 e larray A = 5.5 2.5 4 6 7 5 12 10 2 4
larray B sar B = 4.5 8.5 1.5

Esercizio 2 (9 punti)
Dato un file di testo come il seguente:

Nome:Marco Hobby:Matematica/Luogo:Ancona
Nome:Laura Hobby:Calcio/Luogo:Macerata
Nome:Giulio Hobby:Fisica/Luogo:Pesaro
Nome:Paola Hobby:Tennis/Luogo:Urbino

Scrivere un programma che permetta allutente di inserire un hobby ed un luogo (entrambi stringhe di lunghezza arbitraria contenenti
eventuali spazi) e che scriva a video, se esistono, i nomi di tutte le persone nellelenco con lo stesso hobby oppure con lo stesso luo-
go.
Nota: consentito usare opportunamente la funzione strcmp(char *, char *) della libreria string.h

Esercizio 3 (7 punti)
Nei seguenti frammenti di codice C sottolineare e spiegare con una breve nota a margine gli eventuali errori.
A) 2 punti
int a[10];
for (int i = 0; i <=9; i++) { a["i"] = i*i; }
B) 2 punti
char * p;
int a;
while(p!="pippo") { scanf("%s %s, &a, &p); }
C) 3 punti
int* f1(int a[], int k) {
while(a[i] != -1) {
if (a[i] == k) { return a[i]; }
}
return 0;
}
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 risultato 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 sufficien-
za).

SOLUZIONE DEGLI ESERCIZI

Esercizio 1 - 14 punti

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

//Dichiarazione funzione 2 punti


void compress(float a[], int n, float b[], int p) {

float partial = 0;
int c = 0;

//Ciclo principale 2 punti


for (int i = 0 ; i < n; i++) {
partial += a[i];
Controllo sulla variabile p 2 punti
int resto = (i+1) % p;
if (resto == 0) {
//Calcolo media parziale valori 2 punti
float media = partial/p;
//Assegnamento del valore nel secondo array 2 punti
b[c] = media;
c++;
// Azzeramento somma parziale 1 punto
partial = 0;
}
}
//Considerare gli eventuali restanti valori 3 punti
if (partial != 0) {
b[c] = partial/p;
c++;
}

void write(float a[], int l) {


for (int i = 0; i < l ; i++) {
printf("%.1f \n",a[i]);
}
}
int main() {
float a[10] = {5.5,2.5,4,6,7,5,12,10,2,4};
float b[3];
write(a,10);
int peace = 4;
printf("Compressing, peace = %d\n",peace);
compress(a,10,b,peace);
write(b,3);
}

Esercizio 2 - 9 punti

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

// -1
int main() {

//Apertura file 1 punti


FILE * f;
if ((f = fopen(src/nomi.txt","r")) == 0) {
printf("File error");
return 1;
}

char * qhobby = NULL;


char * qluogo = NULL;

//Lettura valori da standard input 2 punti


printf(Hobby:);
scanf(%s", qhobby);
printf("Citt:");
scanf("%s",qluogo);

char* nome = NULL;


char* hobby = NULL;
char* luogo = NULL;

//Lettura valori dalle righe del file 2 punti


while (fscanf(f,"Nome:%s/Hobby:%sLuogo:%s", nome, hobby, luogo) != EOF) {

//Confronto stringhe 2 punti


if (strcmp(qhobby,hobby) || strcmp(qluogo,luogo))

//Stampa valori a video 2 punti


printf(Nome:%s/Hobby:%s Luogo:%s", nome, hobby, luogo);
}
return 0;
}