Fondamenti di Informatica 2 della prova scritta del 28 Febbraio 2006 Esercizio 1 (4 punti) Date le seguenti variabili int A[] = 2,3,7,-2,5,8,-4; int N = 7; int min = 3; int i; Scrivere la porzione di codice che scandisce tutto l array A di dimensione N e stampa a video solo i valori maggiori o al più uguali a min, for(i=0;i<n;i++) if(a[i]>=min) printf( %d\n,a[i]); Esercizio 2 (7 punti) Scrivere programma che legge da tastiera un elenco di dati relativi a modelli di telefoni cellulari e li inserisce in un file di testo. Ciascun modello di telefono sia descritto da tre informazioni: Marca, Modello e Prezzo. Il programma deve richiedere all utente il nome del file e il numero di modelli di telefoni cellulari che si intende inserire. (5 punti) Modificare il programma in modo tale che il nome del file e il numero di modelli di telefoni cellulari vengano forniti come argomenti sulla linea di comando. (2 punti) #include <stdio.h> #include <stdlib.h> typedef char Stringa[50]; main() Stringa Marca; Stringa Modello; Stringa Nomefile; float Prezzo; int i,numtelefoni; main(int argc, char **argv) Stringa Marca; Stringa Modello; Stringa Nomefile; float Prezzo; int i,numtelefoni; printf("digitare il nome dei file "); gets(nomefile); printf("inserire il numero di modelli:"); scanf( %d, &NumTelefoni); fp = fopen(nomefile, w ); for(i=0;i<numtelefoni;i++) scanf( %s%s%f,marca,modello, &Prezzo); fprintf(fp,"%s\t%s\t%f", Marca,Modello,Prezzo); NumTelefonii = atoi(argv[2]); fp = fopen(argv[1], w ); for(i=0;i<numtelefoni;i++) scanf( %s%s%f,marca,modello, &Prezzo); fprintf(fp,"%s\t%s\t%f", Marca,Modello,Prezzo); fclose(fp); fclose(fp); Fondamenti di Informatica 2 Prova Scritta del 28 Febbraio 2006 1
Esercizio 3 (7 punti) Definire una struttura dati per rappresentare un elenco di Persone, dove ciascuna persona è rappresentata dagli attributi Nome, Cognome, Età. (3 punti) Si supponga che la struttura dati contenga già memorizzato un elenco di persone. Scrivere una procedura che prende in ingresso l elenco di persone e mostri a video il nome e il cognome delle persone più anziane (4 punti) typedef char stringa[50]; stringa Nome; stringa Cognome; int Età; Persoma; Persona P[100]: int NumPersone; Elenco; void MostraAnziani(Elenco *E) int i; int max = E->P[0].Età; for(i=1;i<e->numpersone;i++) if(e->p[i].età>max) max = E->P[i].Età; for(i=0;i<e->numpersone;i++) if(e->p[i].età==max) printf( %s\t%s\n,e->p[i].nome); printf( %s\t%s\n,e->p[i].cognome); Fondamenti di Informatica 2 Prova Scritta del 28 Febbraio 2006 2
Esercizio 4 (5 punti) Dire quale operazione è implementata dalla funzione mistero motivando adeguatamente la risposta. int A[100]; int NumeroElementi; Struttura; typedef char stringa[50]; stringa Nome; stringa Cognome; int categoria; Impiegato; Impiegato I500;; int NumImpiegati; ElencoImpiegati; Struttura mistero(elencoimpiegati *E, int cat) int i,j; int t=0; Struttura S; for(i=0; i < E->NumImpiegati; i++) if(e->i[i].categoria == cat) S.A[t++] = i; S.NumeroElementi = t; return S; La funzione mistero scandisce il contenuto dell elenco E passato come argomento e memorizza nella struttura S le posizioni dell elenco che sono relative ad Impiegati la cui categoria sia uguale al valore memorizzato nella variabile cat. La variabile t conta il numero di Impiegato che soddisfano la condizione, ed il valore finale è memorizzato nel campo NumeroElementi della Struttura. Fondamenti di Informatica 2 Prova Scritta del 28 Febbraio 2006 3
Esercizio 5 (6 punti) Si vuole memorizzare un elenco di parole lette da un file di testo. Per memorizzare le parole si utilizza una struttura definita come segue char *parola[1000]; int NumeroElementi; ElencoParole; dove parola è un array di puntatori a char. Per ciascuna parola letta si vuole infatti allocare dinamicamente la memoria. A tal fine, si utilizza una variabile temporanea nel quale memorizzare la parola letta, si calcola la lunghezza della parola letta usando la funzione di libreria strlen e si alloca dinamicamente la memoria per la parola (ricordatevi di allocare lo spazio per il carattere aggiuntivo di fine stringa \0) Scrivere la funzione che legge da un file l elenco delle parole e le memorizza su una variabile di tipo ElencoParole, allocando dinamicamente la memoria come specificato. ElencoParole Prodotto(char *nomefile) char temp[100]; int i = 0; fp = fopen(nomefile, r ); while(!feof(fp)) fscanf( %s,temp); strlen(temp); parola[i] = (char *)malloc(strlen(temp)+1); strcpy(parola[i],temp); i++ Fondamenti di Informatica 2 Prova Scritta del 28 Febbraio 2006 4
Esercizio 6 (4 punti) Si consideri un array A di interi i cui elementi siano ordinati. Si vuole inserire un nuovo elemento nell array in modo tale da mantenere l ordinamento. Questo risultato può essere ottenuto modificando opportunamente l algoritmo bubblesort riportato di seguito. void BubbleSort(int *A,int n) int i,another,temp; for(i=0;i<n-1;i++) another=0; for (j=n-1;j>i;j--) if ((A[j] < A[j-1])) temp=a[j]; A[j]=A[j-1]; A[j-1]=temp; another=1; if(!another) break; Proponete una modifica dell algoritmo che - inserisca il nuovo elemento subito dopo l ultimo elemento dell array - faccia risalire questo elemento fino a raggiungere la posizione corretta rispetto all ordinamento dell array void BubbleSort(int x int *A,int n) int i, temp; int another = 1; A[n] = x; for (j=n;j>0;j--) if ((A[j] < A[j-1])) temp=a[j]; A[j]=A[j-1]; A[j-1]=temp; else another = 0; if(!another) break; Fondamenti di Informatica 2 Prova Scritta del 28 Febbraio 2006 5