• Non ci sono risultati.

Esercizio 1ac (7 punti) Il vettore

N/A
N/A
Protected

Academic year: 2021

Condividi "Esercizio 1ac (7 punti) Il vettore"

Copied!
13
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ing. Elettronica Gestionale Fondamenti di programmazione

22 novembre 2019 - Prova intermedia

Matricola ____________________________

Nome ____________________________

Cognome ____________________________

Aula ____ Fila (dalla cattedra) ____ Posto (dalla porta) ___

Esercizio 1ac (7 punti)

Il vettore int valori[N] (dove N è una costante predefinita > 0) contiene N valori interi, non ordinati. Si scriva la funzione int trova_massimi (int valori[], int indici_massimi[]) che scrive nel vettore indici_massimi gli indici del vettore valori dove sono presenti valori uguali al massimo del vettore. La funzione deve restituire il numero di indici trovati.

Per esempio, se N vale 6 e il vettore valori contiene { 5, -2, 5, 12, 3, 12 } , al termine della funzione il vettore indici_massimi dovrà contenere { 3, 5 } e la funzione dovrà restituire 2.

Suggerimento: per questo problema sono possibili due algoritmi.

1) Prima si cerca il valore massimo nel vettore dei valori e poi si scrivono nel secondo vettore gli indici in corrispondenza dei quali si trova un valore pari al massimo.

2) Si inizia salvando come indice del massimo corrente il primo indice (0) nel vettore degli indici. Per ogni altro indice nel vettore dei valori, se il valore corrispondente è uguale al massimo corrente si copia anche tale indice e si incrementa il numero di indici trovati, altrimenti, se il valore corrispondente è superiore al massimo corrente, si salva tale indice all’inizio del vettore degli indici e si riporta a uno il contatore degli indici trovati.

int trova_massimi (int valori[], int indici_massimi[]) {

int i, n_massimi;

/* salva il primo indice come massimo attuale */

indici_massimi[0] = 0;

n_massimi = 1;

for (i = 1; i < N; i++) {

if (valori[i] > valori[indici_massimi[0]]) {

indici_massimi[0] = i;

n_massimi = 1;

}

else if (valori[i] == valori[indici_massimi[0]]) {

indici_massimi[n_massimi] = i;

n_massimi++;

} }

return n_massimi;

}

Esercizio 1bd (7 punti)

Il vettore int valori[N] (dove N è una costante predefinita > 0) contiene N valori interi, non ordinati. Si scriva la funzione int trova_minimi (int valori[], int indici_minimi[]) che scrive nel vettore indici_minimi gli indici del vettore valori dove sono presenti valori uguali al minimo del vettore. La funzione deve restituire il numero di indici trovati.

Per esempio, se N vale 6 e il vettore valori contiene { 5, -2, -2, -3, 3, -3 } , al termine della funzione il vettore indici_minimi dovrà contenere { 3, 5 } e la funzione dovrà restituire 2.

Suggerimento: per questo problema sono possibili due algoritmi.

1) Prima si cerca il valore minimo nel vettore dei valori e poi si scrivono nel secondo vettore gli indici in corrispondenza dei quali si trova un valore pari al minimo.

2) Si inizia salvando come indice del minimo corrente il primo indice (0) nel vettore degli indici. Per ogni altro indice nel

vettore dei valori, se il valore corrispondente è uguale al minimo corrente si copia anche tale indice e si incrementa il

numero di indici trovati, altrimenti, se il valore corrispondente è inferiore al minimo corrente, si salva tale indice all’inizio

del vettore degli indici e si riporta a uno il contatore degli indici trovati.

(2)

int trova_minimi (int valori[], int indici_minimi[]) {

int i, n_minimi;

/* salva il primo indice come minimo attuale */

indici_minimi[0] = 0;

n_minimi = 1;

for (i = 1; i < N; i++) {

if (valori[i] < valori[indici_minimi[0]]) {

indici_minimi[0] = i;

n_minimi = 1;

}

else if (valori[i] == valori[indici_minimi[0]]) {

indici_minimi[n_minimi] = i;

n_minimi++;

} }

return n_minimi;

}

(3)

Esercizio 2a (3 punti)

