PROVA SCRITTA DEL CORSO DI CORSO DI LAUREA IN INGEGNERIA BIOMEDICA ED ELETTRICA 9/6/2008 MOTIVARE IN MANIERA CHIARA LE SOLUZIONI PROPOSTE A CIASCUNO DEGLI ESERCIZI SVOLTI ESERCIZIO 1 (5 punti) Descrivere in pseudo-codice l algoritmo di conversione decimale-binario ed applicarlo per convertire in base 2 il valore 231 espresso in base 10. ESERCIZIO 2 (5 punti) Scrivere la tabella di verità della seguente funzione booleana F a quattro variabili A, B, C, D: F = AB + CA + ABC + DB + ABCD ESERCIZIO 3 (5 punti) Descrivere in modo chiaro e sintetico l architettura di Von Neumann ed il suo funzionamento base. ESERCIZIO 4 (4 punti) Definire i seguenti tipi di dato: Tipo tipo_studente costituito da due int matricola, voto_medio; Tipo vettore_studenti costituito da un vettore di max 50 variabili di tipo tipo_studente. ESERCIZIO 5 (10 punti) Definire ed implementare le seguenti funzioni: (5 punti) Funzione leggi_studenti, che, ricevendo in ingresso : o una variabile di tipo vettore_studenti chiamata studenti, o una stringa chiamata nome_file, legge, dal file indicato da nome_file, gruppi di due int e li memorizza sequenzialmente nelle componenti di studenti. Restituisce il numero di studenti letti; (5 punti) Funzione seleziona_studenti, che riceve in ingresso : o una variabile di tipo vettore_studenti, chiamata studenti, o il numero di studenti letti, o un intero voto_min stampa a video gli slot matricola e voto_medio della relativa componente di studenti tale che voto_min < voto_medio (si ricordi che voto_medio è uno slot della generica variabile i-esima di studenti). Restituisce il numero di studenti selezionati. ESERCIZIO 6 (4 punti) Scrivere un programma C che, utilizzando i tipi e le funzioni definite negli esercizi 4 e 5, legga un file input.txt contenente, in ogni linea, gruppi di due int descriventi degli studenti, e li memorizzi in una variabile di tipo vettore_studenti chiamata studenti. Ricevendo poi da tastiera un intero voto_min, stampi a video tutti quegli studenti il cui voto medio è strettamente maggiore di voto_min. Se nessuno studente è stato stampato, il programma termini scrivendo Mi dispiace, nessuno studente trovato.
Soluzione dell esercizio 1 Riportiamo lo pseudo-codice: Ingresso (Input): una sequenza di cifre decimali X (il numero da convertire) Uscita (Output): una sequenza di n cifre binarie (il numero convertito) bn-1.b0 i = 0; (operatore = : assegnazione) Ripeti Q = quoziente di X/2; bi = R; X = Q; i = i + 1; R = resto di X/2; Finché Q <> 0 Nota <> significa diverso da Per convertire 231: 231/2 =115, resto 1 115/2 = 57, resto 1 57/2 = 28, resto 1 28/2 = 14, resto 0 14/2= 7, resto 0 7/2 = 3, resto 1 3/2 = 1, resto 1 1/2 = 0, resto 1 L algoritmo termina in quanto Q==0. Quindi: Posizion 7 6 5 4 3 2 1 0 e Cifra 1 1 1 0 0 1 1 1 Da cui: 23110 = 111001112 L algoritmo viene introdotto a pag. 20 del Cap. 1, e scritto in forma algoritmica a pag. 21. Fondamenti di Informatica 9 Giugno 2008 2
Soluzione dell esercizio 2 F = AB + CA + ABC + DB + ABCD A B C D F 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 Soluzione dell esercizio 3. Vedi dispense, Cap. 2, pagg. 12-14 in particolare. Fondamenti di Informatica 9 Giugno 2008 3
Soluzione dell esercizio 4. typedef struct int matricola, voto_medio; tipo_studente; typedef tipo_studente vettore_studenti[50]; Soluzione dell esercizio 5 (1) int leggi_studenti(vettore_studenti studenti, char *nome_file) int numstudenti; int m,v; FILE *fp; fp=fopen(nomefile, r ); if(fp==null) return 0; numstudenti=0; while((feof(fp)!=0)&&(numstudenti<50)) fscanf(fp, %d %d,&m, &v) ; studenti[numstudenti].matricola=m ; studenti[numstudenti].voto_medio=v ; numstudenti++ ; fclose(fp); return numstudenti; (2) int seleziona_studenti(vettore_studenti studenti, int n, int voto_min) int i, numselezionati; numselezionati=0; for(i=0; i<n; i++) if(voto_min<studenti[i].voto_medio) printf( %d %d\n,studenti[i].matricola, studenti[i].voto_medio); numselezionati++; return numselezionati; Fondamenti di Informatica 9 Giugno 2008 4
Soluzione dell esercizio 6 /*Programma per la lettura di un vettore di studenti e la stampa degli studenti meritevoli */ #include <stdio.h> /*Qua si inseriscono le definizioni di tipo dell esercizio 4*/ /*Qua si inseriscono i prototipi delle funzioni dell esercizio 5*/ int main() vettore_studenti studenti; int numstudenti, voto_min, numselezionati; numstudenti=leggi_studenti(studenti, input.txt ); scanf( %d,&voto_min); numselezionati=seleziona_studenti(studenti,numstudenti,voto_min); if(numselezionati==0) printf( \nmi dispiace, nessuno studente trovato.\n ); return 0; /*Qua si inseriscono le implementazioni delle funzioni*/ Fondamenti di Informatica 9 Giugno 2008 5