ESAME DI FONDAMENTI DI INFORMATICA - SIMONCINI – 1/2/2001 - C++
1. La gestione dei ricoveri in una clinica è
basata su un criterio di priorità. Ad ogni paziente in lista di attesa è
assegnata un priorità e la scelta di chi ricoverare viene effettuata selezionando,
fra quelli aventi priorità più alta, coloro che sono in attesa da più tempo. La
lista di attesa è rappresentabile mediante una lista doppia i cui elementi
contengono un campo nome (stringa di al più 30 caratteri) e un campo intero
maggiore di zero che rappresenta la priorità.
Le possibili operazioni sono:
• attesa(): costruttore che crea una
lista vuota;
• inserimento(name, p): inserisce un nuovo paziente di nome name e priorità p nella lista di attesa. Il nuovo paziente
deve essere inserito opportunamente tenendo conto della priorità e dell’ordine
temporale di inserimento nella lista;
• ricovero(): se la lista non è vuota, elimina dalla lista il paziente da ricoverare
e ne stampa il nome sul monitor restituendo T, altrimenti restituisce F;
• ~attesa(): distruttore che dealloca la lista di attesa.
2. Un file chiamato elenco.dat contiene per ciascuna riga
un valore booleano, una stringa e un valore intero. Scrivere una funzione ok =
cerca(n) che
stampa sul monitor le stringhe del file che hanno sulla stessa riga il valore
booleano uguale a T e il valore intero superiore a n. Se almeno una stringa viene trovata, la
funzione restituisce T, altrimenti restituisce F.
3.
Si
scriva una funzione ok=verifica(s1,
s2) che riceve
in ingresso due stringhe di lunghezza qualsiasi. La funzione controlla se le
lunghezze delle due stringhe sono l’una multipla dell’altra e in questo caso
restituisce T altrimenti restituisce F (la funzione non deve far uso
di funzioni della libreria string.h).
4. Data la seguente mappa di Karnaugh si
determini il valore delle uscite non specificate in modo da ottenere la forma
minima ottimale. Si disegni infine il circuito corrispondente.
AB
00 01 11 10
C
0 |
1 |
|
- |
1 |
1 |
|
1 |
- |
- |
12 |
9 |
9 |
3 |
1.
//attesa.h
struct elem {
char*
nome;
int
priorità;
elem*
next;
elem * prec; }
enum bool {F, T};
class attesa {
elem*
l;
public:
attesa()
{l=0};
void inserimento (char* nome, int
p);
bool ricovero ();
~attesa();
}
//attesa.cc
#include <iostream.h>
#include <string.h>
#include "attesa.h"
void
attesa::inserimento(char* nome, int p)
{
elem aux, np;
if
(p<=0) { cout<< “la priorità deve essere maggiore di zero\n“;
return; }
new elem np ;
np->priorità
= p;
strcpy (nome, np->name);
if (l ==
0) { //
inserimento in lista vuota
np->next =0;
np
->prec = 0;
l=np;
return;
}
aux =l;
if(aux->priorità
< p) //inserimento
in testa alla lista
{
aux->prec=np;
np->next=aux,
np->prec=0 ;
l=np ;
return ;
}
while ((aux ->next !=0) && (aux->next
->priorità >= p))
aux = aux->next;
if
(aux->next ->priorità < p) //
inserimento all’interno della lista
{
np
->next = aux ->next;
np -> prec = aux;
aux ->next =
np ;
aux->next->prec = np ; }
else{ //
inserimento in coda alla lista
aux ->next
=np ;
np
-> prec = aux ;
np
>next = 0 ;
}
}
bool
attesa::ricovero ()
{
if
(l==0) return F;
cout
<< l->nome << “\n”;
l=l->next;
delete l;
return T;
}
attesa::~attesa() {
elem* aux=l;
while
(aux!=0) {
l=l->next;
delete aux;
aux = l;
}
}
2.
#include <fstream.h>
bool
cerca(int n)
{
fstream
f;
int num;
bool vb;
char
*stringa;
bool
controllo=F;
f.open (“elenco.dat”, ios::in);
while(f>>vb>>stringa>>num)
{
if (vb && (num>n))
{
cout<<
stringa <<”\n”;
controllo
= T;
}
}
f.close();
return controllo;
}
3.
enum bool {F, T};
bool verifica (char s1[N], char s2[N])
{
int i=0;
int j =0;
while((s1[i]!=0) && (s2[i]!=0))
i++;
if (s1[i] == s2[i])
return T;
if (s1[i]==0)
{ j=i,
while
(s2[j] !=0)
j++;
}
else {
j=i,
while (s1[j] !=0)
j++;
}
if ((j)%(i) == 0) return T;
return F;
}
4.
AB 00 01 11 10
C
0 |
1 |
|
|
1 |
1 |
|
1 |
1 |
|
_
_
CB + CB