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 :
- D’abord, l’utilisateur choisit s’il souhaite ou non charger une liste d’albums existante dans un fichier.
- Ensuite, un menu lui propose, en boucle, les options suivantes : ajouter un nouvel album, afficher un album ou quitter le programme.
- Enfin, il réalise la sauvegarde des albums dans le fichier.
Étape 1 : Conception globale
- Définir les types de données nécessaires.
- Définir l’analyse descendante.
Étape 2 : Conception détaillée
- Écrire en pseudo-code les sous-programmes manipulant des fichiers.
Étape 3 : Conception détaillée (avec tableau dynamique)
- Réécrire le type correspondant à l’ensemble des albums pour qu’ils soient stockés dans un tableau dynamique.
- Réécrire en pseudo-code les sous-programmes manipulant des fichiers.
Étape 4 : Implémentation
- Implémenter la partie structure : saisie des albums et affichage d’un album. Compiler, tester.
- 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 :
- Ajouter un nouvel album
- Afficher un album
- 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
- i=1 "Nom du son: 'La bohème'" => readln(newAlbum.sons[1]) = "La bohème"
- i=2 "Nom du son: 'Aime moi'" => readln(newAlbum.sons[2]) = "Aime moi"
- i=3 "Nom du son: 'Ça vient sans qu'on y pense'" => readln(newAlbum.sons[3]) = "Ça vient sans qu'on y pense"
- i=4 "Nom du son: 'Sarah'" => readln(newAlbum.sons[4]) = "Sarah"
- 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.