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 #include #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;iv[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;inb) 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) 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