Cosa stampa il seguente frammento di codice? Indicare con una X nella relativa casella la risposta ritenuta corretta.

j = 5;

while (--j > 0) {

for (i = 0; i < j+1; i++) printf ("*");

printf ("\n");

}

X

*****

****

***

**

*****

****

***

**

*

*

**

***

****

*

**

***

****

*****

□ Il programma non stampa nulla perché termina con errore (stackdump)

□ Il programma contiene degli errori sintattici e quindi non può essere compilato

Esercizio 2b (3 punti)

Cosa stampa il seguente frammento di codice? Indicare con una X nella relativa casella la risposta ritenuta corretta.

j = 5;

while (j-- > 0) {

for (i = 0; i < j+1; i++) printf ("*");

printf ("\n");

}

*****

****

***

**

X

*****

****

***

**

*

*

**

***

****

*

**

***

****

*****

□ Il programma non stampa nulla perché termina con errore (stackdump)

□ Il programma contiene degli errori sintattici e quindi non può essere compilato

Esercizio 2c (3 punti)

Cosa stampa il seguente frammento di codice? Indicare con una X nella relativa casella la risposta ritenuta corretta.

j = 0;

while (++j < 5) {

for (i = 0; i < j; i++) printf ("*");

printf ("\n");

}

(4)

*****

****

***

**

*****

****

***

**

*

X

*

**

***

****

*

**

***

****

*****

□ Il programma non stampa nulla perché termina con errore (stackdump)

□ Il programma contiene degli errori sintattici e quindi non può essere compilato

Esercizio 2d (3 punti)

Cosa stampa il seguente frammento di codice? Indicare con una X nella relativa casella la risposta ritenuta corretta.

j = 0;

while (j++ < 5) {

for (i = 0; i < j; i++) printf ("*");

printf ("\n");

}

*****

****

***

**

*****

****

***

**

*

*

**

***

****

X

*

**

***

****

*****

□ Il programma non stampa nulla perché termina con errore (stackdump)

□ Il programma contiene degli errori sintattici e quindi non può essere compilato

*****

****

***

**

*****

****

***

**

*

*

**

***

****

*

**

***

****

*****

□ Il programma non stampa nulla perché termina con errore (stackdump)

□ Il programma contiene degli errori sintattici e quindi

non può essere compilato

(5)

Esercizio 3ac (4 punti)

Come è noto, la funzione void strcat (char t[], char s[]) copia la stringa s al fondo della stringa t. Una possibile implementazione è riportata nel seguito. La si completi.

void strcat (char t[], char s[]) {

int i, j;

/* posizionati al fondo della stringa t */

i = 0;

while (t[i] != ____) ____;

/* copia il contenuto di s in t */

j = 0;

while (s[____] != ___) {

______ ; ______ ; ______ ; }

/* termina la stringa t */

t[i] = ______;

return;

}

void strcat (char t[], char s[]) {

int i, j;

/* posizionati al fondo della stringa t */

i = 0;

while (t[i] != '\0') i++;

/* copia il contenuto della stringa s nella stringa t */

j = 0;

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

t[i] = s[j];

i++;

j++;

}

/* termina la stringa t */

t[i] = '\0';

return;

}

Esercizio 3bd (4 punti)

Come è noto, la funzione void strcat (char s[], char t[]) copia la stringa t al fondo della stringa s. Una possibile implementazione è riportata nel seguito. La si completi.

void strcat (char s[], char t[]) {

int i, j;

/* posizionati al fondo della stringa s */

i = 0;

while (s[i] != ____) ____;

/* copia il contenuto di t in s */

j = 0;

while (t[____] != ___) {

______ ;

______ ;

(6)

______ ; }

/* termina la stringa s */

s[i] = ______;

return;

}

void strcat (char s[], char t[]) {

int i, j;

/* posizionati al fondo della stringa s */

i = 0;

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

/* copia il contenuto della stringa t nella stringa s */

j = 0;

while (t[j] != '\0') {

s[i] = t[j];

i++;

j++;

}

/* termina la stringa s */

s[i] = '\0';

return;

}

(7)

Esercizio 4a (2 punti)

