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 :

Détection d'anagramme


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Par défaut Détection d'anagramme
    Bonjour à tous,

    Mon problème est le suivant:

    je dois réaliser une fonction booléenne qui indique si deux mots sont des anagrammes.

    Voici le code:

    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
    program Exercice5;
    function Anagramme(const s1:string;var s2:string):boolean;
    var i,c:integer;
     
    begin
     
    	i:=1;
    	result:=(s2=' ');
    	if length(s1)=length(s2) then
    		begin
    			while(i<length(s1)+1) and not result do
    				begin
    					c:=pos(s1[i],s2);
    					if (c<>0) then
    					begin
    						delete(s2,c,1);
    						writeln(s2);
    						inc(i);
    					end;
    				end;
     
    		end;
    end;
     
    var ch1,ch2:string;
     
    begin // PROGRAMME PRINCIPAL
     
    	writeln('Veuillez entrer 1 mots: ');
    	readln(ch1);
    	writeln('Veuillez entrer un 2e mot: ');
    	readln(ch2);
    	writeln(Anagramme(ch1,ch2));
    end.

    Donc l'idée est de regarder d'abord le caractère d'indice i dans le string 1 avec sa place dans le string 2 puis dans la boucle l'effacer du string 2.
    Le problème c'est que la console me renvoie comme réponse FALSE....


    Merci de me lire.

    Merci pour l'explication des balises

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Boa,

    Pour la présentation du code, il faut l'encadrer par les balises [*code] [*/code], sans les * qui ne sont là que pour les invalider.

    Pour les anagrammes, il faut prendre des précautions :
    - on ne tient pas compte des signes diacritiques (accents, cédilles)
    - on ne tient pas compte de la casse (majuscules/minuscules)
    Ces contraintes impliquent de mettre les mots en forme avant de tester.

    Je n'ai pas regardé le code en détail, mais l'idée pour détecter l'anagramme est correcte.

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 052
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 052
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    En fait, dans ta boucle while, la valeur de result n'est nulle part modifiée.
    Tu pourrais faire quelque chose comme ceci :
    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
      Result := (Length(s1) = Length(s2));
      i := 1;
      while (i <= Length(s1)) and Result do
        begin
          c := Pos(s1[i],s2);
          if c <> 0
             then
               begin
                 Delete(s2,c,1);
                 WriteLn(s2);
                 Inc(i);
               end
             else
               Result := False;
        end;
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Par défaut
    Bonjour Alacatîz!

    Il y a un truc pour lequel je ne suis pas d'accord avec ton code:
    La valeur booléenne que renvoie la fonction doit porter sur 'Oui ou Non les deux mots entrés par l'utilisateur sont des anagrammes'. Or là, la valeur renvoyée par la fonction dit: 's'il les 2 strings ont la même longueur envoyer vrai ou faux'.
    Et justement, dans mon code, le fait que je supprime à chaque fois le caractère correspondant au caractère d'indice i de la 1ere chaîne de caractère modifie le Result. Car au final, le Result doit contenir cette expression (s2=' '), ce qui est le cas... Enfin, voilà... je suis bloqué

    J'ai ajouté des commentaires à mon code pour plus de clarté:
    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
    program Exercice5;
     
    // PAR EXEMPLE MARIE ET AIMER POUR LES ANAGRAMMES
     
    function Anagramme(const s1:string;var s2:string):boolean;
    var i,c:integer;
     
    begin
     
    	i:=1;
    	result:=(s2=' ');
    	if length(s1)=length(s2) then // Length(s1)=Length(s2)=5
    		begin
    			while (i<=length(s1)) and not result do //TANT QUE I<> Length(s1)+1 et que s2 n'est pas égal à chaîne de caractère vide alors on entre dans la boucle
    				begin
    					c:=pos(s1[i],s2);
    					inc(i);
    					if (c<>0) then
    					begin
    						delete(s2,c,1); // ici on modifie la chaîne s2 donc on modifie le Result.... 
    						writeln(s2);
     
    					end; 
    				end;// On sortira de la boucle quand i=6 et s2= ' '... Le Result devrait renvoyer TRUE...Je ne comprends pas mon erreur...
     
    		end;
    end;
     
    var ch1,ch2:string;
     
    begin // PROGRAMME PRINCIPAL
     
    	writeln('Veuillez entrer 1 mots: ');
    	readln(ch1);
    	writeln('Veuillez entrer un 2e mot: ');
    	readln(ch2);
    	writeln(Anagramme(ch1,ch2));
    end.

    Merci de m'aider en tout cas

  5. #5
    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
    Par défaut
    Le code proposé par Alacatîz me semble correcte.
    La valeur booléenne que renvoie la fonction doit porter sur 'Oui ou Non les deux mots entrés par l'utilisateur sont des anagrammes'. Or là, la valeur renvoyée par la fonction dit: 's'il les 2 strings ont la même longueur envoyer vrai ou faux'.
    Pour que deux chaines puissent etre des anagrammes, il faut dejà qu'elles aient la meme longueur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Result := (Length(s1) = Length(s2));
    Ce n'est pas forcement cette valeur de result qui sera renvoyer, puisque la fonction ne s'arrete là.
    Si cette condition est verifiée, on peut maintenant verifier si elles ont les meme caracteres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while (i <= Length(s1)) and Result do
        begin
          c := Pos(s1[i],s2);
          if c <> 0 then
               begin
                 Delete(s2,c,1);
                 WriteLn(s2);
                 Inc(i);
               end
             else
               Result := False;
        end;

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Par défaut
    Oui, le code proposé par alacatîz renvoie une valeur TRUE... je n'ai jamais dit le contraire... mais je trouve que c'est mieux de vérifier si la longueur des deux chaînes avant d'entrer dans une boucle et que la valeur booléenne renvoyée par la fonction ne devrait par porter sur la longueur des chaînes mais sur 'Oui ou Non ces deux nombres sont des anagrammes'. Et puis une fois qu'on rentre dans la boucle, les caractères de s2 sont supprimés donc d'office, la valeur de la longueur de la chaîne s2 va être différente de celle de s1.
    C'est juste mon souci avec ce code

    Voilà donc pourquoi je trouve plus clair de poser la condition sur l'équivalence des longueurs des deux chaînes de caractères proposées avant d'aller plus loin.
    En même temps, on pourrait encore compliquer le problème en vérifiant si
    ***AIMER** et MARIE sont des anagrammes (*** pour les espaces)
    Là, il faudrait appeler soit une fonction qui supprime les espaces et puis vérifier si les deux chaînes sont de même longueur... ou faire tout cela sans faire appel à une fonction... mais ça j'ai pas encore fait.


    Enfin voilà, c'est toujours un plaisir de discuter avec vous
    Je suis tout nouveau dans la programmation... et je peux vous dire que ça me passionne énormément .....
    D'ailleurs je compte entreprendre des études dans ce domaine en plus de ce que je fais déjà... Soit, je sors du sujet!

    Encore merci!!!!

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

Discussions similaires

  1. Algorithme d'anagramme ??
    Par Muetdhiver dans le forum Algorithmes et structures de données
    Réponses: 20
    Dernier message: 28/02/2005, 17h20
  2. détection de player
    Par mat10000 dans le forum Flash
    Réponses: 8
    Dernier message: 23/10/2003, 16h36
  3. Détection MySql
    Par gjullien dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/08/2003, 18h15
  4. Détections avec WebBrowser
    Par Wazo_Sportive dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/08/2002, 19h32
  5. Détection de 2 touches appuyées
    Par cyrose dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 16h25

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