Salta ai contenuti. | Salta alla navigazione

Strumenti personali

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:

  1. Nel main, si invochi una procedura o funzione di lettura (punto 2) e una di elaborazione (punto 3), infine si stampi il risultato.
  2. 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.
  3. 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 funzione maggiore che andrà definita al punto 4
  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
    Nota: si richiede in questo punto di scrivere un algoritmo che elabora i singoli caratteri, senza convertire l'intera stringa in numero tramite una delle funzioni predefinite del linguaggio C

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);
}