Prova del 7/3/2002

Esercizio 1

Data la seguente porzione di codice:
       . . .
       DO I = 1,100
 25        CALL UNO(. . .)
 	   . . .
	   DO J = 1,50
	       IF(A(I).GT.B(J)) THEN
		   . . .
                   GOTO 25
               ENDIF
	       . . .
	   ENDDO
75         CALL DUE(. . .)
81     ENDDO
       . . .

Riscriverla in linguaggio C senza usare i GOTO e le label ed illustrare quali cautele devono essere prese, e perché, nella chiamata di UNO e DUE.

Soluzione

Esercizio 2

Generare casualmente, nel rettangolo di diagonale (A,B)-(C,D), 500 punti con il vincolo che siano centri di circonferenze completamente contenute nel rettangolo e di raggio pari ad un centesimo del più corto fra i due lati del rettangolo.

Stabilire quindi il numero delle circonferenze che non si intersecano.

Illustrare l’algoritmo scelto e codificarlo in C.

Soluzione

Esercizio 3

Un file contiene rilevazioni numeriche provenienti da diversi strumenti: in ogni riga sono registrati il codice dello strumento (int) e il valore di misura relativo (double). Non è noto il numero di righe.

Per ogni strumento possono esserci una o più righe non necessariamente in ordine, ovvero non necessariamente contigue. Al massimo abbiamo 100 strumenti distinti.

Produrre un file di output contenente, per ogni strumento, ed in ordine di codice, il valor medio delle misure relative.

Illustrare l'algoritmo scelto e codificarlo in C.

Soluzione

Esercizio 4

Il seguente programma utilizza le istruzioni malloc e free per caricare in un vettore un numero arbitrario di valori letti da terminale.

Per alcune istruzioni del programma sono date quattro possibilità. Marcarle nell'apposito spazio con:

S
se sono errori di sintassi rivelati dal compilatore
L
se sono errori di logica (istruzioni corrette dal punto di vista formale ma che hanno un comportamento diverso da quello voluto)
C
se sono corrette

In taluni casi ci puo' anche essere più di una possibilità corretta.

Spiegare l'algoritmo di funzionamento del programma.

#define DIMENSIONE_INIZIALE=100;    
#define DIMENSIONE_INIZIALE 100    
#define DIMENSIONE_INIZIALE 100;    
#define DIMENSIONE_INIZIALE=100    
#INCLUDE <stdio.h>    
#INCLUDE "stdio.h"    
#include <stdio.h>    
#include "stdio.h"    
int main () {
  double *p, *old, dato;
  int size=DIMENSIONE_INIZIALE, letti, i=0;    
  int size=dimensione_iniziale, letti, i=0;    
  int size=DIMENSIONE_INIZIALE, letti=0, i;    
  int size=dimensione_iniziale, letti=0, i;    
  p = (double *) malloc( DIMENSIONE_INIZIALE * sizeof( double ) );    
  p = malloc( DIMENSIONE_INIZIALE * sizeof( double ) );    
  p = (double *) malloc( DIMENSIONE_INIZIALE * double );    
  p = malloc( DIMENSIONE_INIZIALE * double );    
  while ( scanf("%lf",&dato)!=EOF )    
  while ( scanf("%lf",&dato)!=EOF );    
  while ( scanf("%lf",dato)!=EOF )    
  while ( scanf("%lf",dato)!=EOF );    
  {
    letti++;
    if ( letti<size )    
    if ( letti>size )    
    if ( letti>=size )    
    if ( letti<=size )    
    {
      old=p;
      p= (double *) malloc( 2*size*sizeof(double) );
      for (i=0, i<size, i++) *(p+i)=*(old+i);    
      for (i=0; i<size; i++) *(p+i)=*(old+i);    
      for (i=0, i<size, i++) p[i]=old[i];    
      for (i=0; i<size; i++) p[i]=old[i];    
      size*2;    
      size*=2;    
      size=2;    
      size=size*2;    
      free(old);
    }
    p[letti-1]=dato;    
    p[letti]=dato;    
    p[letti-1]=&dato;    
    p[letti]=&dato;    
  }
  return 0;
}

Soluzione