ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 15/2/2001 - C++

 

1.      I posti di un aereo sono disposti su N file ciascuna fila è composta da 4 posti, due al finestrino e due sul corridoio. Inoltre le prime M (M<N) file sono riservate ai passeggeri non fumatori mentre le restanti sono riservate ai passeggeri fumatori.  Un tale aereo è rappresentabile mediante una matrice A di dimensione Nx4 a valori booleani. L’elemento   A[i][j] vale T se il j-esimo posto della i-esima fila è prenotato, vale F se è libero. Si definisca una classe aereo, ogni oggetto della quale rappresenta un aereo. Sugli oggetti di tale classe è possibile effettuare le seguenti operazioni:

·          Aereo(): costruttore che inizializza un aereo con tutti i posti liberi;

·         ok=prenota(F, posizione): effettua una prenotazione di un posto  di categoria F (fumatori o non fumatori) e di posizione posizione (finestrino/corridoio);

·         disdici(i,j): libera il posto j-esimo della fila i-esima;

·         Situazione(): stampa il numero di posti per non fumatori  e per fumatori ancora disponibili.

2.      Sia dato un file “valori.dat” non vuoto contenente numeri interi non consecutivi ordinati in senso crescente. Scrivere un funzione riempi() che trasforma il file “valori.dat” in modo tale che contenga l’intera sequenza di numeri consecutivi a partire dal valore più piccolo fino al l’ultimo valore del file stesso compreso.

Esempio:

7     8     9

10   11   12

13   14   15

16   17   18

19   20   21

                                                              i.     115

                                                            ii.     143

 

7     9     13

15   16  21

 
 

3.      Sia data una lista semplice a valori interi, scrivere una funzione ok=elimina_coda(l, n) che riceve in ingresso il puntatore l alla lista e un valore intero n. La funzione cerca nella lista l’elemento con il campo informativo uguale a n ed elimina tutti gli elementi che seguono tale elemento. Se un tale elemento esiste la funzione restituisce T altrimenti F.

4.       Dati i numeri decimali A=67, B=-65 e C=125, 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-A e si dica se il risultato ottenuto è o no significativo.

 

10

10

10

3

 

 


1.

 

//aereo.h

const int N=50;

const int M=40;

enum bool {F, T};

enum fumatori {S, N};

enum posizione {W, C};

 

class aereo {

            int A[N][4];

public:

            bool prenota (fumatori s, posizione p);

            void disdici (int I, int j);

            void situazione();

            aereo();

}

 

//aereo.cc

 

# include “aereo.h”

#include <iostream.h>

 

aereo::aereo()

{

int i,j;

for (i=0; i<N; i++)

            for(j=0; j<4; j++)

                        A[i][j]=0;

}

 

bool aereo:: prenota (fumatori s, posizione p) {

int i, finer;

 

if(s==S) {i=0; finer=M;}

else {i=M; finer=N;}

 

for (;i<finer; i++)

            for(int j=0; j<4; j++)

            {

            if ((A[i][j]==F)&&(p==W)&&(j%3==0) || (A[i][j]==F)&&(p==C)&&(j%3!=0))

{

                                                                                  A[i][j]=T;

                                                                                  return T;

                                                                                  }

            }

return F;

}

 

void aereo::disdici(int i, int j)

{

if ((i<0) || (i>N-1) || (j<0) || (j>3))

{

cout << “indici posto sbagliati\n”;

return;

}

A[i][j]==F;

}

 

 

void aereo::situazione() {

int i,j;

int conta=0;

 

for (i=0; i<M, i++)

            for(j=0; j<4; j++)

            if (A[i][j]==0) conta++;

cout<<”numero posti non-fumatori liberi: “<<conta “\n”;

 

conta=0;

 

for (i=M; i<N, i++)

            for(j=0; j<4; j++)

            if (A[i][j]==0) conta++;

cout<<”numero posti fumatori liberi: “<<conta “\n”;

}

 

 

 

 


2.

#include <fstream.h>

 

void riempi() {

 

fstream f;

 

f.open(“valori.dat”, ios::in);

 

int primo, ultimo, j;

 

f>>primo;

ultimo=primo;

 

while(f>>ultimo);

 

f.close();

f.open(“valori.dat “, ios::out);

 

for (j=primo; j<=ultimo; j++)

            f<<j;

 

f.close();

 

}

 


3.

 

struct elem {

int info;

elem *next;

}

 

 

enum bool {F, T};

 

bool elimina_coda (elem *l, int n) {

 

elem *aux, aux2;

 

if (l==0) return F;

 

while((l!=0)&&(l->info!=n)

l=l->next;

 

if (l==0) return F;

 

aux=l->next;

 

while(aux !=0)

{

            aux2=aux->next ;

            delete aux ;

            aux=aux2 ;

}

 

return T ;

}

 

 

 

4.

bit necessari= 8

 

A => 01000011

B => 10111111

C => 01111101

 

D  rappresentabile su 9 bit