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

Algorithmes et structures de données Discussion :

[Débutant] - Anagramme


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Par défaut [Débutant] - Anagramme
    Bonjour, j'ai fais cet algo, mais j'ai un peu de mal à voir si ça correspond, quelqu'un peut me dire si il est correct et si il est possible d'optimisé ?

    L'énoncé
    Deux mots son anagrammes l'un de l'autre si l'un peut être obtenu par transposition des lettres de l'autre.
    Exemple : "MARIE" et "AIMER" sont anagrammes l'un de l'autre ce qui n'est pas le cas pour "BON" et "BONBON".
    écrire un algo qui entre deux chaines de caractères de lettres majuscules et sort "OUI" si ces deux chaines sont anagramme l'une de l'autre et "NON" dans le cas contraire
    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
    ActionAnagramme
    		Var CH1:CH2:C = Chaine de caractére
    		LongCH1:LongCH2:i:j = Numerique
    		Final1 : Final2 = Bouléen
     
    Début
    		Entrée CH1
    		Entrée CH2
    		LongCH1 = long(CH1)
    		LongCH2 = long(CH2)
    		i=j=0
    		Final1 = Final2 = FALSE
     
    	%Coparaison des longeurs des lettres%
    	Si LongCH1 <> LongCH2
    		Sortir "NON"
    	Sinon	
    		Tant que Final1 = false ou i <= LongCH1
    			i = i + 1
    			Final1 = False
    			j = 0
    			C = Schain(CH1, i , 1) % On copie une lettre du mot dnas la variable C %
    				Tant que j <= LongCh2 ou Final2 = TRUE
    					j = 1 + j 
    					SI C = Schaine(CH2,j,1) % si la lettre contenu dans la variable c est trouver on arrete la boucle%
    						Final2=TRUE
    					FinSI
    				FINTantQUE
    			Si j  > Long(CH2) % si j > au nombre de lettre contenue dans la chaine de caractére alors les mots ne sont pas anagramme%
    				Final1 = TRUE
    			FinSI
    		FINTantQUE
    	FinSI
     
    	Si Final1 = TRUE
    		Sortir "NON"
    	Sinon 
    		Sortir "OUI"
    	FinSI
     
    FinAction

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    C'est incorrect, tu ne vérifies pas si CH2 est une permutation des lettres de CH1 mais simplement si les lettres contenues dans CH1 existent dans CH2, par exemple si CH1 = "ooo" et CH2 = "non", ton algorithme déclarera que CH2 et CH1 sont des anagrammes.

    Le plus simple pour vérifier si deux chaînes de caractères sont des anagrammes est de trier leur contenu et de vérifier si leurs contenus triés sont égaux.

    Autres critiques :
    • Tu utilises toujours long() pour la fonction Longueur(), ça va te jouer des tours.
    • bouléen s'écrit Booléen (évite d'écorcher le nom de Bool please).


    --
    Jedaï

  3. #3
    Membre confirmé Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Par défaut
    C'est incorrect, tu ne vérifies pas si CH2 est une permutation des lettres de CH1 mais simplement si les lettres contenues dans CH1 existent dans CH2, par exemple si CH1 = "ooo" et CH2 = "non", ton algorithme déclarera que CH2 et CH1 sont des anagrammes.
    Ok merci de ta réponse, j'y ai passé du temps, et j'avais même pas pensé et vue ça

    Le plus simple pour vérifier si deux chaînes de caractères sont des anagrammes est de trier leur contenu et de vérifier si leurs contenus triés sont égaux.
    Stp tu as pas un texte pour développer ça, car je n'arrive pas à imaginer
    comment trier le contenu de ces deux mots. En fais je n'arrive pas à imaginer comment faire ça



    * Tu utilises toujours long() pour la fonction Longueur(), ça va te jouer des tours.
    En fais, si sur le livre que j'ai pour apprendre l'algo, la définition dans mon livre
    est long("ch").
    Donc ok pour les prochaines fois et désolé pour monsieur Bool

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    une simple recherche ici-meme t'aurait amene :

    ici

    http://www.developpez.net/forums/sho...ight=anagramme

    ou

    http://www.developpez.net/forums/sho...ight=anagramme

    et quelques autres....

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Deux mots sont des anagrames si il ya le même nombre de même lettres d'un mot à l'autre nom ?
    Ca devient plus compliqué si tu dois vérifier que tes mots on un sens valide d'après un dico de référence.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    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
    Diu,
    Citation Envoyé par Mika2008 Voir le message
    Stp tu à pas un texte pour développer sa, car je n'arrive pas à imaginer
    comment trier le contenu de ces deux mots. En fais je n'arrive pas à imaginer comment faire sa
    Il faut trier chaque chaîne séparément:

    AIMER va donner AEIMR

    et MARIE la même chose, ce qui montre que ce sont des anagrammes.

    ======================

    Mais attention : dans les anagrammes, il ne faut jamais tenir compte des signes diacritiques (accents, cédille), et ne jamais faire la différence entre majuscules/minuscules.

    En tenant compte de cette remarque, il faut donc faire :

    - pour chaque chaîne, remplacer tous les caractères avec signe diacritique par leur équivalent simple (par exemple, éàe devient eaeA)

    - passer toutes les lettres en majuscules ou minuscules, au choix

    - et alors seulement

    - trier les 2 chaînes

    - comparer les 2 chaînes ainsi obtenues

    - Si elles sont identiques, alors anagrammes = VRAI.


  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    (trier signifie par exemple de classer les lettres de chacun des mots dans l'ordre alphabétique... ainsi si tu obtiens deux chaines identiques, hop c'est fini )

  8. #8
    Membre émérite Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par défaut
    Citation Envoyé par Alp Voir le message
    (trier signifie par exemple de classer les lettres de chacun des mots dans l'ordre alphabétique... ainsi si tu obtiens deux chaines identiques, hop c'est fini )
    Bonjour,
    Pour faire ça tu peux utiliser la fonction ORD:
    Ord(a)<Ord(b)<...<Ord(z)

Discussions similaires

  1. Débutant XML
    Par viny dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 25/07/2002, 12h07
  2. [Kylix] Re Re: débutant sur Kylix et Linux.....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/06/2002, 22h53
  3. [Kylix] Le débutant en Kylix et Linux....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 10h37
  4. Réponses: 3
    Dernier message: 07/05/2002, 16h06
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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