• Non ci sono risultati.

Università degli Studi di Udine Corsi di laurea in Ing. Elettronica e Ing. Gestionale Fondamenti di programmazione 17 novembre 2017 - 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 17 novembre 2017 - Prova intermedia"

Copied!
5
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ing. Elettronica e Ing. Gestionale

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

Esercizio 1 (2 punti)

Cosa stampa il seguente frammento di codice?

char s[10];

strcpy (s, "testo");

s[strlen(s)-2] = '\0';

printf ("%s", s);

[X] tes [ ] test [ ] testo

[ ] testo seguito da un carattere casuale [ ] tes

[ ] test [ ] testo

[ ] testo seguito da un carattere casuale

Esercizio 2 (4 punti)

La seguente funzione cerca in una matrice di interi positivi

int m[5][10]

una coppia di celle adiacenti adiacenti, in orizzontale, contenenti il medesimo valore. Si assuma che nella matrice possa esserci al massimo una coppia di elementi che soddisfi tale condizione. La funzione deve restituire il valore contenuto in tali celle o -1, se tale coppia non esiste.

Si completi la funzione.

int cerca_coppia (int m____________) {

int i, j;

for (i = 0; i < 5; i++) for (j = 0; j < 9; j++)

if (________________________) return _______;

return ______;

}

int cerca_coppia (int m[5][10]) {

int i, j;

for (i = 0; i < 5; i++) for (j = 0; j < 9; j++) if (m[i][j] == m[i][j+1]) return m[i][j];

return -1;

}

Esercizio 3 (2 punti)

Considerando un’architettura da 32 bit, quanti byte occupano i seguenti dati?

0 _____________ 4

"0" _____________ 2

'0' _____________ 1

'\0' _____________ 1

"0\n" _____________ 3

(2)

Esercizio 4 (4 punti)

Si completi la funzione void swap_vettori (int v1[], int v2[], int dim) che scambia il contenuto dei due vettori passati come argomento, entrambi della medesima dimensione dim.

void swap_vettori (int v1[], int v2[], int dim) {

int i;

for (i = 0; i < ________; i++) swap_int (___________________);

return;

}

void swap_int (____________________) {

int t;

t = _______;

*p_a = ________;

*p_b = ________;

return;

}

void swap_vettori (int v1[], int v2[], int dim) {

int i;

for (i = 0; i < dim; i++) swap_int (&v1[i], &v2[i]);

return;

}

void swap_int (int *p_a, int *p_b) {

int t;

t = *p_a;

*p_a = *p_b;

*p_b = t;

return;

}

(3)

Esercizio 5 (4 punti)

Un vettore di numeri reali contiene i tassi di interesse (percentuali) di un periodo di dieci anni, uno per anno.

Il calcolo dell’interesse composto di una somma richiede che per ogni anno venga calcolato l’importo disponibile all’inizio dell’anno, comprensivo degli interessi accumulati negli anni precedenti, e a tale importo venga applicato il tasso di interesse dell’anno considerato. Il valore risultante sarà l’importo di partenza per l’anno successivo.

Per esempio, se il vettore contiene i valori { 2.5, 2.3, 1.2, 0.9, 1.7, 2.2, 2.0, 1.8, 1.6, 1.1 }, l’importo iniziale (depositato all’inizio del primo anno) è pari a 100.00 euro e il numero di anni da considerare è 3, l’importo finale sarà 106.1158, ottenuto da {[100 * (1+2.5/100)] * (1+2.3/100)} * (1+1.2/100).

La funzione double importo_finale (double tassi[], double importo_iniziale, int anni) riportata nel seguito, che dovrebbe calcolare l’importo finale applicando l’interesse composto all’importo iniziale per il numero di anni e per i tassi di interesse passati come argomenti, contiene diversi errori. Li si evidenzino e li si correggano.

double importo_finale (double tassi[]; double importo_iniziale; int anni) {

double capitale;

int i;

importo_iniziale = capitale;

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

capitale = importo_iniziale * (1 + tassi[i] / 100);

return importo_finale;

}

double importo_finale (double tassi[]; double importo_iniziale; int anni) {

double capitale;

int i;

importo_iniziale = capitale;

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

capitale = importo_iniziale * (1 + tassi[i] / 100);

return importo_finale;

}

/* versione completa corretta: */

double importo_finale (double tassi[], double importo_iniziale, int anni) {

double capitale;

int i;

capitale = importo_iniziale;

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

capitale = capitale * (1 + tassi[i] / 100);

return capitale;

}

(4)

Esercizio 6 (2 punti)

Alle variabili q ed r devono essere assegnati, rispattivamente, quoziente e resto della divisione intera tra le variabili intere a e b. Indicare quale delle seguenti è la coppia di istruzioni corrette.

[ ] q=a%(--b); r=a/(++b);

[ ] q=a%(++b); r=a/(--b);

[ ] q=a%b; r=a/b;

[ ] q=a/b; r=a%b;

[ ] q=a/b; r=b/a;

[ ] q=a%b; r=b%a;

[ ] q=a%(--b); r=a/(++b);

[ ] q=a%(++b); r=a/(--b);

[ ] q=a%b; r=a/b;

[X] q=a/b; r=a%b;

[ ] q=a/b; r=b/a;

[ ] q=a%b; r=b%a;

Esercizio 7 (4 punti)

Si consideri una stringa s contenente "3022". Indicare quale/i tra i seguenti frammenti di codice scrive nella variabile x il valore rappresentato dalla stringa s.

[X] x = atoi(s);

[ ] atoi(s) = x;

[X] sscanf(s, "%d", &x);

[ ] sscanf(x, "%d", &s);

[ ] x = (int)s;

[X] x=0; i=0; while(*(s+i)!='\0') x=x*10+*(s+i++)-'0';

[ ] x = atoi(s);

[ ] atoi(s) = x;

[ ] sscanf(s, "%d", &x);

[ ] sscanf(x, "%d", &s);

[ ] x=(int)s;

[ ] x=0; i=0; while(*(s+i)!='\0') x=x*10+*(s+i++)-'0';

(5)

Esercizio 8 (8 punti)

Una stringa contiene un testo in cui alcune lettere dell’alfabeto sono state sostituite da cifre numeriche. Per esempio:

"TE5T0 D1 PR0V4"

Si scriva una funzione che riceva in ingresso una stringa siffatta e restituisca, come valore di ritorno, il numero intero rappresentato dalle sole cifre numeriche presenti nella stringa. Nell’esempio, la funzione deve restituire il valore 50104 (ottenuto estraendo le cifre evidenziate "TE5T0 D1 PR0V4" e calcolando il valore da esse rappresentato).

int valore_cifre_immerse (char s[]) {

int i = 0, j = 0;

char temp[21]; /* il massimo numero intero rappresentabile su 64 bit ha 20 cifre */

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

if (s[i] >= '0' && s[i] <= '9') // facoltativo: && j < 20 {

temp[j] = s[i];

j++;

} i++;

}

temp[j] = '\0';

return atoi (temp);

}

Riferimenti

Documenti correlati

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

La funzione deve riempire le righe della matrice secondo lo schema sopra riportato e restituire, in un’apposita struttura, il numero di righe riempite e la loro lunghezza (cioè

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

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