Corso di Programmazione 1
a.a.2007/2008
Prof.ssa Chiara Petrioli
Corso di Laurea in Informatica
Università degli Studi “La Sapienza”
(esercizi di preparazione al secondo
esonero)
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 1
Data una lista L di interi e dato un intervallo [i,j] si
scriva una funzione che verifichi se esistono in L
valori interi nell’intervallo specificato
 La funzione dovrà prendere in input
 una lista L
 due valori interi (i,j)
 Dovrà restituire in output
0 se nessuno degli elementi di L ha valori nell’intervallo [i,j]
1 altrimenti
Diamo la soluzione ricorsiva
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 1-soluzione ricorsiva
int Rfindintervallista (LISTA L, int i, int j)
{
if (L==NULL)
return 0;
else if ((L->elem>=i)&&(L->elem<=j))
return 1;
else
return (Rfindintervallista(L->next,i,j));
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 2
Data una lista L di interi e dato un intervallo [i,j] si
scriva una funzione che calcoli il numero di elementi
di L che abbiano un valore intero nell’intervallo
specificato
 La funzione dovrà prendere in input
 una lista L
 due valori interi (i,j)
 Dovrà restituire in output
Il numero di elementi di L che ha un valore in [i,j]
Diamo la soluzione ricorsiva e la soluzione iterativa
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 2-soluzione ricorsiva
int Rnum_occintervallista (LISTA L,int i, int j)
{
if (L==NULL)
return 0;
else if ((L->elem>=i)&&(L->elem<=j))
return (1+Rnum_occintervallista(L->next,i,j));
else
return (Rnum_occintervallista(L->next,i,j));
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 2-soluzione iterativa
int num_occintervallista (LISTA L,int i, int j)
{
int count=0;
while (L!=NULL)
{
if ((L->elem>=i)&&(L->elem<=j))
count++;
L=L->next;
}
return count;
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 3
Si scriva una funzione ricorsiva che data
una lista L elimini un elemento, ne lasci
val, elimini di nuovo un elemento, ne lasci
val etc.
Cosa intendiamo?
– se val=3 vogliamo eliminare:
il primo elemento
il quarto elemento (lasciamo tre elementi)
L’ottavo elemento etc.
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 3 –versione ricorsiva
LISTA eliminaognik (LISTA l1, int k, int val)
{
Si scriva una funzione
LISTA temp;
Ricorsiva
if (l1==NULL) return l1;
che, data una lista elimini
else if (k==0)
Un elemento ogni
{
val
La funzione è chiamata
temp=l1;
Dal main con k==0
l1=l1->next;
free (temp);
return eliminaognik(l1,val,val);
}
struct node {
else
int elem;
{
struct node *next;
l1->next=eliminaognik(l1->next,k-1,val);
};
return l1;
typedef struct node NODOLISTA;
}
typedef NODOLISTA *LISTA;
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 3-variante
void eliminaognikpuntpunt (LISTA *l1, int k, int val)
{
Si scriva una funzione
LISTA temp;
Ricorsiva
if (*l1==NULL) return;
che, data una lista elimini
else if (k==0)
Un elemento ogni
{
val
temp=*l1;
*l1=(*l1)->next;
struct node {
int elem;
free (temp);
struct node *next;
eliminaognikpuntpunt(l1,val,val);
};
return;
typedef struct node NODOLISTA;
}
typedef NODOLISTA *LISTA;
else
{
eliminaognikpuntpunt(&((*l1)->next),k-1,val);
return;
}
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 4
Data una lista si scriva una funzione che
elimini gli elementi con valori pari della
lista (si fornisca una versione ricorsiva)
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 4
void eliminapari(LISTA *l1)
{
LISTA temp;
if (*l1==NULL) return;
else if ((*l1)->elem %2)
{
eliminapari(&(*l1)->next);
Si scriva una funzione
return;
Ricorsiva
}
che, data una lista elimini
else
Gli elementi contenenti
{
Valori pari
temp=*l1;
*l1=(*l1)->next;
free(temp);
eliminapari(l1);
return;
}
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 5
Si scriva una funzione che date due liste
costruisca una terza lista data dall’unione
delle prime due
Potete utilizzare all’interno del codice
funzioni che abbiamo precedentemente
definito
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 5
void mergeliste (LISTA *PTRLISTA, LISTA L1, LISTA L2)
{
LISTA curr, temp;
temp=NULL;
PTRLISTA=&temp;
curr = L1;
while (curr!=NULL)
{
if (!(Rfindlista(*PTRLISTA,curr->elem)))
insertHEADlista(PTRLISTA,curr->elem);
curr = curr->next;
}
curr = L2;
while (curr!=NULL)
{
if (!(Rfindlista(*PTRLISTA,curr->elem)))
insertHEADlista(PTRLISTA,curr->elem);
curr = curr->next;
}
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 6
Si scriva una funzione che date due liste
costruisca (e restituisca il puntatore alla
testa di) una terza lista i cui elementi
contengono tutti e soli i valori che sono
presenti in entrambe le prime liste (ogni
valore compare esattamente una volta)
Potete utilizzare funzioni precedentemente
definite
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 6
void intersezioneliste (LISTA *PTRLISTA, LISTA L1, LISTA L2)
{
LISTA curr, temp;
temp=NULL;
PTRLISTA=&temp;
curr = L1;
while (curr!=NULL)
{
if ((Rfindlista(L2,curr->elem))
&&(!(Rfindlista(*PTRLISTA,curr->elem))))
insertHEADlista(PTRLISTA,curr->elem);
curr = curr->next;
}
}
SUPPONETE CHE LE DUE LISTE L1 e L2 SIANO ORDINATE. POTETE
RENDERE PIU’ EFFICIENTE IL CODICE?
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Glicini
struct nodoramo{
int valore;
ramo
struct nodoramo *succ;
3
};
struct elemglicine{
6
struct nodoramo *ramo;
struct elemglicine *next;
};
1
typedef struct nodoramo NODO;
typedef NODO *RAMO;
typedef struct elemglicine GLICINE2;
typedef GLICINE2 *GLICINEPTR;
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
next
2
succ
9
succ
succ
5
succ
succ
succ
Esercizio 7
Si scriva una funzione che dato un glicine
stampi i valori dei suoi elementi
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 7
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
succ
1
succ
5
succ
9
succ
2
succ
succ
6
3
next
void stampaglicine (GLICINEPTR G)
{
RAMO r;
if (G!=NULL)
{
printf("[ ] ->");
r=G->ramo;
while(r!=NULL)
{
printf("[[%d]]->",r->valore);
r=r->succ;
}
printf("\n | \n");
stampaglicine(G->next);
}
}
ramo
G
Esercizio 8
Si scriva una funzione che dato un glicine
calcoli la somma dei suoi elementi pari
Si possono utilizzare funzioni ausiliarie
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Esercizio 8
Funzione ausiliaria
int sommapariramo(RAMO R)
{
if(R==NULL)
return 0;
else
return((R->valore%2)?sommapariramo(R>succ):(1+sommapariramo(R->succ)));
}
/*Post: restituisce il numero di valori pari nel glicine*/
int sommapari(GLICINEPTR G)
{
if (G==NULL)
return 0;
else
return(sommapariramo(G->ramo)+sommapari(G->next));
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2007/2008
Scarica

LEZ_Secondo_esonero - TWiki