Il 0% ha trovato utile questo documento (0 voti)
5 visualizzazioni4 pagine

Seconda Prova Di Esonero - 11 Gennaio 2017: Esercizio N. 1

Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
5 visualizzazioni4 pagine

Seconda Prova Di Esonero - 11 Gennaio 2017: Esercizio N. 1

Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 4

Università Roma Tre – Dipartimento di Matematica e Fisica – Corso di Laurea in Matematica

Corso di Informatica 1 (IN110) – Prof. Marco Liverani – a.a. 2016/2017

Seconda prova di esonero – 11 gennaio 2017

Risolvere i seguenti problemi proponendo, per ciascun esercizio, la codifica in linguaggio C di un programma
completo. La prova dura tre ore, durante le quali non è possibile allontanarsi dall’aula, se non dopo aver
consegnato l’elaborato scritto. Per superare la prova di esonero è necessario ottenere almeno 15 punti;
tuttavia affinché le prove di esonero siano valide è necessario che la media dei voti del primo e del secondo
esonero sia maggiore o uguale a 18/30. È possibile utilizzare libri e appunti personali, senza scambiarli
con altri studenti. I compiti che presenteranno evidenti ed anomale “similitudini” saranno annullati.
Deve essere consegnata solo la “bella copia” del compito scritto; su ciascun foglio deve essere riportato il
nome, il cognome e il numero di matricola (o un altro codice identificativo di fantasia) dello studente.

Esercizio n. 1
Letto in input un intero n > 1, costruire le liste di adiacenza del grafo non orientato G = (V, E),
dove V = {2, 3, . . . , n} ed E = {(u, v) : u, v ∈ V e u = kv o v = ku per k > 1}.

Esempio Sia n = 9. Il grafo G = (V, E) è costituito dall’insieme V = {2, 3, 4, 5, 6, 7, 8, 9}


dei vertici e dall’insieme E = {(2, 4), (2, 6), (2, 8), (3, 6), (3, 9), (4, 8)} degli spigoli; il grafo G è
rappresentato in figura.

G = (V, E) 2 3

9 4

8 5

7 6

Soluzione
 
1 #include <stdlib.h>
2 #include <stdio.h>
3 #define MAX 100
4

5 struct nodo {
6 int info;
7 struct nodo *next;
8 };
9

10 void stampaLista(struct nodo *p) {


11 while (p != NULL) {
12 printf("%d --> ", p->info);

1
13 p = p->next;
14 }
15 printf("NULL\n");
16 return;
17 }
18

19 void stampaGrafo(struct nodo *V[], int n) {


20 int i;
21 for (i=2; i<=n; i++) {
22 printf("%2d: ", i);
23 stampaLista(V[i]);
24 }
25 return;
26 }
27

28 void aggiungiSpigolo(struct nodo *V[], int x, int y) {


29 struct nodo *p;
30 p = malloc(sizeof(struct nodo));
31 p->info = y;
32 p->next = V[x];
33 V[x] = p;
34 return;
35 }
36

37 void costruisciGrafo(struct nodo *V[], int n) {


38 int i, j;
39 for (i=2; i<=n; i++)
40 V[i] = NULL;
41 for (i=2; i<=n/2; i++) {
42 j=2*i;
43 while (j <= n) {
44 aggiungiSpigolo(V, i, j);
45 aggiungiSpigolo(V, j, i);
46 j = j+i;
47 }
48 }
49 return;
50 }
51

52 int main(void) {
53 int n;
54 struct nodo *V[MAX];
55 printf("Inserisci n>1: ");
56 scanf("%d", &n);
57 costruisciGrafo(V, n);
58 stampaGrafo(V, n);
59 return(0);
60 }
 

2
Esercizio n. 2
Leggere in input una sequenza di numeri interi e memorizzarla in una lista L. Stampare la lista.
Eliminare da L tutti gli elementi il cui valore è maggiore di tutti gli elementi che lo seguono nella
lista. Stampare la lista.

Esempio Si consideri la lista

L=2→9→7→1→4→5→2

Gli elementi da eliminare sono 9, 7 e 5; al termine dell’elaborazione si ottiene la lista

L = 2 →6 9 →6 7 → 1 → 4 →6 5 → 2 = 2 → 1 → 4 → 2

Soluzione
 
1 #include <stdlib.h>
2 #include <stdio.h>
3 #define MAX 100
4

5 struct nodo {
6 int info;
7 struct nodo *next;
8 };
9

10 void stampaLista(struct nodo *p) {


11 while (p!=NULL) {
12 printf("%d --> ", p->info);
13 p = p->next;
14 }
15 printf("NULL\n");
16 return;
17 }
18

19 struct nodo *leggiLista(void) {


20 struct nodo *p, *primo=NULL;
21 int n, i;
22 printf("Numero di elementi della lista: ");
23 scanf("%d", &n);
24 printf("Elementi della lista: ");
25 for (i=0; i<n; i++) {
26 p = malloc(sizeof(struct nodo));
27 scanf("%d", &p->info);
28 p->next = primo;
29 primo = p;
30 }
31 return(primo);
32 }
33

34 int daEliminare(struct nodo *p) {


35 struct nodo *q=p;
36 int r=0;
37 while (q->next != NULL && p->info > q->next->info)
38 q = q->next;

3
39 if (q->next == NULL && q != p)
40 r = 1;
41 return(r);
42 }
43

44 int main(void) {
45 struct nodo *p, *q, *r;
46 p = leggiLista();
47 printf("L: ");
48 stampaLista(p);
49 q = p;
50 while (q != NULL && daEliminare(q) == 1) {
51 q = q->next;
52 free(p);
53 p = q;
54 }
55 while (q != NULL && q->next != NULL) {
56 if (daEliminare(q->next) == 1) {
57 r = q->next;
58 q->next = q->next->next;
59 free(r);
60 } else {
61 q = q->next;
62 }
63 }
64 printf("L: ");
65 stampaLista(p);
66 return(0);
67 }
 

Potrebbero piacerti anche