SOLUZIONE 27-09-99 (PASCAL)

Questionario cartaceo

  1. 22 in base 5 è    2  X  5 + 2  X  1 = 12.
    11 in base 5 è    1  X  5 + 1  X  1 = 6.
    18 = 2  X  7 + 4  X  1
    e quindi in base 7 è
    24 .

  2. i = 3      ; j = 3      ; k = 5

  3. La sintassi dei numeri civici è data dai seguenti diagrammi sintattici.

  4. program COMUNE;
    var
    		pr, sec: text;
        COMM: boolean;
        x: char;
    
    	function APPARTIENE (c: char): boolean;
        var
        	APP: boolean;
        	x: char;
    	begin
        reset(sec, 'SECONDO');
        APP := FALSE;
    
        while ((not EOF(sec)) and (not APP)) do
        begin
        	read(sec, x);
        	if x = c then
        		APP := true;
        end;
        APPARTIENE := APP;
        close(sec);
    	end;
    
    begin
    	reset(pr, 'PRIMO');
    	COMM := FALSE;
    	while ((not EOF(pr)) and (not COMM)) do
    	begin
    		read(pr, x);
    		if APPARTIENE(x) then
    			COMM := true;
    	end;
    	close(pr);
    	write('I due file ');
    	if not COMM then
    		write('non ');
    	writeln('hanno elementi comuni');
    end.

Parte laboratorio

program ESAME;

type

{ gli elementi del tipo INSIEME rappresentano gli insiemi di numeri}
{ reali la cui cardinalita' e' al piu' 50 }

    INSIEME = record
        CARD: integer; {cardinalita' dell'insieme}
        ELEMENTI: array[1..50] of real; {contiene gli elementi dell'insieme 
                nelle prime posizioni senza ripetizioni}
    	end;


var  VUOTO, I1, I2, I3, I4, I5: INSIEME;
 	  over: BOOLEAN;

{ la funzione APPARTIENE controlla se un elemento appartiene ad un insieme }
	function APPARTIENE (x: real; s: INSIEME): BOOLEAN;
    var
    	i: integer;
    	APP: BOOLEAN;
	begin
    APP := FALSE;
    for i := 1 to s.CARD do
    	if x = s.ELEMENTI[i] then
    		APP := TRUE;
    APPARTIENE := APP;
	end;


{ la funzione CARDINALITA ritorna la cardinalita' di un insieme }
	function CARDINALITA (s: INSIEME): integer;
	begin
		CARDINALITA := s.CARD;
	end;

{ la procedura ADD ritorna l'insieme s a cui e' stato aggiunto l'elemento x }
{ con il parametro s2 }
{ il parametro oveflow ritorna se vi e' stato o no l'overflow }

	procedure ADD (x: real; s: INSIEME; var s2: INSIEME; var overflow: BOOLEAN);
	begin
		s2 := s;
		if APPARTIENE(x, s) then
			overflow := FALSE
		else if CARDINALITA(s) = 50 then
			overflow := TRUE
		else
		begin
			s2.CARD := s2.CARD + 1;
			s2.ELEMENTI[s2.CARD] := x;
		end;
	end;

{ la procedura UNIONE ritorna l'unione di due insiemi s1 e s2  con il parametro s3 }
{ il parametro oveflow ritorna se vi e' stato o no l'overflow }

	procedure UNIONE (s1, s2: INSIEME; var s3: INSIEME; var overflow: BOOLEAN);
		var
			i: integer;

	begin
		s3 := s1;
		for i := 1 to CARDINALITA(s2) do
			ADD(s2.ELEMENTI[i], s3, s3, overflow);
	end;


begin
{ inizializzo VUOTO}
	VUOTO.CARD := 0;

{  assegnare ad I1 l'insieme vuoto }
	I1 := VUOTO;

{  assegnare ad I2 l'insieme  3.5, 7.0, 4.0 }
	I2 := VUOTO;
	ADD(3.5, I2, I2, over);
	ADD(7.0, I2, I2, over);
	ADD(4.0, I2, I2, over);


{  assegnare ad I3 l'insieme { 3.1, 7.0, 4.4, 8.8 }
	I3 := VUOTO;
	ADD(3.1, I3, I3, over);
	ADD(7.0, I3, I3, over);
	ADD(4.4, I3, I3, over);
	ADD(8.8, I3, I3, over);


{  controllare se 3.0 appartiene ad  I2 U I3 }
	UNIONE(I2, I3, I4, over);
	if APPARTIENE(3.0, I4) then
		writeln('Appartiene')
	else
		writeln('Non appartiene');

{  stampare la cardinalita' di  I3 U I2 U I1  }

	UNIONE(I2, I1, I5, over);
	UNIONE(I3, I5, I5, over);
	writeln('Cardinalita = ', CARDINALITA(I5));
end.