Fondamenti di informatica
(SSE e Statistica)
Prova di esonero
del 10 maggio 2001
Domanda 1 (10 punti)
Scrivere un programma C che legge da tastiera 20 interi, e li stampa ordinati in senso non decrescente usando l’algoritmo bubble-sort.
Soluzione
#include
<stdio.h>
#include
<conio.h>
#define
NMAX 20
void
leggi_vettore(int *n,int *vett);
void
scambia(int *a, int *b);
void
stampa_vettore(int n, int*vett);
main()
{ int v[NMAX];
int
n,i,p,m;
clrscr();
leggi_vettore(&n,v);
m=n;
do {
p=1;
for (i=0;i<m-1;i++)
{
if
(v[i]>v[i+1]) {
scambia(&v[i],&v[i+1]);
p=i+1;
}
}
m=p;
}
while(p>1);
stampa_vettore(n,v);
getch();
}
void
leggi_vettore(int *n, int *vett)
{ int i;
printf("scrivi la dimensione del
vettore (<=%d): ",NMAX);
scanf("%d",n);
for (i=0;i<*n;i++) {
printf("v[%d] = ",i);
scanf("%d",&vett[i]);
}
}
void
scambia(int *a, int *b)
{ int temp;
temp=*a;
*a=*b;
*b=temp;
}
void
stampa_vettore(int n, int *vett)
{ int i;
printf("\n\n");
for (i=0;i<n;i++)
printf("v[%d] =
%d\n",i,vett[i]);
}
Domanda 2 (15 punti)
Scrivere un funzione C di nome confronta_maiuscole che, dati come parametri due array di caratteri (ciascuno terminato opportunamente), restituisce –1, 0 , o +1 se il numero di lettere maiuscole contenute nel primo è rispettivamente minore, uguale o maggiore del numero di lettere maiuscole contenute nel secondo. Se opportuno, si potranno definire altre funzioni e invocarle dalla funzione confronta_maiuscole.
Soluzione
Poichè la funzione dovrà eseguire la stessa operazione (contare le maiuscole) su entrambe le stringhe passate, è consigliabile definire una funzione ausiliaria che, data una stringa come parametro, restituisce il numero di lettere maiuscole in essa contenute:
int
conta_maiuscole(char *v);
int
confronta_maiuscole(char *a, char *b)
{
int na, nb;
na = conta_maiuscole(a);
nb = conta_maiuscole(b);
if(na>nb)
return
(1);
else if
(na==nb)
return
(0);
else
return
(-1);
}
int
conta_maiuscole(char *v)
{
int i, conta;
conta = 0;
for (i=0; v[i]!=’\0’; i++)
if
((v[i]>=’A’) && (v[i]<=’Z’))
conta++;
return (conta);
}
La funzione conta_maiuscole può anche essere
definita come segue:
int
conta_maiuscole(char *v)
{
int conta=0;
while (*v!=’\0’) {
if
((*v>=’A’) && (*v<=’Z’))
conta++;
v++;
}
return (conta);
}
Domanda 3 (5 punti)
La seguente funzione, che dovrebbe individuare il valore minimo in un array di interi, contiene numerosi errori (alcuni dovuti ad un uso errato del linguaggio C, alcuni ad una logica errata).
I parametri formali corrispondono rispettivamente (nel programma corretto) all’indirizzo iniziale dell’array e al numero di elementi dell’array.
Evidenziare gli errori, descriverli, e proporre soluzioni (le linee di codice sono numerate per semplificare il riferimento al testo).
1 void minimo(int *v[], int n)
2 { int minimo;
3 minimo
= 0;
4 for
(i=1; i<=n; i++){
5 if
(v[i] < minimo)
6 minimo
= v[i];
7 else
8 i++;
9 }
10 return
minimo;
11 }
Soluzione
1 void minimo(int *v[], int n) la funzione deve essere di tipo int
(restituisce il minimo elemento);
2 { int minimo;
deve essere definita anche la variabile i, di tipo int.
Inoltre la variabile locale minimo non può avere lo stesso nome della funzione;
3 minimo
= 0; se l’array contenesse
solo interi positivi, il risultato sarebbe errato (0). E’ opportuni
inizializzare la variabile con v[0], o
con il massimo intero MAXINT (aggiungendo la #include<limits.h>)
4 for
(i=1; i<=n; i++){ l’ulimo
elemento dell’array è v[n-1]
5 if
(v[i] < minimo)
6 minimo
= v[i];
7 else il ramo else deve essere omesso,
poiché la variabile i è già incrementata dal ciclo for
8 i++; vedi riga precedente
9 }
questa coppia di {} è superflua, ma non rappresenta un errore
10 return
minimo;
11 }
segue la versione corretta della funzione:
1 int minimo(int *v[], int n)
2 { int m, i;
3 m
= v[0];
4 for
(i=1; i<n; i++)
5 if
(v[i] < m)
6 m = v[i];
10 return
m;
11 }