ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 31/01/2002 - C++
1. Una banca dispone di N sportelli ed ha un indicatore che segnala se uno sportello è libero, occupato oppure chiuso. Tale indicatore può essere rappresentato mediante un array di caratteri dove l’elemento i-esimo vale C se l’i-esimo sportello è chiuso, L se è aperto e libero, B se è aperto e occupato. Si definisca una classe indicatore assumendo che le possibili operazioni siano le seguenti:
2. Sia dato un file numeri.txt contenente almeno N numeri interi. Si scriva una funzione ok=controlla(v) che riceve in ingresso un array v di N interi e che restituisce T se nessun elemento di v è contenuto in numeri.txt, F altrimenti.
3. Siano date due liste semplici a valori interi l1 e l2 non vuote ordinate in senso crescente e che non contengono al loro interno elementi ripetuti. Si scriva una funzione l3=unisci(l1, l2) che riceve in ingresso le due liste. La funzione costruisce una nuova lista l3 anch’essa ordinata in senso crescente composta dagli elementi di l1 e l2 e la restituisce in uscita. Si consideri che gli elementi di l1 e l2 sono diversi fra loro.
4. Dati i numeri decimali A=87, B=-63 e C=121, si determini il minimo numero di bit necessario per rappresentare contemporaneamente i suddetti numeri in complemento a due 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 è o no significativo
Punteggio:
Es.1 |
Es.2 |
Es.3 |
Es.4 |
11 |
8 |
11 |
3 |
// indicatore.h
enum ind {C, B, L};
const int N=20;
class indicatore {
ind *D;
public:
indicatore() ;
bool liberato(int i) ;
bool
occupato ();
int
conteggio ()
~indicatore()
{dolete [ ] D;};
}
// indicatore.cc
#include “indicatore.h”
indicatore::indicatore()
{ D = new int[N];
for (int i=0; i<N; i++)
D[I]=’C’;
}
bool indicatore::liberato(int i) {
if (D[i]==’B’)||(D[I]==’C’))
{ D[I]==’L’;
return
T; }
return
F;
}
bool indicatore::occupato()
{
for(int i=0; i<N; i++)
if (D[i]==’L’)
{ D[i] = ‘B’;
return
T; }
return
F;
}
int indicatore::conteggio()
{
int
n=0;
for (int i=0; i<N;i++)
if (D[I]!=’C’)
n++;
return n;
}
2.
#include
<fstream.h>
const int N=100;
bool controlla(int v[N]) {
fstream f;
f.open(“numeri.txt”, ios::in);
int n;
while(f>>n) {
for(int i=0; i<N ;
i++)
if (v[i] == n) { return
F;
f.close();
}
}
f.close();
return T;
}
3.
elem* unisci (elem *l1, elem
*l2)
{
elem *l3;
elem *aux;
elem * aux1, *aux2; *aux3;
aux1=l1 ;
aux2=l2 ;
// creazione del primo
elemento di l3
aux3=new elem ;
aux3 ->next =0;
if (aux1->info <
aux2->info)
{ aux3->info = aux1->info ;
l3 = aux3 ;
aux1=aux1->next ;
}
else
{ aux3->info = aux2->info ;
l3 = aux3 ;
aux2=aux2->next ;
}
//creazione del resto di l3
while(aux1 !=0 &&
aux2 !=0)
{
aux3=new elem ;
aux3 ->next =0;
//inserimento in coda di l3
aux=l3 ;
while(aux->next =
0)
aux=aux->next ;
aux->next=aux3 ;
if (aux1->info <
aux2->info)
{ aux3->info = aux1->info ;
aux1=aux1->next ;
}
else
{ aux3->info = aux2->info ;
aux2=aux2->next ;
}
}
if(aux1 !=0) {
aux3=new elem ;
aux3
->next =0;
aux3->info
= aux1->info; //inserimento
in coda di l3
aux=l3 ;
while(aux->next = 0)
aux=aux->next ;
aux->next=aux3 ;
}
if(aux2 !=0) {
aux3=new elem ;
aux3 ->next =0;
aux3->info
= aux2->info; //inserimento
in coda di l3
aux=l3 ;
while(aux->next = 0)
aux=aux->next ;
aux->next=aux3 ;
}
return l3 ;
}