ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 30/06/2005 - C++
1.
Un albergo è composto da
N=8
piani ciascun dei quali ha M=20 camere.
Ogni camera ha associato un numero di tre cifre. La numerazione delle camere
segue il seguente criterio: la prima cifra rappresenta il piano a cui la camera
si trova (1-8), la restanti due cifre il numero della camera (01-20). [Es. la camera numero 5 al terzo piano avrà il
numero 305]. La camere di ciascun piano x con
numerazione x01-x10 sono camere singole, quelle
x11-x15 sono doppie mentre quelle x16-x20 sono quadruple. Un tale albergo può essere
rappresentato mediante una matrice A di
dimensione NxM a valori booleani (dove A[i][j]=0
se la camera i,j è libera, 1 altrimenti).
Si definisca una classe albergo che rappresenta un albergo
su cui sono possibili le seguenti operazioni:
-
Albergo(): costruttore che
inizializza la matrice in modo che nessuna camera sia occupata;
-
int Prenota(n): il valore n indica il numero di persone che vogliono occupare la camera. La
funzione occupa una camera abbastanza capiente e restituisce il numero di
camera prenotato (se non esistono camere disponibili per la richiesta
restituisce zero). Il criterio di prenotazione deve essere tale da minimizzare
il numero di camere sotto-occupate (cioè camere con una capienza maggiore del
numero di occupanti).
-
libera(n_c): rende libera la camera
numero n_c.
-
boolean completo(): restituisce true se l’albergo è al completo false altrimenti.
2.
Sia dato un file triple.txt che
contiene in ciascuna riga tre valori interi (triple). Si scriva una funzione triple_max()
che stampa sul monitor la tripla del file tale che la somma dei tre numeri che
la compongono è massima.
3.
Siano date due liste
semplici l1 e l2 non vuote a valori interi senza elementi ripetuti al loro interno. Si
scriva la funzione conta_uguali(l1, l2) che riceve in ingresso le liste l1 e l2 e
restituisce il numero di elementi il cui campo informativo compare in entrambe
le liste.
4. Dati
i numeri decimali A=211, B=-100 e C=-122, 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=B-C e si discuta se
il risultato ottenuto è o no significativo.
Punteggio
Es.1 |
Es.2 |
Es.3 |
Es.4 |
11 |
9 |
10 |
3 |
1.
//albergo.h
const int N=8; const int M=20;
class albergo {
boolean
A[N][M];
public:
Albergo();
int prenota (int n);
void libera (int i, int j);
boolean completo();
}
//albergo.cpp
# include
“albergo.h”
albergo::albergo()
{ for (int
i=0; i<N; i++)
for(int
j=0; j<M; j++)
A[i][j]=0;
}
int albergo::prenota(int n) {
int inizio_conta;
int camera=0;
if(n>4 || n<1) return
0;
if(n==1) inizio_conta=0;
if(n==2) inizio_conta=10;
else inizio_conta=15;
for(int j=
inizio_conta; j< M; j++)
for (int i=0; i<N; i++)
if(A[i][j]==0)
{A[i][j]=1;
camera=100*(i+1)+j+1;
return
camera;
}
return
camera;
}
void
albergo::libera (int n_c) {
int piano,
num_camera;
piano=n_c/100;
num_camera=n_c%100;
A[piano-1][num_camera-1]=0;
}
boolean albergo::completo () {
int cont=0;
for (int i=0; i<N; i++)
for(int
j=0; j<M; j++)
if(A[i][j]==0)
return false;
return
true;
}
2.
#include
<fstream.h>
void
triple_max() {
fstream
f;
f.open(“triple.txt”,
ios::in);
int
n1, n2, n3, n1max, n2max, n3max;
int
max, cont;
if(f>>n1>>n2>>n3)
{ max=n1+n2+n3;
n1max=n1;
n2max=n2; n3max=n3;
}
else
return;
while(f>>n1>>n2>>n3)
{ cont=n1+n2+n3;
if(cont>max) { n1max=n1; n2max=n2; n3max=n3;
max=cont;}
cout<<
n1max<<’ ‘<<n2max<<’ ‘<<n3max;
}
3.
int
conta_uguali(elem *l1, elem *l2) {
{ int cont=0;
int x1;
elem *aux1, *aux2;
aux1=l1 ;
while(aux1!=0)
{ x1=aux1->info;
aux2=l2 ;
while(aux2 !=0)
{ if(aux2->info ==x1)
{ cont++ ;
break ;}
aux2=aux2->next ;
}
aux1=aux1->next ;
}
return cont ;
}