Università degli Studi di Udine
Corsi di laurea in Ing. Elettronica Gestionale Fondamenti di programmazione
18 novembre 2016 - Prova intermedia
Matricola ____________________________
Nome ____________________________
Cognome ____________________________
Aula ____ Fila (dalla cattedra) ____ Posto (dalla porta) ___
Esercizio 1 (4 punti)
Cosa stampa la seguente funzione?
void stampa (void) {
char s[16], t[16];
strcpy (s, "coleottero");
strcpy (t, "formica");
s[8] = t[8] = '\0';
printf ("%s--%s\n", s, t);
return;
}
Risposta: ___________________________
Esercizio 2 (6 punti)
Si scriva la funzione void
scorrimento_circolare (int v[], int dim) che riceve come argomenti un vettore di interi e la sua dimensione e fa scorrere in avanti tutti gli elementi del vettore di una posizione, spostando l’ultimo al posto del primo. Per esempio, se il vettore di ingresso ha 5 elementi e contiene i valori { 10, 13, 9, -4, 5 }, al termine dell’esecuzione della funzione dovrà contenere { 5, 10, 13, 9, -4 }.
Suggerimento: si copi in una variabile temporanea l’ultimo elemento del vettore, si copi poi ogni elemento del vettore nella posizione immediatamente seguente, si copi infine il valore salvato nella variabile temporanea nella prima posizione.
Esercizio 3 (2 punti)
Si completi il seguente frammento di codice che inizializza il primo e l’ultimo elemento di un vettore v di numeri reali di tipo double di lunghezza n al valore -1, e tutti gli altri elementi a un valore pari al proprio indice diviso per n. Quindi, per esempio, in un vettore di 20 elementi l’elemento di indice 15 sarà inizializzato a 0.75.
v[0] = v[n-1] = -1;
for (i = __________________________) v[i] = _________________________;
Esercizio 4 (3 punti)
La seguente funzione cerca un numero intero k, passato come argomento, in una matrice di interi int m[5][10], anch’essa passata come argomento. La funzione restituisce uno se il valore cercato è presente nella matrice e zero altrimenti. Se il valore è presente, nelle variabili passate by reference si troveranno i valori degli indici di riga e di colonna della cella dove l’elemento è stato trovato.
Si indichi quale, tra le seguenti, è la versione corretta della funzione.
int cerca_in_mat (int m[5][10],
int k, int *r, int *c) {
for (r = 0; r < 5; r++) for (c = 0; c < 10; c++) if (m[r][c] == k) return 1;
return 0;
}
int cerca_in_mat (int m[][],
int k, int *r, int *c) {
for (*r = 0; *r < 5; (*r)++) for (*c = 0; *c < 10; (*c)++) if (m[*r][*c] == k)
return 1;
return 0;
}
int cerca_in_mat (int m[5][10],
int k, int *pr, int *pc) {
for (*pr = 0; *pr < 5; (*pr)++) for (*pc = 0; *pc < 10; (*pc)++) if (m[*pr][*pc] == k)
return 1;
return 0;
}
int cerca_in_mat (int m[5][10],
int k, int *pr, int *pc) {
for (*pr = 0; *pr < 5; (*pr)++) for (*pc = 0; *pc < 10; (*pc)++) if (m[*pc][*pr] == k)
return 1;
return 0;
}
Esercizio 5 (3 punti)
Quanti byte occupano i seguenti dati?
char s[3]; _____________
"123"; _____________
"a" _____________
'\n' _____________
"testo\n" _____________
"" _____________
Esercizio 6 (6 punti)
Si completi la funzione int traduci_numero (char s[]) che riceve in ingresso una stringa rappresentante un numero intero le cui cifre sono scritte in forma testuale, separate da virgola e terminate da un punto, senza spazi, e restituisce il valore del numero rappresentato.
Per esempio, se la stringa s contiene
"sette,zero,nove.", la funzione restituisce il valore intero 709, se invece s contiene "sei,tre.", la funzione restituisce 63.
Suggerimento: l’algoritmo è identico a quello della lettura del numero da tastiera visto a lezione. In questo caso, però, il valore di ogni cifra va calcolato mediante una opportuna funzione di traduzione di una cifra dalla forma testuale al valore rappresentato (per esempio
"otto" deve restituire il valore 8).
int traduci_numero (char s[]) {
int i, j, risultato;
char temp[16];
i = 0; j = 0;
_____________________;
while (s[i] != '\0') {
if (s[i] != ',' && s[i] != '.') {
/* copia il carattere in temp */
_____________________
j++;
i++;
} else {
/* termina la stringa temp e aggiorna il risultato parziale */
_______________________;
risultato = _______________________;
j = 0;
i++;
} }
return risultato;
}
int traduci_cifra (char s[]) {
int i;
char cifre[10][8] = { "zero", "uno", "due", "tre", "quattro", "cinque",
"sei", "sette", "otto", "nove" };
for (_____________________________) if (________________________________) return i;
return -1; /* cifra non valida */
}
Esercizio 7 (2 punti)
Che risultato si ottiene al termine dell’esecuzione del seguente frammento di codice?
a = 4; b = 5;
c = a++ + --b;
[ ] c = 8 [ ] c = 9 [ ] c = 10
[ ] il risultato è indefinito
Esercizio 8 (4 punti)
Si calcoli il valore stampato dal seguente programma, che chiama la funzione f, ricorsiva. (Si considerino già presenti nel file sorgente le direttive al preprocessor per includere i necessari header file).
int main() {
printf ("%d", f (18, 24));
return EXIT_SUCCESS;
}
int f(int x, int y) {
if (y == 0) return x;
return f(y, x%y);
}
Risposta: ___________________________