Scrivere la dimensione in byte delle seguenti costanti e variabili:

char t ____

"0" ____

'0' ____

'\0' ____

char s[1] ____

char s[2] ____

"1" ____

"22" ____

char t 1

"0" 2

'0' 1

'\0' 1

char s[1] 1 char s[2] 2

"1" 2

"22" 3

Esercizio 4b (2 punti)

Scrivere la dimensione in byte delle seguenti costanti e variabili:

char s[1] ____

char s[2] ____

"1" ____

"22" ____

char t ____

"0" ____

'0' ____

'\0' ____

char s[1] 1 char s[2] 2

"1" 2

"22" 3

char t 1

"0" 2

'0' 1

'\0' 1

Esercizio 4c (2 punti)

Scrivere la dimensione in byte delle seguenti costanti e variabili:

char t ____

"0" ____

char s[1] ____

char s[2] ____

'0' ____

'\0' ____

"1" ____

"22" ____

char t 1

"0" 2 char s[1] 1 char s[2] 2

'0' 1

'\0' 1

"1" 2

"22" 3

Esercizio 4d (2 punti)

Scrivere la dimensione in byte delle seguenti costanti e variabili:

char s[1] ____

"1" ____

char s[2] ____

"22" ____

char t ____

'0' ____

'\0' ____

"0" ____

(8)

char s[1] 1

"1" 2 char s[2] 2

"22" 3

char t 1

'0' 1

'\0' 1

"0" 2

(9)

Esercizio 5a (2 punti)

Indicare quali delle seguenti istruzioni sono corrette.

[ ] char s[3] = "ciao";

[ ] char s[3] = '{ a, b, c }';

[X] char s[3] = { 'a', 'b', 'c' };

[ ] s = "abc";

[X] strcpy (s, "abc");

[ ] strcpy ("abc", s);

Esercizio 5b (2 punti)

Indicare quali delle seguenti istruzioni sono corrette.

[ ] s = "tes";

[ ] strcpy ("tes", s);

[X] strcpy (s, "tes");

[ ] char s[3] = "test";

[X] char s[3] = { 't', 'e', 's' };

[ ] char s[3] = '{ t, e, s }';

Esercizio 5c (2 punti)

Indicare quali delle seguenti istruzioni sono corrette.

[ ] char s[3] = "ciao";

[X] strcpy (s, "abc");

[ ] strcpy ("abc", s);

[ ] char s[3] = '{ a, b, c }';

[X] char s[3] = { 'a', 'b', 'c' };

[ ] s = "abc";

Esercizio 5d (2 punti)

Indicare quali delle seguenti istruzioni sono corrette.

[ ] strcpy ("tes", s);

[X] strcpy (s, "tes");

[ ] char s[3] = "test";

[X] char s[3] = { 't', 'e', 's' };

[ ] char s[3] = '{ t, e, s }';

[ ] s = "tes";

(10)

Esercizio 6a (3 punti)

char s1[10], s2[10], ch1, ch2;

ch1 = getchar();

scanf ("%s", s1);

ch2 = getchar();

scanf ("%s", s2);

printf (">%c< >%s< >%c< >%s<\n", ch1, s1, ch2, s2);

Scrivere cosa stampa il segmento di codice sopra riportato se nella finestra di comando viene inserita la frase:

un testo di prova

Esercizio 6b (3 punti)

char s1[10], s2[10], ch1, ch2;

ch1 = getchar();

scanf ("%s", s1);

ch2 = getchar();

scanf ("%s", s2);

printf (">%c< >%s< >%c< >%s<\n", ch1, s1, ch2, s2);

Scrivere cosa stampa il segmento di codice sopra riportato se nella finestra di comando viene inserita la frase:

ecco il testo

Esercizio 6c (3 punti)

char s1[10], s2[10], ch1, ch2;

ch1 = getchar();

scanf ("%s", s1);

ch2 = getchar();

scanf ("%s", s2);

printf (">%c< >%s< >%c< >%s<\n", ch1, s1, ch2, s2);

Scrivere cosa stampa il segmento di codice sopra riportato se nella finestra di comando viene inserita la frase:

test del programma

Esercizio 6d (3 punti)

