ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 15/07/99 - C++

 

 

1.                        Il file valori.txt contiene per ciascuna riga il nome di un componente del sangue ed il relativo valore minimo e massimo tollerato. Si scriva un funzione ok=controllo(nome, valore) che riceve come argomento una stringa contenente il nome di un componente del sangue ed un valore reale che ne rappresenta il valore riscontrato. La funzione verifica se tale valore rientra nei limiti previsti per il componente e restituisce il valore booleano corrispondente (true se il valore rientra nei valori tollerati, false altrimenti).

2.                        Si scriva una funzione maggiore(t, n) che riceve in ingresso il puntatore ad un albero binario e che visualizza sul monitor il numero dei nodi dell’albero aventi valore maggiore di n. Si consideri che i nodi dell’albero contengano numeri interi positivi.

3.                        Si consideri un mazzo di carte da gioco rappresentato mediante una lista di elementi che contengono l’informazione relativa al segno ed al valore di una carta. Si definiscano le opportune strutture dati e si scriva una funzione alza(p, n) che riceve come argomenti il puntatore p ad una lista di carte ed un intero n, ed effettui una alzata del mazzo, in corrispondenza della n-esima carta. In altre parole, la funzione deve portare in testa alla lista tutti gli elementi successivi all’n-esimo elemento.

4.                        Dati i numeri decimali A=69, B=-59 e C=126, si determini il minimo numero di bit necessari per rappresentare contemporaneamente i suddetti numeri in complemento a 2 e se ne dia la rappresentazione. Utilizzando poi lo stesso numero di bit, si esegua l’operazione D=A-B e si dica se il risultato ottenuto è o no significativo.

 

10

9

11

3

 


1)

# include <fstream.h>

# include <string.h>

 

enum booleano {false, true};

 

 

booleano controllo (char nome[], double valore)

{

booleano trovato = false;

char read[];

int conf;

double v1, v2;

fstream f;

booleano esito=false;

f.open (“valori.txt”, ios::in);

while ((f>>read>>v1>>v2) && (!trovato))

{

conf = strcmp (nome, read);

if (conf==0) {

trovato = true;

if ((valore<v2)&&(valore>v1)) esito = true;

}

}

if (!trovato) cout<<”componente errato\n”;

return esito;

}

 

 


2)

#include <iostream.h>

 

struct nodo {

            int info;

            nodo *sin;

            nodo *des;

};

 

int conta (nodo* t1, int n) {

if(t1 == 0) return 0;

if (t1->info>n)

return (1 + maggiore(t1->sin, n) + maggiore(t1->des, n));

else

return (maggiore(t1->sin, n) + maggiore(t1->des, n));

}

 

void maggiore(nodo *t1, int n)  {

cout << conta(t1, n);

}

 


3)

enum seme {cuori, quadri, fiori, picche};

 

enum valore {A,2,3,4,5,6,7,8,9,10,J, Q, K};

 

struct carta {   valore val;

  seme s;

  carta *succ;

}

 

 

void alza (carta *&p0, int n)

{

carta *p = p0,                    //puntatore per la scansione

carta *q;                             //puntatore all’n-esima carta

carta *last;                         // puntatore all’ultima carta

int i = 0;                              // contatore dei passi di scansione

 

if ((p0 == 0) || (p0->pun == 0) || (n<1)) return;

 

p=p0;

while ((p != 0) && (i< n) )  {                      //scorre la lista di n posizioni

i++;

q = p;                        //q punta alla carta i-esima

p = p->pun; }                        //p punta alla carta (i+1)-esima

if (p==0) return                  // n>num. Carte

 

for (; p!=0; p=p->pun)

   last = p                            //last sull’ultima

 

last->pun = p0;

p0 = q->pun;

q->pun = 0;

}