#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int bool;
#define TRUE 1
#define FALSE 0
#define LUNGTARGA 7
#define MERITOMAX 20
#define LUNGNOME 20
typedef char TipoTarga[LUNGTARGA + 1];
typedef char TipoNome[LUNGNOME + 1];
typedef char TipoData[9];
typedef char TipoResponsabilita;
struct nodoLista {
TipoTarga targa;
int num_incidenti;
struct nodoLista *next;
};
typedef struct nodoLista NodoLista;
typedef NodoLista *TipoLista;
TipoLista CercaTarga(char *t, TipoLista lis)
{
TipoLista ris = NULL;
bool trovato = FALSE;
while (lis != NULL && !trovato)
if (strcmp(lis->targa, t) == 0) {
trovato = TRUE;
ris = lis;
}
else
lis = lis->next;
return ris;
}
TipoLista ContaIncidenti(char *nomefile)
{
FILE *finc;
TipoTarga targa;
TipoData data;
TipoResponsabilita resp;
TipoLista lis_incidenti = NULL, punt;
if ((finc = fopen(nomefile, "r")) == NULL) {
printf("Errore in apertura in lettura di %s\n", nomefile);
return NULL;
}
fscanf(finc, "%7s %8s %c", targa, data, &resp);
while (!feof(finc)) {
if (resp == 'S') {
punt = CercaTarga(targa, lis_incidenti);
if (punt == NULL) {
punt = malloc(sizeof(NodoLista));
strcpy(punt->targa, targa);
punt->num_incidenti = 1;
punt->next = lis_incidenti;
lis_incidenti = punt;
} else
punt->num_incidenti++;
}
fscanf(finc, "%7s %8s %c", targa, data, &resp);
}
fclose(finc);
return lis_incidenti;
}
void AggiornaClasse(int *classe, int ninc)
{
if (ninc == 0) {
if (*classe > 0)
(*classe)--;
} else
if (*classe + ninc * 2 > MERITOMAX)
*classe = MERITOMAX;
else
*classe += ninc * 2;
}
void AggiornaPolizze(char *nomefile, TipoLista lis_incidenti)
{
FILE *fpolizze, *fappoggio;
TipoTarga targa;
int classe;
TipoNome nome;
TipoLista punt;
int ninc;
if ((fpolizze = fopen(nomefile, "r")) == NULL) {
printf("Errore in apertura in lettura di %s\n", nomefile);
return;
}
if ((fappoggio = fopen("appoggio.dat", "w")) == NULL) {
printf("Errore in apertura in scritture di %s\n", nomefile);
return;
}
fscanf(fpolizze, "%7s %d %20s", targa, &classe, nome);
while (!feof(fpolizze)) {
punt = CercaTarga(targa, lis_incidenti);
if (punt == NULL)
ninc = 0;
else
ninc = punt->num_incidenti;
AggiornaClasse(&classe, ninc);
fprintf(fappoggio, "%s %2d %s\n", targa, classe, nome);
fscanf(fpolizze, "%7s %d %20s", targa, &classe, nome);
}
fclose(fpolizze);
fclose(fappoggio);
rename(nomefile, "polizze-orig.dat");
rename("appoggio.dat", nomefile);
}
void CancellaLista(TipoLista *lis)
{
TipoLista paux;
while (*lis != NULL) {
paux = *lis;
*lis = (*lis)->next;
free(paux);
}
}
int main(void)
{
char nome_file_incidenti[256], nome_file_polizze[256];
TipoLista lis;
printf("Immetti il nome di un file di incidenti: ");
scanf("%256s", nome_file_incidenti);
printf("Immetti il nome di un file di polizze: ");
scanf("%256s", nome_file_polizze);
lis = ContaIncidenti(nome_file_incidenti);
AggiornaPolizze(nome_file_polizze, lis);
CancellaLista(&lis);
return 0;
}