1
LABORATORIO DI LINGUAGGI-A
Docente: András Horváth
Prova scritta del 18 dicembre 2003
COGNOME
NOME
MATRICOLA
Rispondere alle domande negli spazi sottostanti (o sul retro del foglio). Non è consentito usare altri
fogli.
1. (4 punti) Cosa stampa a video il seguente programma?
Soluzione ↓
#include<stdio.h>
void main(void)
{
int x[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int *y,*z;
printf("%d\n",x[1][2]);
printf("%d\n",x[0][0]+10);
y=&(x[0][0]);
z=y++;
printf("%d\n",*z);
z=++y;
printf("%d\n",*z);
printf("%d\n",*(x[2]+2));
}
2. (3 punti) Cosa stampa a video il seguente programma?
Soluzione ↓
#include<stdio.h>
int fun1(int a)
{
if(a>10) return a;
return fun1(2*a);
}
int fun2(int a)
{
if(a>10) return a;
return a+fun1(a);
}
void main(void)
{
printf("%d %d %d %d\n", fun1(12), fun2(12), fun2(5), fun1(2));
}
2
3. (3 punti) Cosa stampa a video il seguente programma?
Soluzione ↓
#include<stdio.h>
char* fun(char *str)
{
str+=2;
return str;
}
void main(void)
{
char s1[]="pianoforte",*s2;
s2=fun(s1);
printf("%s\n%s\n",s1,s2);
s2=fun(s1+2);
printf("%s\n",s2);
}
4. (2 punti) Scrivere delle espressioni logiche in C che corrispondono ai seguenti enunciati.
Soluzione ↓
a) il numero puntato da p è maggiore di 15
b) la somma di x e y è minore di z
c) 100 è divisore di x
b) x è minore di y ed è uguale a z
5. (4 punti) Riscrivere il seguente frammento di codice utilizzando due cicli annidati for.
int i1=9,i2=1;
do
{
i1--;
i2=0;
do
{
printf("x");
} while(++i2!=i1);
printf("\n");
i1--;
} while(i1>2);
3
6. (5 punti) Scrivere, dichiarando anche le variabili necessari, un frammento di codice che
a) apre (controllando il risultato) il file di nome “myfile” per aggiungere ulteriori righe al file
b) aggiunge al file le seguenti righe usando cicli annidati
1
2
3
4
5
2 3 4 5
4 6 8
6 9
8
c) chiude il file.
4
7. (5 punti) Scrivere una funzione che
• prende due numeri interi, r e c
• e restituisce un puntatore che punta ad un vettore di puntatori di tipo int.
Il puntatore restituito è usato per accedere agli elementi di una matrice rettangolare con r righe e c
colonne. Il j-esimo elemento della i-esima riga della matrice deve contenere i se i ≤ j altrimenti j. (La
funzione deve allocare memoria per la matrice.)
5
8.
(7 punti) La seguente struttura è definita per memorizzare una serie di numeri in ordine non
decrescente:
struct node {
int numero;
struct node *n
struct node *p;
};
Un esempio dell’uso della struttura è riportato nella seguente figura:
numero: 1
numero: 3
numero: 3
numero: 6
numero: 8
n
n
n
n
n:NULL
p:NULL
p
p
p
p
Scrivere una funzione che ha il seguente parametro
• un puntatore di tipo struct node che punta al primo elemento della lista
e stampa a video tutti i numeri della catena in ordine non crescente. La funziona non deve restituire
nessun valore.
6
Scrivere una funzione che ha i seguenti parametri
• un puntatore di tipo struct node che punta al primo elemento della lista,
• un numero di tipo int,
e crea un nuovo nodo per il numero passato e inserisce il nuovo nodo nella posizione giusta nella lista (la
lista passata alla funzione è in ordine non decrescente). La funzione deve restituire un puntatore di tipo
struct node che punta al primo elemento della lista.