char s1[10], s2[10], ch1, ch2;

ch1 = getchar();

scanf ("%s", s1);

ch2 = getchar();

scanf ("%s", s2);

printf (">%c< >%s< >%c< >%s<\n", ch1, s1, ch2, s2);

Scrivere cosa stampa il segmento di codice sopra riportato se nella finestra di comando viene inserita la frase:

prova di esecuzione

Risposta:

>u< >n< > < >testo<

Risposta:

>e< >cco< > < >il<

Risposta:

>t< >est< > < >del<

Risposta:

>p< >rova< > < >di<

(11)

Esercizio 7a (3 punti)

Cosa stampa il seguente segmento di codice?

int a = 3, b = 2, c, d;

double w = 3, x = 2, y, z;

c = a/b;

y = a/b;

d = w/x;

z = w/b;

printf ("%d %d %lf %lf\n", c, d, y, z);

Esercizio 7b (3 punti)

Cosa stampa il seguente segmento di codice?

int a = 5, b = 2, c, d;

double w = 5, x = 2, y, z;

c = a/b;

y = a/b;

d = w/x;

z = w/b;

printf ("%d %d %lf %lf\n", c, d, y, z);

Esercizio 7c (3 punti)

Cosa stampa il seguente segmento di codice?

int a = 7, b = 2, c, d;

double w = 7, x = 2, y, z;

c = a/b;

y = a/b;

d = w/x;

z = w/b;

printf ("%d %d %lf %lf\n", c, d, y, z);

Esercizio 7d (3 punti)

Cosa stampa il seguente segmento di codice?

int a = 1, b = 2, c, d;

double w = 1, x = 2, y, z;

c = a/b;

y = a/b;

d = w/x;

z = w/b;

printf ("%d %d %lf %lf\n", c, d, y, z);

Risposta:

1 1 1.0 1.5

Risposta:

2 2 2.0 2.5

Risposta:

3 3 3.0 3.5

Risposta:

0 0 0.0 0.5

(12)

Esercizio 8 (4 punti)

Un vettore di strutture di tipo struct persona (definita qui sotto) contiene i dati relativi a un certo numero di persone.

Si completi la funzione anno_piu_recente che calcola e restituisce l’anno più recente delle date di nascita presenti nel vettore.

struct data {

int giorno;

int mese;

int anno;

};

struct persona {

char nome[32];

char cognome [32];

struct data data_di_nascita;

};

int anno_piu_recente (struct persona persone[], int n_persone) {

int i, anno_max;

if (n_persone <= 0)

return -1; /* vettore vuoto */

/* inizializza il massimo con il primo anno nel vettore */

anno_max = ____________________________________;

for (____________________________________)

if (_____________________________________________) __________________________________________;

return ____________;

}

int anno_piu_recente (struct persona persone[], int n_persone) {

int i, anno_max;

if (n_persone <= 0)

return -1; /* vettore vuoto */

anno_max = persone[0].data_di_nascita.anno;

for (i = 1; i < n_persone; i++)

if (persone[i].data_di_nascita.anno > anno_max) anno_max = persone[i].data_di_nascita.anno;

return anno_max;

}

(13)

Esercizio 9a (2 punti) La seguente istruzione

while (-1);

[X] è un ciclo infinito [ ] non esegue nulla

[ ] contiene un errore sintattico [ ] contiene un errore lessicale [ ] è rifiutata dal compilatore

Esercizio 9b (2 punti) La seguente istruzione while (-1);

[ ] contiene un errore sintattico [ ] contiene un errore lessicale [ ] è rifiutata dal compilatore [X] è un ciclo infinito

[ ] non esegue nulla

Esercizio 9c (2 punti) La seguente istruzione

while (-1);

[ ] contiene un errore sintattico [ ] contiene un errore lessicale [X] è un ciclo infinito

[ ] non esegue nulla

[ ] è rifiutata dal compilatore

Esercizio 9d (2 punti) La seguente istruzione while (-1);

[ ] contiene un errore sintattico [ ] contiene un errore lessicale [ ] non esegue nulla

[X] è un ciclo infinito

[ ] è rifiutata dal compilatore

Riferimenti