• Non ci sono risultati.

Matricola ____________________________ Nome ____________________________ Cognome ____________________________ Aula ____ Fila (dalla cattedra) ____ Posto (dalla porta) _____

N/A
N/A
Protected

Academic year: 2021

Condividi "Matricola ____________________________ Nome ____________________________ Cognome ____________________________ Aula ____ Fila (dalla cattedra) ____ Posto (dalla porta) _____"

Copied!
5
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ing. Elettronica / Gestionale Fondamenti di programmazione / Inform. 1 23 novembre 2012 - Prova intermedia

Matricola ____________________________

Nome ____________________________

Cognome ____________________________

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

Esercizio 1 (8 punti)

Un deposito multipiano per autoveicoli è rappresentato dal vettore tridimensionale così definito (si assumano già definite le costanti intere LMAXTARGA, NPIANI, NFILE_PER_PIANO, NPOSTI_PER_FILA):

struct tipo_posto {

unsigned char libero;

char targa [LMAXTARGA];

};

struct tipo_posto deposito

[NPIANI][NFILE_PER_PIANO][NPOSTI_PER_FILA];

Si scriva la funzione piano_liberabile che riceve in ingresso il vettore rappresentante il deposito e che restituisce l’indice del primo piano (partendo dal piano terra, di indice zero) che è possibile liberare, cioè il cui numero di veicoli è minore o uguale alla somma dei posti liberi negli altri piani. Se nessun piano risulta liberabile, la funzione deve restituire -1.

int piano_liberabile

(struct tipo_posto deposito

[NPIANI][NFILE_PER_PIANO][NPOSTI_PER_FILA]) {

int i, n_liberi_totali, n_liberi_nel_piano;

n_liberi_totali = 0;

for (i = 0; i < NPIANI; i++) n_liberi_totali +=

posti_liberi_nel_piano (deposito, i);

for (i = 0; i < NPIANI; i++) {

n_liberi_nel_piano =

posti_liberi_nel_piano (deposito, i);

if (NFILE_PER_PIANO * NPOSTI_PER_FILA - n_liberi_nel_piano <= n_liberi_totali - n_liberi_nel_piano)

return i;

}

return -1;

}

int posti_liberi_nel_piano

(struct tipo_posto deposito

[NPIANI][NFILE_PER_PIANO][NPOSTI_PER_FILA], int piano) {

int contatore, i, j;

contatore = 0;

for (i = 0; i < NFILE_PER_PIANO; i++) for (j = 0; j < NPOSTI_PER_FILA; j++) if (deposito[piano][i][j].libero) contatore++;

return contatore;

}

(2)

Esercizio 2 (2 punti)

Si consideri la seguente funzione:

int op (int *p) {

(*p) += 1;

return 2 * (*p);

}

Date due variabili intere n e m, quale/i delle seguenti espressioni è/sono equivalente/i a m = op(&n); ?

[ ] m = ++n + ++n;

[ ] m = n++ + n++;

[ ] m = 2 * (n+1);

[X] m = 2 * ++n;

[ ] m = 2 * n++;

[ ] m = (n+1) + (n+1);

Esercizio 3 (5 punti)

Si consideri un programma per gestire dei cinema multisala. Ogni cinema multisala dispone al massimo di 12 sale, tutte di capacità differente ma mai superiore a 200 posti disposti su un massimo di dieci file da massimo venti posti ciascuna.

In ciascuna sala viene proiettato un solo film per un numero massimo di cinque proiezioni.

Si completi la definizione della struttura dati sotto riportata che rappresenta uno di tali cinema multisala in un dato giorno. Tale struttura contiene il numero di sale effettivamente presenti e, per ciascuna sala, il numero di posti, il titolo del film (massimo 40 caratteri) e la sequenza di orari (ore e minuti) dell’inizio delle proiezioni. Per ciascun posto è rappresentato, per ciascuna delle proiezioni, l’informazione “libero”, “prenotato” o “venduto” mediante le lettere ‘L’, ‘P’

e ‘V’, rispettivamente, in una stringa lunga al massimo cinque caratteri (uno per proiezione: per esempio in una sala che prevede quattro proiezioni l’occupazione di un posto può essere rappresentata dalla stringa “LVLP”).

struct tipo_orario {

int ora;

int minuti;

};

struct tipo_proiezioni {

___________________ /* titolo del film */

___________________ /* numero di proiezioni */

___________________ /* orari */

};

struct tipo_posto {

char stato______; /* occupazione del posto */

};

struct tipo_sala {

int n_file;

int n_posti_per_fila;

__________________________________ /* posti */

__________________________________ /* proiezioni */

};

struct tipo_cinema {

_________________________

_________________________

};

(3)

struct tipo_orario {

int ora;

int minuti;

};

struct tipo_proiezioni {

char titolo[41]; /* titolo del film */

int n_proiezioni; /* numero di proiezioni */

struct tipo_orario orario[5]; /* orari */

};

struct tipo_posto {

char stato[6]; /* occupazione del posto */

};

struct tipo_sala {

int n_file;

int n_posti_per_fila;

struct tipo_posto posto[10][20]; /* posti */

struct tipo_proiezioni proiezione; /* proiezioni */

};

