ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 17/09/2004 - C++

 

1.        Un file chiamato dati.txt contiene per ciascuna riga una stringa di lunghezza massima 24 caratteri che rappresenta il nome di uno studente e un valore intero che ne rappresenta il numero di matricola. Scrivere una funzione trasforma() che modifica il file dati.txt in modo tale che contenga soltanto due righe del file originario: quella relativa al numero di matricola più grande e quella relativa al numero di matricola più piccolo.         

2.        Sia data una lista semplice l i cui elementi hanno due campi informativi di tipo intero. Si scriva una funzione modifica(l) che elimina dalla lista l quegli elementi che hanno entrambi i campi informativi pari.         

3.      Siano date due matrici quadrate M1 e M2 entrambe di dimensione NxN a  valori booleani (0/1). Si scriva una funzione booleana ok=controlla_contenuto(M1, M2) che restituisce true se entrambe le matrici contengono lo stesso numero di elementi con valore 0, false altrimenti.      

4.      Dati i numeri decimali A=97, B=-161 e C=101, 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.          

 

 

 

 

 

 

Punteggio:

Es.1

Es.2

Es.3

Es.4

11

10

9

3

 

 

 

1.

#include <fstream.h>

#include <string.h>

 

void trasforma()

{

fstream f;

int num;

char nome[25];

int matr_max, matr_min;

char nome_max[25], nome_min[25];

f.open(“dati.txt“, ios::in);

 

if(f>>nome_max>>matr_max);

else

{     f.close();

return; }

if(f>>nome_min>>matr_min);

else

{f.close();

return; }

if(matr_min>matr_max)

{      num=matr_min;

       matr_min=matr_max;

       matr_max=num;

       strcpy(nome, nome_min),

       strcpy(nome_max, nome_min);

       strcpy(nome_max, nome);

}

while(f>>nome>>num)

{      if(num>matr_max)

       {           strcpy(nome_max, nome);

                   matr_max=num;

       }

       if(num<matr_min)

       {           strcpy(nome_min, nome);

                   matr_min=num;

       }

}

f.close();

f.open(“dati.txt”, ios::out);

f<<nome_min<<” “<<matr_min<<”\n”<<nome_max<<” “<<matr_max;

f.close();

}

 

2.

struct elem {     int info1;

                        int info2;

                        elem *next;

            };

 

void elimina(elem *&l)

{

elem *aux1, *aux2;

if(l==0) return;

aux1=l;

 

//  eliminazione dalla testa della lista

while(l!=0 && l->info1%2==0 && l->info2%2==0)

{           l=l->next;

            delete aux1;

            aux1=l;

}

if(l==0) return;

aux2=l->next;

while(aux2!=0)

{           if(aux2->info1%2==0 && aux2->info2%2==0)

            {           aux1->next=aux2->next;

                        delete aux2;

                        aux2=aux1->next;

            }

            else

            {           aux1=aux1->next;

                        aux2=aux2->next;

            }

} }

 

3.

const int N=12;

boolean controlla_contenuto(boolean M1[N][N], boolean M2[N][N])

{

int cont1=0;

int cont2=0;

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

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

                        {           if(M1[i][j]) cont1++;

                                   if(M2[i][j]) cont2++;

                        }

if(cont1==cont2) return true;

return false;

}