Fondamenti di Informatica 2
Soluzione della prova scritta del 25 Luglio 2006
Esercizio 1 (4 punti)
Date le seguenti variabili
int A[] = {2,3,7,-2,5,-8,-4};
int N = 7;
int i;
Scrivere la porzione di codice che sostituisca l’elemento i-esimo dell’array con la somma dei primi i elementi
dell’array, in modo tale che dopo tale operazione il contenuto dell’array A sia il seguente.
{2,5,12,10,15,7,3}
Soluzione
for(i=1;i<N;i++)
A[i] = A[i]+A[i-1];
Esercizio 2 (7 punti)
Definire una struttura dati per rappresentare un elenco di Auto, dove ciascuna auto è rappresentata dagli
attributi Marca, Modello, Targa, DataDiImmatricolazione. Per rappresentare la DataDiImmatricolazione usare
una struttura (2 punti)
Si supponga che la struttura dati contenga già memorizzato un elenco di auto. Scrivere una procedura che
prende in ingresso l’elenco di auto e mostri a video la Targa della (o delle) auto immatricolate in un certo
anno, che deve essere passato come parametro in ingresso. La procedura deve inoltre dare un messaggio a
video nel caso non vi sia nessuna auto nell’elenco immatricolata in quell’anno (5 punti).
Soluzione
typedef char stringa[50];
typedef struct {
int giorno;
int mese:
int anno;
} Data;
typedef struct {
stringa Marca;
stringa Modello;
stringa Targa;
Data DataDiImmatricolazione;
} Auto;
typedef struct {
Auto A[100]:
int NumAuto;
} Elenco;
void MostraImmatricolatiAnno(Elenco *E, int anno)
{
int i;
int flag = 0;
for(i=1;i<E->NumAuto;i++)
if(E->A[i].DataDiImmatricolazione.anno == anno) {
printf(“%s\n”,E->A[i].Targa);
flag = 1};
if(!flag)
printf(“Nessuna auto immatricolata nel %d\n”,anno);
}
Fondamenti di Informatica 2
Prova Scritta del 25 Luglio 2006
1
Esercizio 3 (6 punti)
Scrivere un programma che crea una matrice di dimensione N x M in cui l’elemento di posizione (i,j) ha
valore (i * j). La matrice deve essere scritta su un file di testo, separando gli elementi di una stessa riga da
spazi o da un carattere di tabulazione, e le righe della matrice devono essere su righe diverse del file. Le
dimensioni della matrice e il nome del file devono essere fornite dall’utente (a riga di comando o
interattivamente da tastiera.
#include <stdio.h>
#include <stdlib.h>
main()
{
int i,j;
int Righe,Colonne;
char nomefile[50];
FILE *fp;
printf("Digitare il nome dei file ");
gets(nomefile);
printf(“Inserire le dimensioni della matrice (righe e colonne): ”);
scanf(“%d%d”,&Righe,&Colonne);
fp = fopen(nomefile, “w”);
for(i=0; i< Righe; i++) {
for(j=0; j<Colonne; j++)
fprintf(fp,”%d\t”,i*j);
fprintf(fp,“\n”);
}
fclose(fp);
}
Fondamenti di Informatica 2
Prova Scritta del 25 Luglio 2006
2
Esercizio 4 (5 punti)
Dire quale operazione è implementata dalla funzione mistero motivando adeguatamente la risposta.
typedef char stringa[50];
int mistero(stringa key, stringa *A, int n)
{
int left=0, right=n-1;
while (left<=right) {
int mid=(left+right)/2;
if (strcmp(A[mid,] key) == 0)
return mid;
if (strcmp(A[mid], key) > 0)
right=mid-1;
else
left=mid+1;
}
return -1;
}
Soluzione
La funzione mistero ricerca la stringa key all’interno dell’array di stringhe A supposto ordinato. La ricerca
viene effettuata usando l’algoritmo della ricerca binaria (ad ogni passo si escludono dalla ricerca la metà
degli elementi di A).
Fondamenti di Informatica 2
Prova Scritta del 25 Luglio 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
typedef struct {
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 memorizza la parola letta in una variabile temporanea, se ne calcola la lunghezza
usando la funzione di libreria strlen e si alloca dinamicamente 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.
Soluzione
ElencoParole MemorizzaParole(char *nomefile)
{
FILE *fp;
char temp[1000];
int i = 0;
ElencoParola E;
fp = fopen(nomefile, “r”);
while(!feof(fp)) {
fscanf(fp,“%s”,temp);
E.parola[i] = (char *)malloc(strlen(temp)+1);
strcpy(E.parola[i],temp);
i++;
}
E.NumeroElementi = I;
return E;
}
Fondamenti di Informatica 2
Prova Scritta del 25 Luglio 2006
4
Esercizio 6 (5 punti)
Scrivere la definizione di un tipo lista per memorizzare numeri interi, usando la rappresentazione collegata (2
punti). Scrivere inoltre una procedura che inserisce un nuovo elemento alla fine di una lista esistente,
ipotizzando che tale lista contenga almeno un elemento (3 punti).
void Inserisci(LIST L, int x)
Soluzione
typedef *CELL LIST;
typedef struct {
int element;
LIST next;} CELL;
void Inserisci(LIST L, int x)
{
LIST P = L;
while(P->next != NULL)
P = P->next;
&(P->next) = (LIST)malloc(sizeof(CELL));
P = P->next;
P->element = x;
P->next = NULL;
}
Fondamenti di Informatica 2
Prova Scritta del 25 Luglio 2006
5