struct tipo_cinema {

int n_sale;

struct tipo_sala sala[12];

};

Esercizio 4 (6 punti)

Una sequenza (di lunghezza massima 100) di numeri interi positivi scritti in basi diverse (comprese tra 2 e 16) è rappresentata da stringhe ASCII. La struttura che le memorizza è la seguente:

struct numero {

int base;

char rappr[64];

};

struct sequenza {

int lunghezza;

struct numero num[100];

};

Si completino le seguente funzioni, che permettono di calcolare la somma dei valori della sequenza.

int valore_cifra (char cifra) {

if (_____________________________) return cifra - '0';

else

return toupper (cifra) ________________;

}

int calcola_valore (struct numero num) {

int i, valore = 0;

for (____________________________________) valore = valore * ____________ + _____________________________;

return valore;

}

calcola_media (struct sequenza seq) {

int i, somma = 0;

for (_________________________________) somma += ______________________________;

return somma / (double) i;

}

(4)

int valore_cifra (char cifra) {

if (cifra >= '0' && cifra <= '9') return cifra - '0';

else

return toupper (cifra) - 'A' + 10;

}

int calcola_valore (struct numero num) {

int i, valore = 0;

for (i = 0; num.rappr[i] != '\0'; i++) valore = valore * num.base +

valore_cifra (num.rappr[i]);

return valore;

}

double calcola_media (struct sequenza seq) {

int i, somma = 0;

for (i = 0; i < seq.lunghezza; i++) somma += calcola_valore (seq.num[i]);

return somma / (double) i;

}

Esercizio 5 (4 punti)

La seguente funzione rappresenta una delle possibili implementazioni della funzione di libreria strncmp, che confronta due stringhe per un massimo di n caratteri. Alcune righe del codice, però, sono riportate in più varianti contenenti errori lessicali, sintattici e semantici. Per ciascun gruppo di alternative si indichi la riga corretta.

CORRETTA int mystrncmp (char s[]; char t[]; int n) [ ] int mystrncmp (char *s[], char *t[], int n) [ ] int mystrncmp (char *s, char *t, int n) [X]

int mystrncmp (char *s; char *t; int n) [ ] {

int i = 0;

while (i<n || s[i]!='\0' || t[i]!='\0') [ ] while (i<n && s[i]!='\0' && t[i]!='\0') [X]

while (i<n && (s[i]!='\0' || t[i]!='\0')) [ ] {

if (s[i] <> t[i]) [ ]

if (s[i] = t[i]) [ ]

if (s[i] == t[i]) [ ]

if (s[i] != t[i]) [X]

return t[i]-s[i]; [X]

return t-s; [ ]

return i; [ ]

return s[i]; [ ]

return t[i]; [ ]

i+1; [ ]

i += 1; [X]

i-1; [ ]

--i; [ ]

}

(5)

if (i >= n) return 0;

else if (s[i] = '\0') [ ]

else if (s[i] > '\0') [ ]

else if (s[i] == '\0') [X]

else if (s[i] < '\0') [ ]

return -1;

else

return 1;

}

int mystrncmp (char s[], char t[], int n) {

int i = 0;

while (i<n && s[i]!='\0' && t[i]!='\0') {

if (s[i] != t[i]) return t[i]-s[i];

i++;

}

if (i >= n) return 0;

else if (s[i] == '\0') return -1;

else

return 1;

}

Esercizio 6 (2 punti)

Completare l’istruzione di lettura da tastiera:

int x; double y; char z[5];

scanf ("%lf %c %d", _____, ____0__, ___);

z[1] = '\0';

int x; double y; char z[5];

scanf ("%lf %c %d", &y, &z[0],&x);

z[1] = '\0';

Esercizio 7 (3 punti)

Cosa stampa il seguente frammento di codice?

int i, l; char s[6];

strcpy (s, "prova");

for (i=l=strlen(s)/2; i>0; i--, l++) s[i]=s[l];

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

_______________________________

R.: pvova

Riferimenti

Documenti correlati

Per ciascun posto è rappresentato, per ciascuna delle proiezioni, l’informazione “libero”, “prenotato” o “venduto” mediante le lettere ‘L’, ‘P’ e ‘V’,

Per ciascun posto è rappresentato, per ciascuna delle proiezioni, l’informazione “libero”, “prenotato” o “venduto” mediante le lettere ‘L’, ‘P’ e ‘V’,

Il numero di bit rappresentati dalla stringa è fisso (l’eventuale riporto a sinistra della prima cifra va

La funzione righe_uguali_in_matrice restituisce 1 se la matrice passata come argomento contiene almeno due righe uguali e -1 altrimenti. La

Il numero di bit rappresentati dalla stringa è fisso (l’eventuale riporto a sinistra della prima cifra va ignorato).. La

Il numero di bit rappresentati dalla stringa è fisso (l’eventuale riporto a sinistra della prima cifra va

Ogni quadrato può essere rappresentato dalle coordinate della cella in alto a sinistra (la più vicina a quella con coordinate 0, 0) e dalla lunghezza del lato. La seguente

Ogni quadrato può essere rappresentato dalle coordinate della cella in alto a sinistra (la più vicina a quella con coordinate 0, 0) e dalla lunghezza del lato.. La seguente