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 ;

}