Explication résonnement TD - Thomas-Zabalo/PASCAL GitHub Wiki

Énoncé

Nous allons écrire un programme permettant de saisir des informations sur des albums de musique. Ces informations seront ensuite stockées dans, puis lues depuis un fichier (nommé musique.dat). Les informations que nous voulons conserver sur les albums sont : le nom de l’auteur ou du groupe, le nom de l’album, la liste des titres, et l’année de sortie.

Le programme doit permettre de gérer un ensemble d’albums à l’aide d’un tableau statique. Il comprend quatre étapes principales :

  1. D’abord, l’utilisateur choisit s’il souhaite ou non charger une liste d’albums existante dans un fichier.
  2. Ensuite, un menu lui propose, en boucle, les options suivantes : ajouter un nouvel album, afficher un album ou quitter le programme.
  3. Enfin, il réalise la sauvegarde des albums dans le fichier.

Étape 1 : Conception globale

  1. Définir les types de données nécessaires.
  2. Définir l’analyse descendante.

Étape 2 : Conception détaillée

  1. Écrire en pseudo-code les sous-programmes manipulant des fichiers.

Étape 3 : Conception détaillée (avec tableau dynamique)

  1. Réécrire le type correspondant à l’ensemble des albums pour qu’ils soient stockés dans un tableau dynamique.
  2. Réécrire en pseudo-code les sous-programmes manipulant des fichiers.

Étape 4 : Implémentation

  1. Implémenter la partie structure : saisie des albums et affichage d’un album. Compiler, tester.
  2. Implémenter la partie fichier : sauvegarde des albums dans un fichier et lecture d’une liste d’albums dans un fichier. Compiler, tester.

Comment j'ai raisonné

Étape 1 : Conception globale

Typage des données

1. Album

On commence par définir les types nécessaires pour cette application. Un album contient un artiste ou un groupe, un nom d’album, une année de sortie et une liste de titres.

Cela se traduit par la création du type Album, qui contient les données suivantes :

type 
  Album = record
    artisteGroup: String;
    nomAlbum: String;
    sons: Array[1..10] of String;
    anneeSortie: Integer;
end;
  AlbumTab = Array[1..100] of Album

2. Premier choix de l'utilisateur

Lors du lancement de l’application, l’utilisateur doit choisir s’il souhaite charger un album depuis un fichier. On crée alors un type ResponseUser, qui agit comme un booléen, renvoyant True ou False. En fonction de la réponse de l’utilisateur, le programme interagira avec différentes fonctions ou procédures.

type ResponseUser = (Oui, Non);

var
  response: ResponseUser;

begin
  writeln("Voulez-vous charger de la musique ? (Oui/Non)");
  readln(response);

  case response of
    Oui: Charger le fichier de musique;
    Non: Ne fait rien pour l'instant;
  end;

3. Boucle infinie

Une boucle infinie est nécessaire pour afficher un menu à l’utilisateur, avec trois options :

  1. Ajouter un nouvel album
  2. Afficher un album
  3. Quitter le programme
type ChoiceUser = (add, show, exit);

var
  choice: ChoiceUser;

begin
  { Boucle infinie pour le menu }
  while true do
  begin
    writeln('Voulez-vous ajouter un nouvel album? Afficher un album ? ou quitter le programme ? (add/show/exit)');
    readln(choice);
    
    case choice of
      add: AddAlbum; { Fonction pour ajouter un album }
      show: ShowAlbums; { Fonction pour voir un album }
      exit: 
        begin
          writeln('Merci d''avoir utilisé le programme. Au revoir !');
          break; { Quitter le programme }
        end;
    else
      writeln('Choix invalide. Veuillez entrer "add", "show" ou "exit".');
    end;
  end;
end.

4. Sauvegarde des fichiers

Bon je ne suis pas un expert pour ça, mais j'ai trouvé une méthode sur un WIKI :

program CreateFile;

{$mode objfpc}

uses
 Sysutils;

const
  C_FNAME = 'textfile.txt';

var
  tfOut: TextFile;

begin
  // Set the name of the file that will be created
  AssignFile(tfOut, C_FNAME);

  // Use exceptions to catch errors (this is the default so not absolutely requried)
  {$I+}

  // Embed the file creation in a try/except block to handle errors gracefully
  try
    // Create the file, write some text and close it.
    rewrite(tfOut);

    writeln(tfOut, 'Hello textfile!');
    writeln(tfOut, 'The answer to life, the universe and everything: ', 42);

    CloseFile(tfOut);

  except
    // If there was an error the reason can be found here
    on E: EInOutError do
      writeln('File handling error occurred. Details: ', E.ClassName, '/', E.Message);
  end;

  // Give feedback and wait for key press
  writeln('File ', C_FNAME, ' created if all went ok. Press Enter to stop.');
  readln;
end.

Structure descendante

Bon je l'ai faite en français mais dans l'idée ça serait ça

Demander si l'utilisateur veut charger un album
Si oui, renvoyer la procédure de la liste des albums
Si non, renvoyer à la boucle infinie

procédure liste des albums
  Demander quel album il veut ouvrir
  Afficher les informations sur l'album

boucle infinie
  Demander ce qu'il veut faire
  1. Ajouter un album
  2. Voir un album
  3. Quitter l'application
  Si choix = "add", renvoyer vers la fonction d'ajout
  Si choix = "show", renvoyer vers la procédure de la liste des albums
  Si choix = "exit", sortir du programme

fonction pour ajouter un album
  Demander le nom de l'artiste
  Demander le nom de l'album
  Demander les titres des sons
  Ajouter chaque titre à un tableau ou utiliser une boucle pour ajouter les titres jusqu'à ce que l'utilisateur indique qu'il a terminé (par exemple en tapant "stopAjout")
  Demander l'année de sortie

Puis, sauvegarder le nouvel album dans le tableau d'albums.

Création des différentes fonctionnalités de l'application:

  • Voir l'album
  • Ajouter un album
  • Sauvegarder dans le fichier

Voir l'album

Ajouter l'album

Pour la fonction ajouter un album, c'est très simple on veut d'abord récupérer les valeurs que l'utilisateur donnera, donc on lui pose la question puis on récupère la valeur qui nous donne.

  writeln('Quel est le nom de l''album ?');
  readln(nomAlbum);
  ....

Il faut également précisé qu'on va l'ajouter dans le tableau qu'on à créer

function AddAlbum: Album;
var
  newAlbum: Album;

Qui change donc la valeur du readln, on passe de readln(nomAlbum); à readln(newAlbum.nomAlbum);.

Par la suite on réfléchie aux autres questions, qu'on va lui posé et on regarde s'il y a pas d'autre condition à mettre. Ici oui on veut probablement ajouter plusieurs sons à notre playlist, donc on va faire un boucle pour ajouter x sons à la playlist

function AddAlbum: Album;
var
  newAlbum: Album;
  i: Integer;
begin
  writeln('Combien de sons comporte cet album ? (max 10)');
  readln(nbSons);
    for i := 1 to nbSons do
      begin
       writeln('Quel est le nom du son ', i, ' ?');
       readln(newAlbum.sons[i]);
    end;
end;

Ici on demande à l'utilisateur combien de son il veut ajouter maximum 10 sons, car on à défini la limite à 10 dans notre array titre au début, on peut le changer comme on veut. Après avoir donner combien de son on veut, on fait la condition, en français ça donne pour i=5:

Pour chaque i, donc 5 je réalise ma condition

Ici on lui dit juste une question et une réponse avec bien évidemment le readln sur le newalbums.sons[i], ce qui signifie qu'a chaque fois on va ajouter un nouveau son, qui auront des identifiants différents. Ex: Pour i = 5

  1. i=1 "Nom du son: 'La bohème'" => readln(newAlbum.sons[1]) = "La bohème"
  2. i=2 "Nom du son: 'Aime moi'" => readln(newAlbum.sons[2]) = "Aime moi"
  3. i=3 "Nom du son: 'Ça vient sans qu'on y pense'" => readln(newAlbum.sons[3]) = "Ça vient sans qu'on y pense"
  4. i=4 "Nom du son: 'Sarah'" => readln(newAlbum.sons[4]) = "Sarah"
  5. i=5 "Nom du son: 'Plus rien'" => readln(newAlbum.sons[5]) = "Plus rien"

Donc on se retrouve avec un Album de ce genre Nom de l'album: La bohème Nom de l'artiste: Aznavour Son de l'album:

  • La bohème
  • Aime moi
  • Ça vient sans qu'on y pense
  • Sarah
  • Plus rien Année de création:
function AddAlbum: Album;
var
  newAlbum: Album;
  i: Integer;
begin
  writeln('Quel est le nom de l''album ?');
  readln(newAlbum.nomAlbum);
  
  writeln('Quel artiste ou groupe l''a produit ?');
  readln(newAlbum.artisteGroup);
  
  writeln('Combien de sons comporte cet album ? (max 10)');
  readln(nbSons);
  
  for i := 1 to nbSons do
  begin
    writeln('Quel est le nom du son ', i, ' ?');
    readln(newAlbum.sons[i]);
  end;
  
  writeln('En quelle année cet album est-il sorti ?');
  readln(newAlbum.anneeSortie);
  
  AddAlbum := newAlbum; // Retourne le nouvel album
end;

Sauvegarder le fichier

Code

Pour les procédure Charger et sauvegarder je ne sais pas comment faire pour l'instant

type 
  Album = record
    artisteGroup: String;
    nomAlbum: String;
    sons: Array[1..10] of String;
    anneeSortie: Integer;
end;
  AlbumTab = Array[1..100] of Album;
  ChoiceUser = (add, show, exit);
  ResponseUser = (Oui, Non);

var
  choice: ChoiceUser;
  response: ResponseUser;
  albums: AlbumTab;
  nbAlbums: Integer;
  nbSons: Integer;

procedure ChargerAlbums();
var
begin
end;

function AddAlbum: Album;
var
  newAlbum: Album;
  i: Integer;
begin
  writeln('Quel est le nom de l''album ?');
  readln(newAlbum.nomAlbum);
  
  writeln('Quel artiste ou groupe l''a produit ?');
  readln(newAlbum.artisteGroup);
  
  writeln('Combien de sons comporte cet album ? (max 10)');
  readln(nbSons);
  
  for i := 1 to nbSons do
  begin
    writeln('Quel est le nom du son ', i, ' ?');
    readln(newAlbum.sons[i]);
  end;
  
  writeln('En quelle année cet album est-il sorti ?');
  readln(newAlbum.anneeSortie);
  
  AddAlbum := newAlbum; // Retourne le nouvel album
end;

procedure SauvegarderAlbums();
var
begin
end;

procedure question;
begin
  while true do
  begin
    writeln('Que voulez-vous faire ? (add/show/exit)');
    readln(choice);
    
    case choice of
      add: 
        begin
          nbAlbums := nbAlbums + 1;
          albums[nbAlbums] := AddAlbum; 
        end;
      show: ShowAlbums;
      exit: 
        begin
          writeln('Merci d''avoir utilisé le programme. Au revoir !');
          SauvegarderAlbums(); // Sauvegarde avant de quitter
          break;
        end;
    else
      writeln('Choix invalide. Veuillez entrer "add", "show" ou "exit".');
    end;
  end;
end;

begin
  nbAlbums := 0;
  writeln('Voulez-vous charger de la musique ? (Oui/Non)');
  readln(response);

  case response of
    Oui: ChargerAlbums();
    Non: ;
  end;

  question;
end.