ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 11/01/2002 - C++
1. Sia dato un file chiamato elenco_persone.txt che contiene per ciascuna riga il nome di una persona (max 15 caratteri) e l’età corrispondente. Si scriva una funzione estrai_anziani() che calcola l’età media m delle persone contenute in elenco_persone.txt e costruisce un nuovo file dove vengono scritti i nomi delle persone contenute in elenco_persone.txt che hanno l’età maggiore di m.
2. Si scriva una funzione modifica(l, n) che riceve in ingresso il puntatore l ad una lista semplice a valori interi e un valore intero n. La funzione modifica la lista l nel modo seguente:
· elimina tutti gli elementi che hanno il campo informativo multiplo di n;
· ed infine la rende circolare.
3. Sia data una stringa alfa composta da 12 caratteri. Si scriva una funzione booleana ok=estraibile(s) che riceve in ingresso una stringa s e che restituisce T se alfa contiene tutti i caratteri necessari a comporre s, F altrimenti.
Esempio: se alfa = MSAUCEOORTPE
e s = COMPUTER è T
se s = TORPORE è F
4. Dati i numeri decimali A=101, B=63 e C=-129, 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=A+B e si dica se il risultato è o no significativo
Punteggio:
Es.1 |
Es.2 |
Es.3 |
Es.4 |
10 |
10 |
10 |
3 |
_________________________________________________________________
Es. 1
#include
<fstream.h>
void estrai_anziani() {
fstream f,g;
char nome[16];
int eta=0;
int tot_eta=0;
int cont=0;
int m;
f.open(“elenco_persone.txt”, ios::in);
while(f>>nome>>eta)
{ tot_eta+=eta;
cont++;
}
if(cont==0) { cout<<”file vuoto”;
return;
}
m=tot_eta / cont;
f.close();
f.open(“elenco_persone.txt”, ios::in);
g.open(“elenco_anziani.txt”, ios::out);
while (f>>nome>>eta)
if (eta>m) g<<nome<<”\n”;
f.close();
g.close();
}
Es.2
struct elem
{ int info;
elem* next; };
void
modifica(elem *&l, int n) {
elem *aux1=l;
while ((l->info%n == 0) && (l!=0)) //estrazione dalla testa della lista
{ l=l->next;
delete aux1;
aux1=l; }
if(l==0) return; //lista vuota
elem *aux2=aux1;
for(; aux1!=0;
aux1 = aux1->next) //estrazione
non in testa
{ if(aux1->info % n !=0)
aux2=aux1;
else { aux2->next = aux1->next;
delete aux1;
aux1=aux2; }
}
aux2->next=l; //lista resa circolare
}
Es. 3
bool
estrazione(char *s, char alfa[13])
{
int usati
[12];
int j;
for (int
i=0; i<12; i++)
usati[i]=0;
for(i=0;
s[i]!=0; i++)
{ j=0;
for(j=0; j<13; j++)
{ if(s[i]==alfa[j]&&usati[j]==0)
{ usati[j]++;
break; }
}
if(j==13) return F;
}
return T;
}