8 febbraio 2010
Fondamenti di Informatica 1 - Compito A
Prof. Marco Gavanelli
8 Febbraio 2010
Esercizio (punti 16)
Il file binario analisi.bin contiene i dati sulle analisi del sangue di un paziente. Per ciascuna analisi, si sanno le seguenti informazioni:
- identificatore
- : stringa che contiene al massimo 4 caratteri, più il terminatore
- leucociti
- : numero di leucociti, intero
- colesterolo
- : float
L'identificatore rappresenta un numero intero, che viene incrementato ogni volta che il laboratorio effettua una nuova analisi (anche di pazienti diversi). In altre parole, la prima analisi fatta dal laboratorio è identificata da "1", la seconda da "2" e così via. Il file analisi.bin , invece, contiene solo le analisi di un paziente, che sono al massimo 100 e non sono ordinate. Purtroppo, però, il tipo dell'identificatore non è int
, ma è stringa: ad esempio il numero 1532 è rappresentato dal seguente array di caratteri
'1' | '5' | '3' | '2' | '\0' |
Si desidera trovare i dati sull'analisi che ha identificatore che corrisponde al numero più grande.
Ad esempio, se due identificatori sono "15" e "8" si dovrà fornire "15". Si noti che la strcmp
, invece, utilizza un ordine lessicografico, quindi dice che la stringa "8" viene dopo la stringa "15", in quanto il carattere '8' viene dopo il carattere '1'.
Si utilizzi il seguente algoritmo:
- Nel
main
, si invochi una procedura o funzione di lettura (punto 2) e una di elaborazione (punto 3), infine si stampi il risultato. - Si legga il file analisi.bin e se ne porti il contenuto in un opportuno array di strutture; si mostri poi a video il contenuto del file.
- La procedura o funzione di elaborazione prende come parametro l'array letto al punto 2 (più eventualmente altri parametri) e fornisce al
main
l'analisi che ha identificatore più grande (come spiegato in precedenza). Per fare questo, invoca una funzionemaggiore
che andrà definita al punto 4 - Si implementi la funzione
maggiore
che prende in ingresso due stringhe e restituisce- 1 se la prima stringa rappresenta un numero maggiore di quello rappresentato dalla seconda
- 0 altrimenti
Facoltativo (3 punti)
Si svolga l'esercizio considerando il file analisi2.bin. In questo file, per ciascuna analisi ci sono le seguenti informazioni:
- giorno
- : stringa che contiene al massimo 2 caratteri, più il terminatore. Rappresenta un numero e può assumere i valori da "1" a "31"
- mese
- : stringa che contiene al massimo 3 caratteri, più il terminatore. Può avere i valori "gen", "feb", "mar", ..., "dic".
- anno
- : stringa che contiene al massimo 4 caratteri, più il terminatore. Rappresenta un anno (es. "2010").
- leucociti
- : numero di leucociti, intero
- colesterolo
- : float
Si vuole trovare l'ultima analisi in ordine temporale.
Soluzione
#include <stdio.h>
typedef struct
{
char id[5];
int leucociti;
float colesterolo;
} analisi;
#define DIM 100
int maggiore(char a[],char b[])
{
int i=0;
// Scorro le 2 stringhe finche' non trovo il terminatore di una
while (a[i]!=0 && b[i]!=0)
i++;
// Se le 2 stringhe hanno lo stesso numero di cifre,
// allora cerco la prima cifra diversa
if (a[i]==0 && b[i]==0)
{ i=0;
while (a[i]==b[i])
i++;
if (a[i]>b[i])
return 1;
else
return 0;
}
// se hanno numero di cifre diverso, il maggiore e` quello che ha piu` cifre
if (a[i] == 0)
return 0;
else
return 1;
}
int lettura(analisi A[])
{
int i,n;
FILE *fp;
fp = fopen("analisi.bin","rb");
n=fread(A,sizeof(analisi),DIM,fp);
fclose(fp);
for (i=0;i<n;i++)
printf("%s %d %f\n",A[i].id,A[i].leucociti,A[i].colesterolo);
return n;
}
void massimo(analisi A[],int n, analisi *m)
{
int i;
*m=A[0];
for(i=1;i<n;i++)
if (maggiore(A[i].id,(*m).id))
*m=A[i];
}
main()
{
analisi A[DIM],m;
int n;
n=lettura(A);
massimo(A,n,&m);
printf("L'analisi che ha identificatore massimo e`:\n");
printf("%s %d %f\n",m.id,m.leucociti,m.colesterolo);
}