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   }