/******************************************************************************
 * Autore: docente Ing. Di Giusto Sandro                                      *
 * Data: 24/08/2009                                                           *
 * Oggetto: Compito Fondamenti di Informatica I del 22/01/2009                *
 * Dettagli: Risoluzione proposta per il 1° esercizio                         *
 * Note: La risoluzione dell'esercizio e' piuttosto semplice, poichè l'unica  *
 * complessità è data dal dovere leggere correttamente campi di tipo e con    *
 * vincoli diversi (stringhe senza spazi, con spazi, numeri, ...). La         *
 * robustezza è mediocre, restando il programma molto legato alla corretta    *
 * formattazione dei dati di input.                                           *
 ******************************************************************************/

 
#include <stdio.h>   /* header per FILE, fopen, fclose, fgetc, ... */
#include <stdlib.h>  /* header per exit, ... */
#include <string.h>   /* header per strcpy, ... */
#define MAX_LEN_COGNOME 30 
#define FILE_INPUT_ANAGRAFICA "anagrafica.txt"
  
  
struct Data {
  unsigned int giorno;
  unsigned int mese;
  unsigned int anno;
};


void CercaGiovane(char file_input[], char cognome[]);
int ComparaDate(struct Data d1, struct Data d2);


void CercaGiovane(char file_anagrafica[], char cognome_giovane[]) {
  FILE* f_input=NULL;
  char ch, cognome[MAX_LEN_COGNOME+1];
  int index=0;
  struct Data tmp_data, min_data={-1, -1, -1};
  if ( (f_input=fopen(file_anagrafica, "r")) == NULL) {
    perror("Terminazione anomala del programma!");
    exit(EXIT_FAILURE);
  }
  while (!feof(f_input)) {
    index=0;
    fscanf(f_input, "%*s%*s");  /* Scarto numero progressivo e matricola */
    if (feof(f_input))
      break;  /* Evito il caso di un file di input con una riga vuota al termine */
    while ( ((ch=fgetc(f_input)) != ',' && !feof(f_input)) );  /* Scarto il nome */
    fgetc(f_input);  /* Butto via lo spazio dopo la virgola dopo il nome */
    while ( (ch=fgetc(f_input)) != ',' && !feof(f_input) ) 
      cognome[index++]=ch; 
    cognome[index]='\0';
    fgetc(f_input);  /* Butto via lo spazio dopo la virgola dopo il cognome */
    fscanf(f_input, "%d/%d/%d", &tmp_data.giorno, &tmp_data.mese, &tmp_data.anno);
    while ( ((ch=fgetc(f_input)) != '\n' && !feof(f_input)) );  /* Scarto il commento finale */
    // Se è la prima riga che leggo o se la data trovata è più recente della minima precedente, aggiorno la data minima ed il cognome associato */
    if ( (min_data.anno==-1) || (ComparaDate(tmp_data, min_data)>0) ) {
      min_data = tmp_data;
      strcpy(cognome_giovane, cognome);
    }  
  }
}


int ComparaDate(struct Data d1, struct Data d2) {
  if (d1.anno==d2.anno && d1.mese==d2.mese && d1.giorno==d2.giorno)
    return 0;
  if (d1.anno<d2.anno || ((d1.anno==d2.anno) && (d1.mese<d2.mese)) || (d1.anno==d2.anno && d1.mese==d2.mese && d1.giorno<d2.giorno))
    return -1;
  else
    return 1;
}


int main() {
  char cognome_giovane[MAX_LEN_COGNOME+1];
  CercaGiovane(FILE_INPUT_ANAGRAFICA, cognome_giovane);
  printf("Il cognome dello studente piu' giovane e': %s \n", cognome_giovane);
  return 0;  /* Equivalente a exit(EXIT_SUCCESS); */
} 

