ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 17/2/2000 - C++

 

1.      La gamma di automobili di una casa automobilistica è composta dai seguenti modelli: matingo, clava, fiexo, golfetta, corassat. Ciascun modello della gamma è disponibile in cinque colori: bianco, nero, azzurro, rosso e grigio. Un concessionario di questa casa automobilistica è rappresentabile mediante una matrice. L’elemento (i,j) di tale matrice indica il numero di esemplari disponibili del modello di auto i di colore j. Si definisca una classe concessionario assumendo che le possibili operazioni siano le seguenti:

·         Init(): inizializza un concessionario in modo che contenga un esemplare di ciascuna auto della gamma di colore bianco.

·         Ok=vendita(mod, col): effettua una vendita di un’auto modello  mod e colore col, se presente e restituisce il valore booleano true. Se non è presente alcuna auto di questo modello e colore, la vendita non viene effettuata e viene restituito il valore booleano false.

·         Nuovi_arrivi (mod, col, num): fornisce al concessionario un numero pari a num di auto di modello mod e colre col.

2.      Un file chiamato orario_treni.txt contiene per ciascuna riga le seguenti informazioni:

·         Un valore intero che rappresenta il codice del treno,

·         una stinga di al più 25 caratteri che indica la stazione di partenza,

·         una stringa di al più 25 caratteri che indica la stazione di arrivo,

·         un valore intero che indica l’ora di partenza,

·         un valore intero che indica il minuto di partenza;

·         un valore intero che indica l’ora di arrivo,

·         un valore intero che indica il minuto di arrivo.

Si scriva una funzione veloce (p, d) che riceve in ingresso due stringhe e che visualizza sul monitor  il codice del treno che partendo da p arriva a d impiegando il minor tempo. Si assuma per semplicità che nessun treno sia in viaggio a mezzanotte.

3.      Si scriva una funzione elimina(l) che riceve come parametro di ingresso il puntatore ad una lista circolare doppia il cui campo informazione contiene valori interi e che esegue le seguenti operazioni:

·         Legge il valore n dell’elemento puntato a l e

·         dealloca l’elemento che incontra scorrendo di n posizioni la lista.

4.      Dati i numeri decimali A=-58, B=-72 e C=103, 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 eseguano le operazioni D=A+C e E=B+C e si dica se i risultati ottenuti sono o no significativi.

 

10

10

10

3

 

1)

//concessionario.h

 

enum booleano {F, T}

 

enum modello {matingo, clava, fiexo, golfetta, corassat}

 

enum colore { bianco, nero, azzurro, rosso, grigio}

 

const int N=5;

 

class concessionario {

            int auto [N][N];

 

public:

            Init();

            void nuovi_arrivi (modello m, colore c, int num);

            booleano vendita (modello m, colore c);

}

 

 

 

//concessionario.cc

 

#include concessionario.h

 

concessionario::Init() {

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

                        { auto[i][0]=1;

                        for (int j=1; j<N; j++)

                        auto[i][j]=0;

                        }

}

 

void concessionario:: nuovi_arrivi (int num, modello m, colore c)

{

            auto [m][c] += num;

}

 

 

booleano concessionario:: vendita (modello m, colore c)

{

            if (auto [m][c]>0)

                        {

                        auto[m][c]--;

                        return T; }

            return F;

}


 

 

2)

#include <fstream.h>

#include <string.h>

 

void veloce (char p [25], char d[25])

{

            fstream scorri;

 

            char partenza[25], destinazione[25];

int h_par, h_arr, min_par, min_arr;

int tempo_minore = 1440;

int min, h, cod, codice_treno;

 

scorri.open(“orario_treni.txt”, ios::in);

scorri >>cod>>partenza>>destinazione>>h_par>>min_par>>h_arr>>min_arr;

 

while(!scorri.eof())

{

if ((strcmp(partenza, p)==0) && (strcmp(dest, d)==0)

{

  if (min_par<= min_arr)

{

  min=min_arr-min_par;

  h = h_arr-h_par;

}

                        else

                                   {

                                     min = 60 – (min_par-min_arr);

                                    h = h_arr-h_par –1;

                                   }

                        tempo = (60*h) + min;

 

                        if (tempo < tempo_minore)

                        {

                                   tempo_minore = tempo;

                                   codice_treno=cod;

                        }

            }

            scorri >>cod>>partenza>>destinazione>>h_par>>min_par>>h_arr>>min_arr;

            }

            cout << cod << “\n”;

}

 

 


 

3)

 

struct elem {

                        int n;

                        elem* prec;

                        elem* succ;

            }

 

 

 

void elimina (elem*& l)

{

elem * aux;

            int n;

           

            if (l==0)

            {

              cout<<”Lista vuota: errore\n”;

              return;

            }

           

            n=l->info;

 

            aux=l;

            for (int i=0; i<n; i++)                

                        aux = aux->succ;

 

            if (aux==l)

                        l = l->succ;

 

            aux->prec->succ = aux->succ;

            aux ->succ-prec = aux ->prec;

 

            delete aux;

}