#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NumAtleti 6
#define LungSigla 13
typedef char TipoSigla[LungSigla];
struct Data {
int giorno, mese, anno;
};
typedef struct Data TipoData;
struct Farmaco {
TipoSigla sigla;
TipoData data;
struct Farmaco *next;
};
typedef struct Farmaco TipoFarmaco;
typedef TipoFarmaco *TipoListaFarmaci;
struct Atleta {
int matricola;
TipoListaFarmaci prescrizioni;
};
typedef struct Atleta TipoAtleta;
typedef TipoAtleta TipoArchivio[NumAtleti];
struct Doping {
TipoSigla sigla;
int ammesso;
TipoData data;
};
typedef struct Doping TipoDoping;
TipoListaFarmaci farmaciAmmessi(char *nome_file)
{
TipoListaFarmaci paux, lista_farmaci = NULL;
TipoDoping doping;
FILE *f;
f = fopen(nome_file, "r");
if (f == NULL) {
fprintf(stderr, "Errore in apertura in lettura del file %s\n", nome_file);
exit(1);
}
fscanf(f, "%s%d%d%*c%d%*c%d", doping.sigla, &doping.ammesso,
&doping.data.giorno, &doping.data.mese, &doping.data.anno);
while (!feof(f)) {
if (doping.ammesso) {
paux = malloc(sizeof(TipoFarmaco));
strcpy(paux->sigla, doping.sigla);
paux->data = doping.data;
paux->next = lista_farmaci;
lista_farmaci = paux;
}
fscanf(f, "%s%d%d%*c%d%*c%d", doping.sigla, &doping.ammesso,
&doping.data.giorno, &doping.data.mese, &doping.data.anno);
}
fclose(f);
return lista_farmaci;
}
int dataNonAnteriore(TipoData data1, TipoData data2)
{
return (data1.anno > data2.anno ||
(data1.anno == data2.anno &&
(data1.mese > data2.mese ||
(data1.mese == data2.mese && data1.giorno >= data2.giorno))));
}
void eliminaPrescrizione(TipoListaFarmaci *lista_farmaci, TipoDoping dop)
{
TipoListaFarmaci paux;
if (*lista_farmaci != NULL) {
eliminaPrescrizione(&(*lista_farmaci)->next, dop);
if (!strcmp((*lista_farmaci)->sigla, dop.sigla) &&
dataNonAnteriore((*lista_farmaci)->data, dop.data)) {
paux = *lista_farmaci;
*lista_farmaci = (*lista_farmaci)->next;
free(paux);
}
}
}
void eliminaPrescrizioniVietate(TipoArchivio archivio, char *nome_file)
{
FILE *f;
TipoDoping doping;
int i;
f = fopen(nome_file, "r");
if (f == NULL) {
fprintf(stderr, "Errore in apertura in lettura del file %s\n", nome_file);
exit(1);
}
fscanf(f, "%s%d%d%*c%d%*c%d", doping.sigla, &doping.ammesso,
&doping.data.giorno, &doping.data.mese, &doping.data.anno);
while (!feof(f)) {
if (!doping.ammesso) {
printf("Da eliminare: %s %d-%d-%d\n", doping.sigla,
doping.data.giorno, doping.data.mese, doping.data.anno);
for (i = 0; i < NumAtleti; i++)
eliminaPrescrizione(&archivio[i].prescrizioni, doping);
}
fscanf(f, "%s%d%d%*c%d%*c%d", doping.sigla, &doping.ammesso,
&doping.data.giorno, &doping.data.mese, &doping.data.anno);
}
fclose(f);
}
void leggiArchivio(TipoArchivio archivio, char *nome_file)
{
FILE *f;
int i, numfarmaci;
TipoListaFarmaci paux;
f = fopen(nome_file, "r");
if (f == NULL) {
fprintf(stderr, "Errore in apertura in lettura del file %s\n", nome_file);
exit(1);
}
for (i = 0; i < NumAtleti; i++) {
fscanf(f, "%d%d", &archivio[i].matricola, &numfarmaci);
archivio[i].prescrizioni = NULL;
for (; numfarmaci > 0; numfarmaci--) {
paux = malloc(sizeof(TipoFarmaco));
fscanf(f, "%s%d%*c%d%*c%d", paux->sigla, &paux->data.giorno,
&paux->data.mese, &paux->data.anno);
paux->next = archivio[i].prescrizioni;
archivio[i].prescrizioni = paux;
}
}
fclose(f);
}
void stampaArchivio(TipoArchivio archivio)
{
int i;
TipoListaFarmaci paux;
for (i = 0; i < NumAtleti; i++) {
printf("%2d: ", archivio[i].matricola);
paux = archivio[i].prescrizioni;
while (paux != NULL) {
printf(" %s %02d-%02d-%02d |", paux->sigla, paux->data.giorno,
paux->data.mese, paux->data.anno);
paux = paux->next;
}
printf("\n");
}
}
void stampaLista(TipoListaFarmaci farmaci)
{
while (farmaci != NULL) {
printf("%s %02d-%02d-%02d\n", farmaci->sigla,
farmaci->data.giorno,
farmaci->data.mese,
farmaci->data.anno);
farmaci = farmaci->next;
}
}
int main(void)
{
TipoListaFarmaci farmaci = NULL;
TipoArchivio archivio;
leggiArchivio(archivio, "prescriz.dat");
printf("Archivio prima dell'aggiornamento:\n");
stampaArchivio(archivio);
putchar('\n');
eliminaPrescrizioniVietate(archivio, "farmaci.dat");
printf("\nArchivio dopo l'aggiornamento:\n");
stampaArchivio(archivio);
farmaci = farmaciAmmessi("farmaci.dat");
printf("\nLista dei farmaci ammessi:\n");
stampaLista(farmaci);
return 0;
}