Fondamenti di Informatica CdL in Ingegneria Gestionale a.a. 2009/2010 Docente: Andrea Prati Esame del 3 febbraio 2010 Esercizio 1 Vettori Sia data un vettore (array monodimensionale) di interi: int VETT[N]; con N inserito dall utente (e comunque minore o uguale a 100). Scrivere un programma in C che per prima cosa legga il valore di N, controllando che sia positivo e minore o uguale a 100. Quindi devono essere letti N valori interi (positivi o negativi) da inserire come elementi di VETT. Tali valori devono essere alternativamente divisibili per 3 e multipli di 5 (iniziando da un numero divisibile per 3). Ad esempio, per N=7 un vettore valido è: 3 10-6 15 15-10 9 Una volta letto il vettore, si calcoli la somma degli elementi di posizione pari e la somma degli elementi di posizione dispari. Si visualizzi quindi la differenza in valore assoluto tra le due somme. Nell esempio sopra riportato, la somma degli elementi di posizione pari è 21=3+(-6)+15+9, quella di posizione dispari è 15=10+15+(- 10). Il valore visualizzato è quindi 6= 21-15 Esercizio 2 Funzioni su stringhe Si scriva in C una funzione con il seguente prototipo: int fondistringhe (char P[], char Q[], char S[]); La funzione deve fondere le due stringhe P e Q nella stringa destinazione S. Nella fusione in S si riporta prima il carattere di P (P[i]) e poi quello di Q (Q[i]) se P[i] è maggiore di Q[i], prima Q poi P se invece è minore o uguale. Nel caso una stringa termini prima, i restanti caratteri dell altra devono essere copiati in S. Ogni volta che viene messo prima P di Q si incrementa un contatore di 1, ogni volta che Q viene messo prima di P, il contatore viene decrementato. Quando sono rimasti solo caratteri di una stringa il contatore non viene modificato. La funzione riporta il valore finale del contatore. Esempi: P Q S Val. ritornato cavallo "distinto" dciavstalinlntoo -3 mare "ciao" mciaraoe 0 tre "ciao" tcrieao 3 marea "vai" vmaariea -1-1 -1 +1-1 +1-1 -1 = -3 +1-1 +1-1 = 0 +1 +1 +1 = 3-1 -1 +1 = -1
Esercizio 3 Visibilità Verificare che il seguente programma C non contenga errori e imprecisioni (se li contiene indicare dove e perchè). Per le istruzioni prive di errori indicare cosa viene visualizzato dai vari printf del programma: main() { int a=9, b, c; a = b+7; a=3; b=8; c=--a + b--; { int a=8, c=7; a=(b==c)*(a==++b)*5; { int b=a, c=0; a=c*b+(c++)*a;
Esercizio 4 Record Siano date le seguenti definizioni: #define NORARI 4 #define NSETTIMANA 5 #define NIMPEGNI 5 typedef enum {Alta=1, Media=2, Bassa=3 TipoPriorita; typedef struct { int IDImpegno; char Descrizione[80]; TipoPriorita Priorita; TipoImpegno; typedef struct { int Occupato; int IDImpegno; int Personale; TipoAgenda; TipoImpegno Impegni[NIMPEGNI] = <inizializzazione>; TipoAgenda Agenda[NORARI][NSETTIMANA] = <inizializzazione>; dove i vettori Agenda e Impegni sono inizializzati e quindi non occorre acquisirli da input. Esempio Impegni IDImpegno Descrizione Priorita 0 1 Riunione Media 1 2 Conference call Alta 2 3 Incontro capo Alta 3 4 Incontro genitori Bassa 4 5 Telefonata Bassa Agenda (righe = orario diviso in 4 fascie, colonne = giorno della settimana) 0 1 2 3 4 0 IDImpegno=5 1 IDImpegno=2 2 IDImpegno=3 IDImpegno=5 Personale=1 3 IDImpegno=4 Personale=1 IDImpegno=3 IDImpegno=2
Nell Agenda, Occupato indica se quell orario di quel giorno è occupato (se è 0 indica non occupato e quindi IDImpegno e Personale non hanno importanza punto interrogativo nell esempio). Se invece Occupato è a 1, IDImpegno indica il corrispondente impegno del vettore Impegni, e Personale indica se l impegno è personale (=1) o di lavoro (=0). Ad esempio, Agenda[3][1] è occupato da un incontro genitori di tipo personale. 1) Elencare (stampare a video) tutti i giorni della settimana (colonne della matrice Agenda) in cui c è almeno un impegno personale. Nell esempio sono il giorno 1 e 3. 2) Elencare (stampare a video) tutti i giorni della settimana (colonne della matrice Agenda) in cui c è almeno un impegno che dura almeno due fasce orarie consecutive. ATTENZIONE: l impegno deve essere lo stesso, cioè stesso IDImpegno. Quindi nell esempio i giorni 0 e 2 vanno bene (giorno 0: nelle fasce consecutive 0 e 1; giorno 2: IDImpegno=3 nelle fasce consecutive 2 e 3), mentre il giorno 3 non va bene!. 3) Elencare (stampare a video) la fascia oraria, il giorno della settimana e la descrizione di qualsiasi impegno con priorità Alta: Fascia Oraria Giorno Descrizione 1 1 Conference call 2 2 Incontro capo 3 2 Incontro capo 3 4 Conference call 3.a facoltativo) Stampare a video la fascia oraria e il giorno della settimana non occupati che seguono in orario un impegno a bassa priorità. Nell esempio c è solo la fascia (riga) 3 del giorno (colonna) 3, che è non occupato e segue un impegno con IDImpegno=5 che è a bassa priorità Tempo a disposizione per la soluzione: 2 h e 30.
ESERCIZIO PER LA PROVA PRATICA IMPORTANTE: Questo foglio non va consegnato! In esso deve essere ricopiata la soluzione consegnata dell esercizio indicato di seguito. Esercizio 2 Funzioni su stringhe Si scriva in C una funzione con il seguente prototipo: int fondistringhe (char P[], char Q[], char S[]); La funzione deve fondere le due stringhe P e Q nella stringa destinazione S. Nella fusione in S si riporta prima il carattere di P (P[i]) e poi quello di Q (Q[i]) se P[i] è maggiore di Q[i], prima Q poi P se invece è minore o uguale. Nel caso una stringa termini prima, i restanti caratteri dell altra devono essere copiati in S. Ogni volta che viene messo prima P di Q si incrementa un contatore di 1, ogni volta che Q viene messo prima di P, il contatore viene decrementato. Quando sono rimasti solo caratteri di una stringa il contatore non viene modificato. La funzione riporta il valore finale del contatore. Esempi: P Q S Val. ritornato "distinto" cavallo cdaisvatillnoo -3 "ciao" mare cmaiareo 0 "ciao" tre ctiraeo 3 "vai" marea mvaairea -1-1 -1 +1-1 +1-1 -1 = -3 +1-1 +1-1 = 0 +1 +1 +1 = 0-1 -1 +1 = -1 COPIARE QUI SOTTO LA SOLUZIONE: