TP #2 : Listes contigues et fichiers

Objectifs

  • Savoir déclarer un type structure en C, déclarer des variables de ce nouveau type et utiliser ces variables dans des fonctions C.
  • Savoir implémenter les listes contiguës en C en utilisant les structures, écrire les fonctions de base pour ajouter et retirer des éléments.
  • Savoir lire des fichiers, écrire dans des fichiers pour importer / exporter des données.

Contexte: Nous travaillerons sur les matches de la saison régulière 2022-23 de la NBA (ligue de basket-ball nord-américaine). Chaque match est représenté par une structure contenant les informations suivantes:

  • la date du match au format YYYY-MM-DD
  • les deux équipes (team1 et team2) qui sont représentées par leur acronyme sur 3 lettres (par exemple: BOS pour les Boston Celtics)
  • leur classement ELO (analogie avec les échecs), plus le score est elevé, meilleure est l’équipe. Est calculé le classement ELO avant le match (elo1_pre pour l’équipe 1 et elo2_pre pour l’équipe 2), la probabilité de victoire suivant cet ELO (elo_prob1 pour l’équipe 1 et elo_prob2 pour l’équipe 2) et enfin pour les matches écoulés le classement ELO recalculé après le match (elo1_post pour l’équipe 1 et elo2_post pour l’équipe 2). Toutes ces valeurs sont des réels
  • le score du match (score1 = nombre de points de l’équipe 1, score2 = nombre de points de l’équipe 2) avec des entiers
  • la qualité des deux équipes (quality entier)
  • l’importance du match (importance entier)
  • une évaluation du match (total_rating entier)

Les données viennent du site 538 et sont stockées au format CSV dont voici un extrait

date,team1,team2,elo1_pre,elo2_pre,elo_prob1,elo_prob2,elo1_post,elo2_post,score1,score2,quality,importance,total_rating
2022-10-18,BOS,PHI,1657.63974912662,1582.24732707837,0.7329496792169642,0.2670503207830358,1662.1988835837,1577.68819262129,126,117,96,13,55
...

Il s’agit d’une représentation tabulaire où chaque colonne est séparée par une virgule. Quand, pour une colonne donnée, il n’y a pas de valeur dans ce cas il n’y aucun caractère.

Les données complètes sont téléchargeables ici

Questions

N’oubliez pas de tester vos fonctions au fur et à mesure pour s’asssurer de leur bon fonctionnement !

  1. En vous inspirant du premier TP, créer un fichier reponse.c et reponse.h qui vous devrez envoyer à la fin de la deuxième séance.
  2. Écrire une fonction qui ouvre un fichier passé en paramètre (au hasard nba_2023.csv) et qui l’affiche ligne par ligne puis le ferme. Le prototype de la fonction sera void print_file_content(char filename[]);
  3. Écrire une fonction qui, à partir d’une chaîne de caractères, permet d’isoler les différents champs séparés par une virgule. Pour cela vous pouvez utiliser la fonction scanf.
  4. Écrire (en modifiant la première question) une fonction qui ouvre un fichier en paramètre et qui analyse chacune des lignes en appelant votre fonction de la question 2. Le prototype de la fonction void process_file(char filename[]);.
  5. Déclarer une structure de données de match comme décrit dans la partie objectifs. Le nom de votre structure devra être struct nba_game_t;
  6. Déclarer une liste contigue de matchs (taille maximale 1230). Le nom de votre structure devra être struct nba_season_t;
  7. À partir des questions précédentes écrire une fonction qui charge un fichier CSV de matches et qui stocke les données dans une liste contigüe. Le prototype de la fonction void process_file_into_list(char filename[], struct nba_season_t * m);.
  8. Écrire une fonction qui affiche les matches de votre structure déjà joués . Le prototype de la fonction void display_played_games(struct nba_season_t m);. On pourra par exemple utiliser l’affichage suivant:
     2022-10-18  
         BOS 126 -- PHI 117
         GSW 123 -- LAL 109
     2022-10-19  
         DET 113 -- ORL 109
         IND 107 -- WAS 114
         MIA 108 -- CHI 116
         TOR 108 -- CLE 105
         MEM 115 -- NYK 112
         BRK 108 -- NOP 130
         ATL 117 -- HOU 107
         MIN 115 -- OKC 108
         SAS 102 -- CHO 129
         UTA 123 -- DEN 102
         PHO 107 -- DAL 105
         SAC 108 -- POR 115
    
  9. Écrire une fonction qui détermine quelle est la meilleure équipe (score ELO le plus élevé). Le prototype de la fonction void compute_best_team(struct nba_season_t m, char team[3]);.
  10. Écrire une fonction qui liste les matches où le favori (meilleur ELO des deux équipes) a perdu la rencontre. Le prototype de la fonction void list_wrong_bets(struct nba_season_t m);. La ligne suivante du fichier est un exemple de match où le favori (MIA) a perdu 108-116
     2022-10-19,MIA,CHI,1617.95310870384,1447.48900636508,0.8259104491351971,0.17408955086480293,1598.81471441712,1466.6274006518,108,116,76,19,48
    
  11. Écrire une fonction qui donne pour chaque équipe le nombre de victoires et de défaites. Le prototype de la fonction voidlist_wins_losses_team(struct nba_season_t m, char team[3]);.
  12. Écire une fonction qui trie par nombre de victoires décroissant le résultat de la fonction précédente. Le prototype de la fonction void list_wins_losses_team_sorted(struct nba_season_t m, char team[3]);.