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

Pascal Discussion :

Problème de redondance


Sujet :

Pascal

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Points : 72
    Points
    72
    Par défaut Problème de redondance
    Salut à tous
    Je viens de faire un programme qui permet de lire 2 mots ch1 et ch2 puis d'afficher tous les caractères qui apparaissent des 2 chaines sans redondance. Mais dommage, il fait la redondance à cause d'une faute dans la fonction verifer.
    SVP aidez-moi à le trouver.
    Merci d'avance
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    program trie;
    uses wincrt;
    type
    tab = array[1..100] of string;
    var
    t:tab;
    a,b :string;
    n:integer;
     
    procedure lecture(var a,b:string);
    begin
    writeln('donnez le 1° mot');
    readln(a);
    writeln('donnez le 2° mot');
    readln (b);
    end;
     
    function verif(mot:string;n:integer):boolean ;
    var
    i:integer;
    begin
    for i:=1 to n do
        if (mot = t[i]) then verif := false
        else verif := true
     
    end;
     
     
    procedure recherche(var t:tab; var n:integer;a,b:string);
     var
     i,j:integer;
     mot:string;
     rep:boolean;
     begin
     n:=1;
       for i := 1 to length(a) do
          for j := 1 to length(b) do
          begin
          begin
              if a[i] = b[j] then begin
                                         mot := a[i];
                                         rep :=verif(mot,n);
                                  end;
          if (rep = true) then        t[n]:= mot ;
                                      n:=n+1;
                                      end;
                               end;
                               end;
     
     
     
       procedure affichage(var t:tab; n:integer);
       var
       i:integer;
       begin
       writeln('le resulta est');
                    for i:=1 to n do
                     writeln(t[i]);
       end;
     
       begin
     
       lecture(a,b);
       recherche(t,n,a,b);
       affichage(t,n)
       end.

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    La fonction verif est fausse, pour plusieurs raisons.

    La principale raison réside dans le fait que, sous sa forme actuelle, elle retourne false ou true suivant la dernière comparaison, c'est-à-dire si mot = t[n] ou non.

    Pour programmer correctement ce test, il faut mettre en place ce qu'on appelle un " drapeau " ( un " flag " en anglais ).
    C'est une variable que l'on initialise à 1 ( ou à true ) et que l'on baisse à 0 (ou à false ) si une certaine condition est remplie à l'intérieur d'une boucle.

    D'autre part, il y a une erreur sur l'indice terminal de la boucle.
    Lorsque la fonction verif est appelée, l'élément t[n] n'est pas encore affecté.

    Il faut donc faire quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      var i : integer;
          test : boolean;
     
      begin
           test := true;
           if n>1 then 
                  for i := 1 to n-1 do
                      if (mot = t[i]) then test := false;
           verif := test ;
      end;

  3. #3
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    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
    procedure recherche(var t:tab; var n:integer;a,b:string);
     var
     i,j:integer;
     mot:string;
     rep:boolean;
     begin
     n:=1;
       for i := 1 to length(a) do
          for j := 1 to length(b) do
          begin
          begin
              if a[i] = b[j] then begin
                                         mot := a[i];
                                         rep :=verif(mot,n);
                                  end;
          if (rep = true) then        t[n]:= mot ;
                                      n:=n+1;
                                      end;
                               end;
                               end;
    Le probleme de la redondance se trouve dans cette fonction, biensur aussi dans la fonction verif comme prof l' a dit.
    En effet, a chaque fois qu' on a a[i]=b[j], on ajoute cette lettre à mot. puis on verifie si mot appartient à t. Or si a contient plusieurs lettres identiques (et pourquoi pas b), on affectera toutes ces lettres à mots si b contient au moins une fois cette lettres.
    Je trouve aussi que la fonctions verif ne est inutile, parce que tu verifies si des tous les mots contenus dans t sont differents: 'aab' est bien different de 'baa' et de 'aba'.
    Ma philosophie serait que tu enregistres les lettres identiques dans un tableau. Et avons l' ajout d' une nouvelle lettre, tu verifies si cette lettre n' existe pas encore dans le tableau. Comme ça on est sur d' avoir toutes les lettres identiques aux deux mots et les lettres contenues dans le tableau sont bien differentes. Et on repond donc à la question posée.
    Pas si difficile à coder en pascal je crois. Alors je te laisse reflechir

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

Discussions similaires

  1. Problème de redondances des données dans BO
    Par djams9 dans le forum Designer
    Réponses: 5
    Dernier message: 16/01/2013, 10h29
  2. Problèmes de redondance
    Par rick31 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/04/2012, 08h27
  3. Problèmes de redondances dans un vecteur
    Par le.nono dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/02/2012, 09h21
  4. [JDOM] Ajout d'éléments triés selon leur nom et problème de redondance.
    Par _fav_ dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 05/08/2010, 11h24
  5. Problème listage redondant de données
    Par ducrocq62 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/03/2007, 04h17

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