ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 24/06/99 - C++

 

1.      Una cantina di vini può contenere bottiglie di vino chianti, lambrusco, vernaccia, barbera o spumante. La cantina può essere rifornita di nuove bottiglie o può effettuare, consegne di bottiglie di vino se ne ha una sufficiente disponibilità. Tenendo presente che una cantina come la precedente può essere rappresentata mediante un array i cui elementi indicano il numero di bottiglie di un tipo presenti nella cantina e che il numero di bottiglie che può contenere la cantina è praticamente illimitato, si definisca la classe vini assumendo che le operazioni possibili siano le seguenti:

·         Init ();
inizializza una cantina in modo che non contenga alcuna bottiglia;

·         Rifornimento (num, tipo);
inserisce nella cantina un numero di bottiglie pari a
num tutte dello stesso tipo tipo (variabile che può assumere i valori: chianti, lambrusco, vernaccia, barbera o spumante);

·         Ok = consegna (num, tipo);
estrae dalla cantina un numero pari a
num di bottiglie di tipo tipo (se esistono) e restituisce il valore booleano true. Se il numero di bottiglie di tipo tipo sono minori di num, la consegna non viene effettuata e viene restituito il valore false;

·         Inventario (v);
stampa il numero di bottiglie di ciascun tipo presenti nella cantina.

 

 

2.      Si scriva la funzione l=intersezione(l1, l2) che riceve come parametri di ingresso due puntatori alla testa di due liste di elementi interi ordinate in senso crescente e che restituisce il puntatore ad una nuova lista che contiene tutti gli elementi comuni alle due liste mantenendo l’ordinamento in senso crescente.

 

3.      I file cifre1.txt e cifre2.txt contengono ciascuno una serie di almeno N numeri interi compresi fra 0 e 9. Si scriva un programma che usi tali file per inizializzare due array vett1 e vett2 entrambi di N posizioni. Il programma quindi determina se l’intero composto dalle cifre contenute in vett1 è maggiore, uguale o minore dell’intero composto dalle cifre contenute in vett2 e stampa il corrispondente messaggio sul monitor.


Es.                        all’array v =

2

4

5

0

4

   0         1        2        3        4

facciamo corrspondere l’intero 24504

 

 

4.      Dati i numeri decimali A=-71, B=83 e C=-91, 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+C e si dica se il risultato ottenuto è o no significativo.

 

10

10

10

3

 


1)

//vini.h

enum booleano {F, T}

enum tipovino { chianti, lambrusco, vernaccia, barbera, spumante}

const int = 5;

 

 

class vini {

            int cont[N];

 

public:

            void inventario()

            void rifornimento(int num, tipovino tipo);

            booleano consegna(int num, tipovino tipo);

            Init();

}

 

 

 

//vini.cc

 

#include <iostream.h>

#include "vini.h"

 

vini::init() {

            for (int i=0; i<N; i++)

                                   cont[i]=0;

}

 

void vini::rifornimento(int num, tipovino tipo) {

                        cont [tipo] += num;

}

 

 

 

booleano vini :: consegna (int num, tipovino tipo) {

                                   if (cont [tipo] < num) return F;

                                   cont [tipo] -= num;

                                   return T;

            }

 

void vini :: inventario () {

                        cout << “contenuto della cantina\n:”;

                        cout << “bottiglie di chianti\t” << cont [chianti] << “\n”;

                        cout << “bottiglie di lambrusco\t” << cont [lambrusco] << “\n”;

                        cout << “bottiglie di vernaccia\t” << cont [vernaccia] << “\n”;

                        cout << “bottiglie di barbera\t” << cont [barbera] << “\n”;

                        cout << “bottiglie di spumante\t” << cont [spumante] << “\n”;

}

 

 


2)

#include <iostream.h>

#include <limits.h>

 

struct elem {

            int info;

            elem * succ;

};

 

elem * intersezione(elem *l1, elem *l2)  {

elem *inter,

int x;

 

while ((l1 !=0) && (l2 != 0))           {

if (l1->info == l2->info)           {

x = l1->info;

inserisci_coda (inter, x);

l1 = l1->succ;

l2 = l2->succ;               }

else if (l1->info < l2->info)

l1 ->l1->succ;

else if (l1->info > l2->info)

l2 ->l2->succ;

}

 

return inter;

 

}

 

void inserisci_coda(elem *& p0, int a)

{

elem *p, elem *q,

for (q=p0; q!=0; q=q->succ) p=q;

q=new elem;

q->info = a;

q->succ =0;

if (p0 == 0)  p0 = q;

else p->pun = q,

}

 


3)

# include <fstream.h>

 

void main () {

 

const int N=8;

int vett1[N], vett2[N];

fstream f;

 

for (int i =0; i<N; i++) {

vett1[i]= 0;

vett2[i] = 0;}

 

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

i=0;

while ((f>>vett1[i]) && (i<N)) i++;

f.close();

 

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

i=0;

while ((f>>vett2[i]) && (i<N)) i++;

f.close();

 

risu=0

j=0,

while ((risu==0)&&(j<N)  {

if (vett1[j]<vett2[j]) risu=2

else if (vett1[j]>vett2[j]) risu=1;

j++;

}

 

switch (risu)

case 0: {cout << “vett1 e vett2 sono uguali\n”;

break;}

case 1: {cout << “l’intero composto dalle cifre di vett1 è il maggiore\n”;;

break;}

case 2: {cout << “l’intero composto dalle cifre di vett2 è il maggiore\n”;

break;}

default: {cout << “errore\n;”

break;}

}


4)

 

Necessari 8 bit per rappresentare A,B e C.

Non sono