• Non ci sono risultati.

Università degli Studi di Udine Corsi di laurea in Ing. Elettronica e Ing. Gestionale Fondamenti di programmazione 18 novembre 2016 - Prova intermedia

N/A
N/A
Protected

Academic year: 2021

Condividi "Università degli Studi di Udine Corsi di laurea in Ing. Elettronica e Ing. Gestionale Fondamenti di programmazione 18 novembre 2016 - Prova intermedia"

Copied!
10
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ing. Elettronica e Ing. Gestionale

Fondamenti di programmazione 18 novembre 2016 - Prova intermedia NOTA: nel seguito le risposte corrette e le note sono riportate in neretto.

Esercizio 1 (2 punti)

Si completi il seguente frammento di codice che inizializza tutti gli n elementi di un vettore v di numeri reali di tipo double ad un valore che rappresenti come frazione (da 0 a 1) la distanza tra la posizione dell’elemento stesso e la posizione dell’ultimo elemento del vettore. Quindi, per esempio, in un vettore di 20 elementi l’elemento di indice 19 sarà inizializzato a 0.0 (distanza nulla dall’ultimo), l’elemento di indice 0 sarà inizializzato a 0.95 (distanza 19 elementi, divisa per 20) e l’elemento di indice 9 sarà inizializzato a 0.5 (distanza 10 elementi, divisa per 20).

for (i = _____________________________) v[i] = _________________________;

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

v[i] = (n-i-1) / (double) n;

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] = _________________________;

v[0] = v[n-1] = -1;

for (i = 1; i < n-1; i++) v[i] = i / (double) n;

Esercizio 2 (2 punti)

Che risultato si ottiene al termine dell’esecuzione del seguente frammento di codice?

a = 2; b = 3;

c = a++ + --b;

[ ] il risultato è indefinito [X] c = 4

[ ] c = 5 [ ] c = 6

a = 4; b = 5;

c = a++ + --b;

[X] c = 8 [ ] c = 9 [ ] c = 10

[ ] il risultato è indefinito

(2)

a = 6; b = 7;

c = a-- + ++b;

[ ] il risultato è indefinito [ ] c = 12

[ ] c = 13 [X] c = 14

a = 8; b = 9;

c = a-- + ++b;

[ ] c = 16 [ ] c = 17 [X] c = 18

[ ] il risultato è indefinito

Esercizio 3 (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 (24, 36));

return EXIT_SUCCESS;

}

int f(int x, int y) {

if (y == 0) return x;

return f(y, x%y);

} 12

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);

} 6

(3)

int main() {

printf ("%d", f (27, 18));

return EXIT_SUCCESS;

}

int f(int x, int y) {

if (y == 0) return x;

return f(y, x%y);

} 9

int main() {

printf ("%d", f (16, 28));

return EXIT_SUCCESS;

}

int f(int x, int y) {

if (y == 0) return x;

return f(y, x%y);

} 4

Esercizio 4 (4 punti)

Cosa stampa la seguente funzione?

void stampa1 (void) {

char s[16], t[16];

strcpy (s, "aquila");

strcpy (t, "rinoceronte");

s[7] = t[7] = '\0';

printf ("%s--%s\n", s, t);

return;

}

aquila—rinocer

void stampa2 (void) {

char s[16], t[16];

strcpy (s, "coleottero");

strcpy (t, "formica");

s[8] = t[8] = '\0';

printf ("%s--%s\n", s, t);

return;

}

coleotte—formica

(4)

void stampa3 (void) {

char s[16], t[16];

strcpy (s, "serpente");

strcpy (t, "iguana");

s[7] = t[7] = '\0';

printf ("%s--%s\n", s, t);

return;

}

serpent—iguana

void stampa4 (void) {

char s[16], t[16];

strcpy (s, "rana");

strcpy (t, "delfino");

s[5] = t[5] = '\0';

printf ("%s--%s\n", s, t);

return;

}

rana--delfi

Esercizio 5 (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 *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;

}

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;

}

(5)

Esercizio 6 (3 punti)

Quanti byte occupano i seguenti dati?

"" _____________ 1

"a" _____________ 2

'\n' _____________ 1

char s[3]; _____________ 3

"123"; _____________ 4

"testo\n" _____________ 7

char s[3]; _____________ 3

