ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 22/6/2000 - C++
1. Un ristorante
ha tre tipi di tavoli: tavoli con al massimo due posti, tavoli con al massimo
quattro posti e tavoli con al massimo sei posti. Esistono N2 tavoli da al più 2
posti, N4 tavoli da al più 4 posti e N6 tavoli da al più 6 posti (N2, N4, N6
minori di 10). Ogni tavolo può essere prenotato per un numero di persone minore
o uguale alla sua capienza. Questo ristorante è rappresentabile mediante tre
array di interi (chiamati tav_2, tav_4 e tav_6), uno per ogni tipo di tavolo.
Il contenuto della posizione j-esima dell’array tav_i corrisponde al numero di
persone che hanno prenotato il j-esimo tavolo di tipo i. Si definisca una
classe ristorante assumendo che le possibili operazioni siano le seguenti:
• ristorante(): costruttore che crea un
ristorante con nessuna prenotazione;
• num=prenota(quanti): effettua una prenotazione per un numero di persone
pari a quanti. Se la prenotazione è possibile (cioè se
esiste almeno un tavolo non ancora prenotato con un numero sufficiente di
posti), la funzione restituisce un valore intero composto da due cifre, la
prima indica il tipo di tavolo (n) la seconda il numero del tavolo di quel tipo
(m) che si è prenotato. La funzione esegue la prenotazione scrivendo
opportunamente il valore quanti nell’array tav_n alla
posizione m-esima in modo da minimizzare il numero di posti vuoti per ogni
tavolo prenotato. Si tenga presente
infine che due prenotazioni distinte non possono riguardare lo stesso tavolo
contemporaneamente;
• libera(num_prenotazione): disdice la prenotazione
identificata attraverso il valore num_prenotazione
(valore intero composto da due cifre);
2. Sia dato un file motel.txt che contiene in ciascuna riga il nome di un motel (stringa di al più
20 caratteri), il luogo dove si trova (stringa di al più 20 caratteri) e la
tariffa per il pernottamento. Si scriva una funzione controlla(prezzo, dove) che legge il file e trova il motel che ha la
tariffa più vicina ma non
superiore a prezzo e si trovi nel luogo dove e ne stampa il nome sul
monitor. Se più di un motel soddisfa tale requisito si stampa il nome del motel
letto per ultimo.
3. Si scriva una funzione elimina_in_mezzo(l) che riceve in ingresso il puntatore l a una lista circolare doppia a valori interi. La funzione calcola il
numero n di elementi della lista e va a estrarre l’elemento che si trova nella
posizione n/2 (parte intera di n diviso 2).
4. Dati i numeri decimali A=122, B=65 e C=-102,
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=C-B e si dica se il risultato è o no significativo
10 |
10 |
10 |
3 |
//
ristorante.h
const int
N2=7;
const int
N4=9;
const int
N6=4;
Class
ristorante {
Int
tav_2[N2];
Int
tav_4[N4];
Int
tav_6[N6];
Public:
Ristorante
();
Int
prenota (int quanti);
Libera(int num_prenotazione);
}
//ristorante.cc
#include
<iostream.h>
#include
“ristorante.h”
ristorante::ristorante
() {
for (int
i=0; i<N2; i++)
tav_2[I]=0;
for (i=0; i<N4; i++)
tav_4[I]=0;
for (i=0; i<N6; i++)
tav_6[I]=0;
}
int
ristorante::prenota (int quanti)
{
int risu=0;
if ((quanti<3)
&& (quanti>0))
{
for
(int j=0; j<N2; j++)
if
(tav_2[j]==0) {
tav_2[j]=quanti;
risu
= (2*10)+j+1;
return
risu;
}
for
(j=0; j<N4; j++)
if
(tav_4[j]==0) {
tav_4[j]=quanti;
risu
= (4*10)+j+1;
return
risu;
}
for
(j=0; j<N6; j++)
if
(tav_6[j]==0) {
tav_6[j]=quanti;
risu
= (6*10)+j+1;
return
risu;
}
}
else { if ((quanti>2)&&(quanti<5))
{
for
(j=0; j<N4; j++)
if
(tav_4[j]==0) {
tav_4[j]=quanti;
risu
= (4*10)+j+1;
return
risu;
}
for
(j=0; j<N6; j++)
if
(tav_6[j]==0) {
tav_6[j]=quanti;
risu
= (6*10)+j+1;
return
risu;
}
}
else ( if
((quanti>4)&&(quanti<7))
{
for
(j=0; j<N6; j++)
if
(tav_6[j]==0) {
tav_6[j]=quanti;
risu
= (6*10)+j+1;
return
risu;
}
}
cout<<”nessun
tavolo disponibile\n”;
return
risu;
}
int
ristorante::libera(int num_prenotazione)
{
int tipo, numero;
tipo = num_prenotazione/10;
numero = num_prenotazione%10;
switch
(tipo) {
case 2: tav_2[numero]=0;
case
4: tav_4[numero]=0;
case
6: tav_6[numero]=0;
default: cout<<”parametro
errato\n”;
}
#include <fstream.h>
#include <string.h>
void controllo (double prezzo, char dove[21])
{
fstream f;
double tariffa;
char nome[21];
char citta[21];
char mio_motel[21];
int trovati=0;
double cheaper = prezzo;
f.open (“motel.h”, ios::in);
f>>nome>>citta>>tariffa;
while (!f.eof())
{
if
((tariffa<=cheaper)&&((strcmp(dove, citta)==0))
{
strcpy (nome,
mio_motel);
cheaper=tariffa;
trovati++;
}
f>>nome>>citta>>tariffa;
}
if (trovati>0)
cout<< mio_motel
<< “\n”;
else
cout<<”nessun motel trovato\n”;
f.close();
}
struct elem {
int
info;
elem*
succ;
elem*
prec;
}
void elimina_in_mezzo (elem *& l)
{
int via;
int
conta=0;
elem
scorri=l;
if (l==0) return;
if ((l->succ) == l)
{
delete l;
return;
}
scorri=scorri->succ;
while (scorri !=l)
{
scorri = scorri->succ;
conta++;
}
via =
(conta+1)/2;
for (int
i=0; i<via; i++)
scorri
= scorri->succ;
scorri->prec->succ
= scorri->succ;
scorri->succ->prec
= scorri->prec;
l=scorri->next
delete
scorri;
}