Problème sur la table de hashage

Résolu
laisso -  
 laisso -
Bonjour,

J'ai des difficultés pour exécuter les questions 4 5 et 6. Merci de bien vouloir m'aiguiller.


#Construire un programme proposant ces fonctionnalités :


#* Au chargement, on a au moins 4 abonnés dont un à 0 DVD et un à undef.

#* On boucle sur un menu proposant :




#1. afficher la DVDthéque
#2. ajouter un abonné
#3. supprimer un abonné
#4. emprunt d'un ou plusieurs DVD
#5. retour d'un ou plusieurs DVD
#6. quitter



#On aidera l'utilisateur à tout moment du mieux qu'on peut, exemples (non exhaustifs) :




#* 2 : on affiche la liste des abonnés pour lui montrer ceux qui existent déjà. On vérifie que le nouvel entrant n'existe pas sinon, message.
#* 3 : on affiche la liste des abonnés avec des numéros pour qu'il puisse indiquer rapidement celui qu'il veut supprimer. On boucle sur une saisie blindée sur ces numéros-là.
#* 4 : la liste des abonnés est affichée comme ci-dessus.
#* 5 : idem ci-dessus et on vérifie qu'un abonné ne peut pas rendre plus de DVD qu'il n'en a.


#!/usr/bin/perl

# La liste des emprunteurs est donnée par une table de hachage %abonnes

# Clé : indentifiant = prénom pour simplifier

# Valeur : nb de DVD empruntés

# Création de la table :

$abonnes{"Guillaume"} = 3;
$abonnes{"Maxime"} = 15;
$abonnes{"Anne"} = 0; # abonné qui a déjà emprunté mais aucun emprunt en cours
$abonnes{"Michel"} = undef;

# Affichage

print("\n\nAffichage de la DVDthèque");
while (($prenom,$nbDVD) = each %abonnes) {
print "\n$prenom est abonné";
# si le nb de DVD n'est pas undef
if (defined($nbDVD)) {
print("\n\tnb de DVD empruntés : $nbDVD");
} else {
print("\n\tIl n'a jamais emprunté de DVD");
}
}

# Ajout d'un nouvel abonné sans emprunt

print("\n\nAjout d'un nouvel abonné sans emprunt");
print("\nQui souhaitez-vous ajouter ? ");
$newAbonne =<STDIN>;
chomp($newAbonne); # suppression du saut de ligne
$abonnes{"$newAbonne"} = undef; # abonné sans emprunt

# Affichage

print("\n\nAffichage de la DVDthèque");
while (($prenom,$nbDVD) = each %abonnes) {
print("\n$prenom est abonné");
# si le nb de DVD n'est pas undef
if (defined($nbDVD)) {
print("\n\tnb de DVD empruntés : $nbDVD");
} else {
print("\n\tIl n'a jamais emprunté de DVD");
}
}

# Révocation d'un abonné : delete

print("\n\nQuel User souhaitez vous supprimer?");
$user= <>;
chomp($user);
delete ($abonnes {$user}) ;

# Affichage

print("\n\nAffichage de la DVDthèque");
while (($prenom,$nbDVD) = each %abonnes) {
print("\n$prenom est abonné");
# si le nb de DVD n'est pas undef
if (defined($nbDVD)) {
print("\n\tnb de DVD empruntés : $nbDVD");
} else {
print("\n\tIl n'a jamais emprunté de DVD");
}
}

# Emprunt d'un ou plusieurs DVD

print("\n\nCombien de DVD voulez vous emprunter?");
$maxDVD = -1; # le max de DVD empruntés
while (($prenom,$nbDVD) = each %abonnes) {
if ($nbDVD > $maxDVD) {
$DVD = $nbDVD;
$Emprunteur = $prenom;
}
}
print("\nIl a emprunté $DVD DVD");

# Recherche d'un abonné

print("\n\nQuel abonné cherchez-vous ? ");
$abbX = <STDIN>;
chomp($abbX); # suppression du saut de ligne
if (exists $abonnes{$abbX}) {
print("\n$abbX est abonné\nIl a emprunté $abonnes{$abbX} DVD");
} else {
print("\n$abbX n'est pas abonné\n");
}


# retour d'un ou plusieurs DVD

print'"\n\nCombien de DVD coulez vous restituer?");
while (($prenom,$nbDVD) = each %abonnes) {
if ($nbDVD > $maxDVD) {
$DVD = $nbDVD;
$restitué = $prenom;
}
}
print ("\nIl a restitué $DVD DVD");

# Quitter

print("\n\nAu revoir\n\n");

1 réponse


 
Salut laisso,

Ton code Perl ne compile pas, car :

- à cette ligne
print'"\n\nCombien de DVD coulez vous restituer?"); 
, tu as une
'
à la place d'une
(
...
... et plus bas...
- tu as un accent sur cette variable
$restitué = $prenom; 
(que tu n'utilises d'ailleurs pas dans ton code)

En outre, tu ne fais pas ce que te demande de faire l'énoncé de l'exercice, qui te demande de créer un menu avec une boucle permettant d'afficher les différentes options du programme et de les exécuter en sélectionnant leur numéro.

Pareil pour la suppression : on te demande d'afficher la liste des différents abonnés avec des numéros pour que l'utilisateur puisse indiquer en tapant le numéro qui il veut supprimer, en bouclant tant qu'une saisie invalide est faite.

Par exemple :

Qui voulez-vous supprimer :

1. Guillaume
2. Maxime
3. Anne
4. Michel
0. Retour au menu principal


En fait, on te demande de faire une interface utilisateur (textuelle) pour que l'utilisateur sache ce qu'il peut faire avec le programme et lui faciliter la vie.

Tu devrais faire des fonctions pour chaque fonctionnalité de ton programme.

Pour tes questions "J'ai des difficultés pour exécuter les questions 4 5 et 6. Merci de bien vouloir m'aiguiller."

j'imagine que cela correspond aux items suivant du menu principal :

#4. emprunt d'un ou plusieurs DVD
#5. retour d'un ou plusieurs DVD
#6. quitter


Si le programme se limite à comptabiliser le nombre d'ouvrages empruntés, j'imagine qu'il suffit :

- pour 4 : d'incrémenter la valeur correspondant à la personne dans le hash qui emprunte,
- pour 5 : de décrémenter
- pour 6 : tu termines ton programme : exit parait indiqué si tu es dans une boucle

Votre enseignant ne vous a pas enseigné à utiliser les directives strict et warnings ?

Dal
1