Università degli Studi di Udine
Corsi di laurea in Ing. Elettronica Gestionale Fondamenti di programmazione
16 novembre 2018 - Prova intermedia
Matricola ____________________________
Nome ____________________________
Cognome ____________________________
Aula ____ Fila (dalla cattedra) ____ Posto (dalla porta) ___
Esercizio 1 (5 punti)
Si scriva la funzione int quanti_divisibili (int v[], int dim, int divisore) che restituisce il numero di valori contenuti nel vettore v[] che sono divisibili per divisore.
int quanti_divisibili (int v[], int dim, int divisore) {
int i, contatore;
contatore = 0;
for (i = 0; i < dim); i++) {
if (v[i] % divisore == 0) contatore++;
}
return contatore;
}
Esercizio 2 (5 punti)
Il vettore int quadrati[N] (dove N è una costante predefinita) contiene i primi N quadrati perfetti a partire da 4. Un secondo vettore, di nome valori, la cui dimensione è contenuta nella variabile n_valori, contiene un insieme di numeri interi. Si scriva la funzione
conta_divisibili (int quadrati[], int valori[], int n_valori, int contatori[]) che scrive in ciascun elemento del vettore contatori (anch’esso di dimensione N) quanti elementi del vettore valori sono divisibili per il quadrato presente nella corrispondente posizione del vettore quadrati.
Per esempio, se il vettore quadrati contiene i valori { 4, 9, 16, 25, 36 } e il vettore valori { 4, 32, 8, 45 } (e quindi n_valori vale 4), al termine della funzione il vettore contatori dovrà contenere { 3, 1, 1, 0, 0 }, in quanto 3 valori sono divisibili per 4 (indice 0), 1 valore è divisibile per 9 (indice 1), 1 valore è divisibile per 16 (indice 2), nessun valore è divisibile per 25 (indice 3), ecc.
void conta_divisibili (int quadrati[], int valori[], int n_valori, int contatori[]) {
int i;
for (i = 0; i < N; i++)
contatori[i] = quanti_divisibili (valori, n_valori, quadrati[i]);
return;
}
Esercizio 3 (4 punti)
La seguente funzione esegue una ricerca lineare in un vettore di stringhe per convertire il nome di un giorno della settimana in un numero secondo la seguente corrispondenza: “lunedì” → 1, “martedì” → 2, …, “sabato” → 6, “domenica” → 7. La funzione deve restituire -1 se il nome del giorno è errato (non presente nel vettore). La si completi.
int converti_giorno_da_nome_a_numero (char nome_giorno[]) {
char nomi_giorni[8][12] = { "", "lunedi", "martedi", "mercoledi", "giovedi", "venerdi", "sabato", "domenica" };
int i = 1;
while (i < 8) {
if (strcmp (nome_giorno, nomi_giorni[i]) == 0) return i;
i++;
}
return -1;
}
Esercizio 4 (3 punti)
Cosa stampa il seguente segmento di codice?
int d; char s[10];
d = 13; strcpy (s, "stringa\n");
printf ("%d %d %d %d %d %c",
d/6, d%6, d/26, d%26, strlen(s), s[5]);
Esercizio 5 (3 punti)
char s[10], ch1, ch2;
printf ("inserisci i dati >");
ch1 = getchar();
scanf ("%s", s);
ch2 = getchar();
printf ("|%c| |%s| |%c|", ch1, s, ch2);
L’esecuzione del segmento di codice sopra riportato stampa la richiesta dei dati di ingresso (“inserisci i dati >”) a cui l’utente ha risposto inserendo “300 200 300” (si veda l’esempio di seguito). Cosa avrà stampato in uscita il programma?
inserisci i dati >300 200 300
Esercizio 6 (2 punti)
Scrivere la dimensione in byte delle seguenti costanti e variabili:
char ch ____1 float x ____4 '\0' ____1 char s[2] ____2
'1' ____1
"01" ____3
"1" ____2
"" ____1
Esercizio 7 (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 8 (2 punti)
Un programmatore distratto doveva scrivere
“if (a == O)” (“o” maiuscola) e invece ha scritto
“if (a = 0)” (“zero”, con un solo uguale):
a = 5;
if (a = 0) b = a++;
Che valori assumono, di conseguenza, le variabili a e b al termine dell’esecuzione di questo frammento di codice?
[ ] 1 e 0 [ ] entrambe 2
[X] a=0 e b un valore casuale in quanto non inizializzata
[ ] 6 e 5 [ ] entrambe 6
Esercizio 9 (4 punti)
Si scriva una funzione che riceva come argomento by reference una data (in forma numerica: giorno, mese e anno) e la modifichi nel primo gennaio dell’anno successivo. Per esempio, se la data ricevuta è { 16, 11, 2018 }, essa deve essere modificata in { 1, 1, 2019 }.
void modifica_data (int *pg, int *pm, int *pa) {
*pg = 1;
*pm = 1;
*pa = *pa + 1 /* oppure (*pa)++; */
return;
}
Risposta:
2 1 0 13 8 g
Risposta:
|3| |0| | |