Liste circulaire avec tête

Résolu/Fermé
bornin90s Messages postés 44 Date d'inscription mardi 6 juin 2017 Statut Membre Dernière intervention 6 juillet 2018 - Modifié le 29 avril 2018 à 19:06
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 29 avril 2018 à 21:01
Bonjpour les amis, est ce que vous pouvez m'aidez svp et merci d'avance. Alors je n'avais pas le cours et une amie me l' a donné et il y a un exo avec la solution et où je pense qu'il y a une erreur. Donc j'ai besoin d 'un autre avis . Je vais y mettre une ligne de commentaire.
L'enoncé de l'exercice:

Soit une liste bidirectionnelle de compte, écrire un module qui transfert dans une LCT tous les comptes débiteurs. Un compte est caractérisé par son numéro, son propriétaire, son type, son sens (débiteur ou créditeur) et son solde.

Et la solution :

Type compte = Structure 
DEBUT
    Num : entier
    Prop, type : chaine
    Sens :  "CR", "DB"
    Solde : entier 
FIN
Type LBi = ↑structure 
DEBUT
    Info : compte
    Prec, suiv :LBi
FIN
Type LCT = ↑structure 
DEBUT
    Info : compte
    Suiv :LCT
FIN :
Var Teteb, queueb : LBi
Var TeteLct : Lct
Procedure creationLct (Donnee Teteb, queueb : LBi  Resultat TeteLct : Lct)
Var p : LBi
Var pp, pc : Lct
DEBUT
    TeteLct ← Nil 
    P← Teteb
Tantque (p !=Nil) Faire
    Si (p↑.info.sens = "DB") Faire
        Allouer (pc)
        Pc↑info←p↑.info
        Si (teteLct = Nil) alors
            teteLct ←P ' Là je trouve qu elle aurait du mettre teteLct ←Pc Qu'est ce que vous en pensez ?
                       ' et y mettre également  pp ←Pc
        sinon
            pp↑.suiv←pc 
        FinSi
        Pp←pc
        Pc↑.suiv←TeteLct
    FinSi
        P←P↑.suiv
FinTantque
FIN

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
29 avril 2018 à 19:22
Bonjour,

Ce code n'est pas clair du tout et le mauvais nommage des variables y est pour beaucoup.

Morceau choisi :
        sinon
            pp↑.suiv←pc 
        FinSi
        Pp←pc
        Pc↑.suiv←TeteLct
    FinSi
        P←P↑.suiv

Comment s'y retrouver avec tous ces p, pp, pc... il faut utiliser des noms parlants pour savoir ce que l'on manipule.
Du coup
teteLct ←P
ou
teteLct ←Pc
... à moins d'aller décortiquer le code ligne par ligne pour savoir qui fait quoi, ça va être très compliqué de trancher.

Remarque : c'est quoi une LCT ?
Parce que quand je vois ce genre
Si (p↑.info.sens = "DB") Faire
je me demande ce que ça vient faire là.
Pourquoi la copie d'une donnée d'une liste bidirectionnelle vers une "LCT" dépendrait de la valeur du compte ?

Améliorations pour le programme : il faut découper davantage le code, ne pas tout faire en une seule procédure et éviter le mélange technique/business. La manipulation de pointeurs devrait être plus atomique.
Exemple : une procédure dédiée à l'ajout d'une donnée dans la liste.
1
bornin90s Messages postés 44 Date d'inscription mardi 6 juin 2017 Statut Membre Dernière intervention 6 juillet 2018
29 avril 2018 à 19:29
Au fait on copie dans la LCT tous les éléments de la LBi dont le champs sens = DB = Débiteur ;
pp joue le role de marquage et de chainage. pc permet d'ajouter un element dans la liste . et p est un pointeur de la Lbi ( liste bidirectionnelle)
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
29 avril 2018 à 21:01
bien d'accord avec toi, ce serait bien plus clair avec DernierLct et NouveauLct au lieu de pp et pc.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
29 avril 2018 à 20:34
bonjour, si on ne tient pas compte de la casse dans les noms de variables (Pc est identique à pc), je suis d'accord avec la première partie de ton commentaire.
Je ne suis pas d'accord avec la deuxième partie: cela doit être fait, et c'est fait juste après FINSI.
1
bornin90s Messages postés 44 Date d'inscription mardi 6 juin 2017 Statut Membre Dernière intervention 6 juillet 2018
29 avril 2018 à 20:42
bonjour , d'accord... au fait Pc est identique c'est juste une erreur de frappe . Ma derniére question pourquoi on a :

Pc↑.suiv←TeteLct
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > bornin90s Messages postés 44 Date d'inscription mardi 6 juin 2017 Statut Membre Dernière intervention 6 juillet 2018
29 avril 2018 à 20:48
comme la liste est circulaire, le suivant du dernier est le premier, donc la tête.
si la liste était non circulaire, le dernier n'aurait pas de suivant.
0
bornin90s Messages postés 44 Date d'inscription mardi 6 juin 2017 Statut Membre Dernière intervention 6 juillet 2018
29 avril 2018 à 20:47
ok on a Pc↑.suiv←TeteLct par ce que dans une LCT le dernier élément pointe tjrs vers le premier..
et par exemple le premier element ajouté dans la liste son champ suivant aura son propre adresse : repointe sur lui-même .
0
bornin90s Messages postés 44 Date d'inscription mardi 6 juin 2017 Statut Membre Dernière intervention 6 juillet 2018
29 avril 2018 à 20:54
bien reçu les choses s'éclaircissent de mieux en mieux dans ma tête.. au fait je confondais la notion de LMono avec celle de la LCT. merci infiniment pour ton aide.
0