"123"; _____________ 4

"a" _____________ 2

'\n' _____________ 1

"testo\n" _____________ 7

"" _____________ 1

char s[3]; _____________ 3

"123"; _____________ 4

"" _____________ 1

"testo\n" _____________ 7

"a" _____________ 2

'\n' _____________ 1

"123"; _____________ 4

"testo\n" _____________ 7 char s[3]; _____________ 3

"a" _____________ 2

"" _____________ 1

'\n' _____________ 1

Esercizio 7 (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 in inglese, separate da virgola e terminate da un punto, senza spazi, e restituisce il valore del numero rappresentato.

Per esempio, se la stringa s contiene "nine,zero,three.", la funzione restituisce il valore intero 903, se invece s contiene "four,two.", la funzione restituisce 42.

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 "seven" deve restituire il valore 7).

(6)

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", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

for (_____________________________) if (________________________________) return i;

return -1; /* cifra non valida */

}

(7)

int traduci_numero (char s[]) {

int i, j, risultato;

char temp[16];

i = 0; j = 0;

risultato = 0;

while (s[i] != '\0') {

if (s[i] != ',' && s[i] != '.') {

temp[j] = s[i];

j++;

i++;

} else {

temp[j] = '\0';

risultato = risultato * 10 + traduci_cifra (temp);

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 (i = 0; i < 10; i++)

if (strcmp (s, cifre[i]) == 0) return i;

return -1; /* cifra non valida */

}

NOTA: non bisogna MAI dimenticare che le stringhe sono vettori e per confrontarne il contenuto è necessario utilizzare la funzione strcmp della libreria standard!

(8)

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 */

}

(9)

int traduci_numero (char s[]) {

int i, j, risultato;

char temp[16];

i = 0; j = 0;

risultato = 0;

while (s[i] != '\0') {

if (s[i] != ',' && s[i] != '.') {

temp[j] = s[i];

j++;

i++;

} else {

temp[j] = '\0';

risultato = risultato * 10 + traduci_cifra (temp);

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 (i = 0; i < 10; i++)

if (strcmp (s, cifre[i]) == 0) return i;

return -1; /* cifra non valida */

}

NOTA: non bisogna MAI dimenticare che le stringhe sono vettori e per confrontarne il contenuto è necessario utilizzare la funzione strcmp della libreria standard!

(10)

Esercizio 8 (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.

void scorrimento_circolare (int v[], int dim) {

int i, j, temp;

temp = v[dim-1];

for (i = dim-2; i >= 0; i--) v[i+1] = v[i];

v[0] = temp;

return;

}

NOTA: se si progetta l’algoritmo provandone a mano l’esecuzione (come andrebbe sempre fatto), ci si accorge immediatamente che è necessario procedere a ritroso, altrimenti il primo valore viene copiato nel secondo prima che questo possa essere spostato nel terzo (e quindi perdendolo), e così via. Procedendo in avanti (da 0 a dim-2) si copierebbe quindi in tutto il vettore il primo valore.

Riferimenti

Documenti correlati

Poiché gli identificatori (numeri) delle tessere sono univoci e nella griglia è presente una sola posizione vuota, ogni mossa può semplicemente essere indicata

Successivamente, per ogni cifra del tentativo non ancora utilizzata si cerca lo stesso valore tra le cifre non ancora utilizzate del numero segreto e, se lo si trova,

Ogni elemento della matrice descrive una porzione quadrata di superficie (pari ad un numero di metri quadrati scritto nell’intestazione del file) mediante due

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome del file principale e il nome del file di backup e stampi sullo schermo i comandi per

Ora iniziate a progettare una funzione che riempia l’elemento di indice i del vettore, leggendo i valori dalla tastiera ed eseguendo alcuni controlli di correttezza dei dati

Suggerimento: si utilizzi una versione modificata dell’algoritmo bubblesort in cui lo scambio avviene se l’elemento corrente del vettore è dispari e quello successivo

Si scriva una funzione che riceva come argomenti il nome del file di equivalenze sopra descritto, il nome di un file di grandezze (con i punti interrogativi) e il nome di un file

Si scriva una funzione in linguaggio C che riceva come argomenti il puntatore a un file di testo nel formato sopra descritto (il file è quindi già stato aperto dalla funzione