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