IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

Addition de deux polynômes avec liste chaînée [Turbo Pascal]


Sujet :

Turbo Pascal

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Addition de deux polynômes avec liste chaînée
    Bonjour

    Je dois réaliser un programme qui additionne 2 polynômes. J'ai créé des procédures qui ordonnent un polynôme mais j'ai une erreur lors de l'exécution du programme pour l'addition.
    Je sais que cela signifie qu'il y a un problème avec les maillons mais je ne le trouve pas.

    Pouvez-vous m'aider ?

    Voici mon programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    procedure addition (po1, po2:polynome; s:polynome);
      var p1, p2, som, ms, mp: polynome;
      begin
      p1 := po1;
      p2 := po2;
      som := nil;
      while (p1<>nil) or (p2<>nil) do
            begin
                while (som^.lien<>nil)do begin
                           mp:=som;
                           som:=som^.lien;
                            end;     
                if (p1^.puis = p2^.puis) then
                    begin
                       if (p1^.coef + p2^.coef <> 0) then
                              begin
                                    ms := som;
                                    new (som);
                                    som^.coef := p1^.coef + p2^.coef;
                                    som^.puis := p1^.puis;
                                    som^.lien := ms;
                                    ms^.lien := som;
                                    p1 := p1^.lien;
                                    p2 := p2^.lien;
                               end
                               else begin
                                          p1 := p1^.lien;
                                          p2 := p2^.lien;
                                      end;
                        end
                             else
                                  begin
                                        if (p1^.puis < p2^.puis) then
                                             begin
                                                    ms := som;
                                                    new (som);
                                                    som^.coef := p2^.coef;
                                                    som^.puis := p2^.puis;
                                                    som^.lien := ms;
                                                     ms^.lien := som;
                                                     p2 := p2^.lien;
                                                 end
                                           else begin
                                                    ms := som;
                                                    new (som);
                                                    som^.coef := p1^.coef;
                                                    som^.puis := p1^.puis;
                                                    som^.lien := ms;
                                                    ms^.lien := som;
                                                    p1 := p1^.lien;
                                           end;
                                 end;
            end;
      end;

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    lo,

    Nous donner tous les éléments serait probablement fort utile.

    Définition de ton type polynome, par exemple.

    Et donner un programme compilable, éventuellement réduit au minimum reproduisant l'erreur n'est pas inutile non plus.

    Côté indentation, c'est fait, c'est bien (presque ).
    Une règle à respecter, qui fait qu'on s'en porte mieux est :
    Il faut éviter de trop décaler vers la droite à chaque bloc, car ça finit par plus géner la lecture que la faciliter.
    Mon expérience me dit : décaler d'au moins 2 caractères, car 1 n'est pas suffisant, et de 4 au maximum.
    Ceci est évidemment une préférence, à chacun de faire ce qui lui va.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    voici comment j'ai défini un maillon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type polynome = ^monome;
         monome= record
              coef:real;
              puis:integer;
              lien:polynome;
               end;
    lors de l'éxécution, le message suivant apparaît:
    Une erreur s'est produite dans votre application.
    Il faut alors appuyer sur fermer ou ignorer
    Ensuite, il indique que le programme va se fermer à cause d'une faute de protection générale dans le module(il indique l'adresse: 0001:0747)

    voilà, j'espère que cela répond a votre attente
    si vous souhaitez que je mettes tout le programme, dites-le moi mais il est assez long
    merci d'avance pour votre aide

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    ol,

    Ok, je vais jeter un coup d'oeil.

    Je suppose que je peux assumer que les polynômes passés à la fonction sont bien initialisés, etc... ?

    Au passage : l'indentation, il faut la faire à tous les niveaux du code, y compris dans la déclaration des types.

    Ici, édition

    Sans aller plus loin, quand je vois ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      som := nil;
      while (p1<>nil) or (p2<>nil) do
            begin
                while (som^.lien<>nil)do begin
    je me dis : en voilà au moins une

    Prendre soin de mettre som := nil; pour juste après l'utiliser sans autre initialisation, aïe aïe.
    Je suppose que tu as oublié une ou 2 lignes ?
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    euh oui, j'ai oublié une ou 2 lignes
    en fait, au début, je voulais afficher le polynome du plus petit degré au pls grand
    ensuite j'ai voulu faire l'inverse (du plus grand au plus petit)
    je sais que le reste du programme ne tourne pas correctement
    je voudrais bien comprendre où est mon erreur pour ne plus la refaire
    une fois l'erreur trouvée, le résultat ne saura peut être correct (la somme) mais, si vous le voulez bien, j'y réflicherai seule car j'aime les défis
    le problème, c'est qu'ici, j'y est passé plusieurs jours sans trouver l'erreur
    j'ai donc besoin d'un peu d'aide
    j'espère que vous pourrez m'aider

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    mo,
    Citation Envoyé par Ecquini
    euh oui, j'ai oublié une ou 2 lignes
    en fait, au début, je voulais afficher le polynome du plus petit degré au pls grand
    ensuite j'ai voulu faire l'inverse (du plus grand au plus petit)
    je sais que le reste du programme ne tourne pas correctement
    je voudrais bien comprendre où est mon erreur pour ne plus la refaire
    une fois l'erreur trouvée, le résultat ne saura peut être correct (la somme) mais, si vous le voulez bien, j'y réflicherai seule car j'aime les défis
    le problème, c'est qu'ici, j'y est passé plusieurs jours sans trouver l'erreur
    j'ai donc besoin d'un peu d'aide
    j'espère que vous pourrez m'aider
    Pas de problème pour t'aider, mais donne nous tout de même le code corrigeant cette erreur, je ne peux deviner où et quand tu veux initialiser som à une valeur autre que nil.
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    procedure addition (po1, po2:polynome; s:polynome);
      var p1, p2, som, ms, mp: polynome;
      begin
      p1 := po1;
      p2 := po2;
      som := nil;
      while (p1<>nil) or (p2<>nil) do
       begin  
         if (p1^.puis = p2^.puis) then
         begin
            if (p1^.coef + p2^.coef <> 0) then
            begin
                ms := som;
                new (som);
                som^.coef := p1^.coef + p2^.coef;
                som^.puis := p1^.puis;
                som^.lien := ms;
                ms^.lien := som;
                p1 := p1^.lien;
                p2 := p2^.lien;
            end
            else begin
                     p1 := p1^.lien;
                     p2 := p2^.lien;
                  end;
         end
         else
            begin
                if (p1^.puis < p2^.puis) then
                begin
                   ms := som;
                   new (som);
                   som^.coef := p2^.coef;
                   som^.puis := p2^.puis;
                   som^.lien := ms;
                   ms^.lien := som;
                   p2 := p2^.lien;
                end
                else begin
                         ms := som;
                         new (som);
                         som^.coef := p1^.coef;
                         som^.puis := p1^.puis;
                         som^.lien := ms;
                         ms^.lien := som;
                         p1 := p1^.lien;
                      end;
            end;
    end;
    end;

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Holi,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      som := nil; { som = nil, ok, mais plus loin... }
      while (p1<>nil) or (p2<>nil) do
       begin  
         if (p1^.puis = p2^.puis) then
         begin
            if (p1^.coef + p2^.coef <> 0) then
            begin
                ms := som; { donc ms = som = nil , aïe plus loin }
                new (som);
                som^.coef := p1^.coef + p2^.coef;
                som^.puis := p1^.puis;
                som^.lien := ms;
                ms^.lien := som; { aïe, car ms = nil }
                p1 := p1^.lien;
    Il va falloir faire attention à ce que tu fais : on n'utilise pas un pointeur non initialisé à une valeur valide.

    Je pense qu'il faut que tu reprennes ton algorithme à zéro, sans tenir compte de ce que tu as déjà écrit comme code.
    C'est généralement plus rapide et fiable qu'essayer de bidouiller du code qui est parti sur une mauvaise voie.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    d'accord
    je vais tout reprendre à zéro et si je n'y arrive pas, je reviendrai poster un message
    merci pour les conseils

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    j'y suis arrivé
    merci a tous

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    wal,
    Citation Envoyé par Ecquini
    j'y suis arrivé
    merci a tous
    As-tu repris à zéro, ou as-tu réussi à t'en sortir avec ton code déjà écrit ?
    Si les cons volaient, il ferait nuit à midi.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    j'ai tout repris à zéro sur une feuille de papier

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Wal,
    Citation Envoyé par Ecquini
    j'ai tout repris à zéro sur une feuille de papier
    C'est souvent la meilleure solution, comme je l'avais dit.

    Car souvent, si on bute sur un problème d'implémentation d'algorithme, c'est soit que la structure est mal définie, ou qu'on devrait ajouter des fonctions pour la gérer, soit qu'on est parti sur une mauvaise voie pour l'implémentation de l'algorithme.
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    es que c'est possible de mettre la solution finale !

  15. #15
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Jie,
    Citation Envoyé par mohsenuss91 Voir le message
    es que c'est possible de mettre la solution finale !
    Je dirais : non.

    Nous ne sommes pas là pour faire tes devoirs, et encore moins pour t'obtenir une bonne note par simple copier/coller.
    Si les cons volaient, il ferait nuit à midi.

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par droggo Voir le message
    Jie,

    Je dirais : non.

    Nous ne sommes pas là pour faire tes devoirs, et encore moins pour t'obtenir une bonne note par simple copier/coller.
    j'ai tombé dans le méme problème et j'ai posté ça dans un sujet a part..
    (je cherche quelqu'un pour me montrer les fautes que j'ai fais, et je vais les corriger moi même)..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Turbo Pascal] Addition de deux polynômes
    Par mohsenuss91 dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 18/11/2011, 20h41
  2. Gestion des sprites dynamiques avec liste chaînée
    Par Mokona dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/12/2010, 14h55
  3. Réponses: 0
    Dernier message: 30/06/2010, 16h27
  4. Quicksort avec listes chaînées ?
    Par italiasky dans le forum C
    Réponses: 3
    Dernier message: 27/12/2006, 16h47
  5. Réponses: 6
    Dernier message: 18/11/2006, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo