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éterminer si une chaine de caractères est un palindrome


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Déterminer si une chaine de caractères est un palindrome
    Bonjour à tous,
    j'ai un exercice d'algorithme que j'ai résolu, il demande d'écrire un algorithme qui dit si la chaine est palindrome ou non, en utilisant une chaine de n caractères.
    Je vous demande de corriger mes erreurs s'il vous plaît, j'ai énormément besoin de votre aide. Merci d'avance

    Code x : 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
    Algorithme  mot_palindrome;
    Var   mot: chaine[n];
              b: booléen;
              i, n: entier;
    Debut
     
      Ecrire("Veuillez introduire un mot de plus de 2 caractères: ");
      
      Repeter
       Lire(mot);
      Jusqu'à(longueur(mot)>2)
    
    b<-- vrai;
    n<-- longueur(mot);
    i<--1;
      Si(n mod 2 =0) alors
         debut
        Tant que ((b=vrai) et (n<>i+1)) faire // <> veut dire =/= (different)
          debut
            Si(mot[i]=mot[n]) alors b<-- vrai;
            Sinon b<-- faux;
            i <--  i+1; n <--  n-1;
        fait;
         fin;
       Sinon
          debut
        Tant que((b<--vrai) et (n<>i))faire
          debut
            Si(mot[i]=mot[n]) alors b<--vrai;
            Sinon b<-- faux;
            i <--  i+1; n <--  n-1;
           fait;
            fin;
    Si(b=vrai) alors Ecrire("Le mot introduit est palindrome");
    Sinon Ecrire ("Le mot introduit n'est pas palindrome");
    
    FIN.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Pourquoi distinguer 2 cas, nombre de lettres pair ou impair ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Tu n'as besoin de parcourir que la moitié du mot.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonsoir, merci à vous deux pour votre réponse,

    Trap D, j'ai pensé à la parité du nombre de lettres composant le mot, comme j'ai besoin de deux conditions d'arrêt pour les variables (i et n), voici un exemple de déroulement:
    Si le nombre de caractères du mot est paire : exemple le mot 'haut'
    au début i=1 et n=4 (n étant la longueur du mot=4) on vérifie si h=t, la 2ème étape: i=2 et n=3 on vérifie encore si a=u puis on sort de la boucle, j'ai pensé à ce que l'incrémentation de i et n s'arrête ici, car si on continue on aura ça : i=3 et n=2 le système va comparer si u=a ce qui serait inutile car il a déjà passé par cette comparaison.
    Dans le cas où le nombre de caractères est impaire, exemple pour le mot 'bas'
    i=1 et n=3 , on vérifie si b=s. 2ème étape i=n=2 on vérifie si a=a, et on s'arrête ici, on sort de la boucle, et on arrête l'incrémentation afin que le système ne refait pas la comparaison qu'il a déjà fait.. Autrement dit, si i=3 et n=1 on retombe sur la première comparaison: s=b qu'on es pas censé refaire.
    Je ne vois pas comment écrire l'algorithme avec une seule boucle, pourriez vous me l'écrire afin que je comprenne mieux ? Merci.


    Flodelarab, oui en effet, c'est ce que j'ai fait dans la boucle tant que, dans la 1ère Tant que ((b=vrai) et (n<>i+1) dans la 2ème Tant que((b<--vrai) et (n<>i)), mon exemple que j'ai écrit en dessus explique ma façon de parcourir la chaine.

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Soit N le nombre de lettres du mot. Il ne bouge pas ! Contrairement à ton n.
    Soit i un indice.

    La lettre à la ième place est la même qu'à la (n-i+1)ème place, quelque soit la parité de N.

    i parcourt les nombres de 1 à N/2 quelque soit la parité et le signe "/" étant la division entière:
    6/2=3
    5/2=2
    4/2=2
    Dans un mot de 5 lettres, la lettre centrale n'a pas à être testée puisqu'elle est forcément bonne.

    Tu n'as pas besoin de plusieurs boucles, ni d'étudier la parité, ni de dépasser N/2.

    Simplifie ton algorithme.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    L'algorithme est une simple boucle tant que avec deux conditions et des incrementations.

    On peut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    debut
      initialisation des indices
      tant que condition_1 et conditions_2 faire
           (in/de)cremetation des indices
      fin tant que
      si condtion alors
         c'est un palindrome
      sinon
        ce n'est pas un palindrome
      fin si
    fin
    A toi de trouver ce qu'il faut ettre à certains endroits !

    PS je trouve plus simple d'utiliser 2 indices plutôt qu'un seul, question de goût.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    sur le net il existe une multitude d'algorithme pour les palindrome

    ma préférer étant celle-ci

    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
     
    Fonction Palindrome(T: tab[1..n]: caractère): booléen;
    Var
        i, j: entier;
        résultat: booléen;
    Debut
        i := 1;
        j := longueur(Mot);
        résultat := Vrai;
        TantQue ((résultat = Vrai) Et (i < j)) Faire
            Si(T[i] = T[j]) Alors
                résultat = Vrai;
                i = i + 1;
                j = j - 1;
            Sinon
                résultat := Faux;
            FinSi
        FinTantQue
        Renvoyer résultat;
    Fin
    tu la trouveras ici
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Resultat = vrai est complètement inutile.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Resultat = vrai est complètement inutile.
    Et aussi le fait d'aller au bout :

    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
    Fonction Palindrome(T: tab[1..n]: caractère): booléen;
    Var
        i, j: entier;
    Debut
        i := 1;
        j := longueur(Mot);
        TantQue ( i < j ) Faire
            Si(T[i] = T[j]) Alors
                i = i + 1;
                j = j - 1;
            Sinon
                Renvoyer Faux;
            FinSi
        FinTantQue
        Renvoyer Vrai;
    Fin
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Moi je l'avais vu sur la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Fonction Palindrome(T: tab[1..n]: caractère): booléen;
    Var
        i, j: entier;
    Debut
        i := 1;
        j := longueur(Mot);
        TantQue ( i < j ) et T[i] = T[j] Faire
                i = i + 1;
                j = j - 1;
         FinTantQue
        Renvoyer  i >= j;
    Fin
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  11. #11
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Yep mais ceci est un peu..... difficile éventuellement à comprendre..


    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu as raison, je suis trop influencé par le C
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Bah

    Suffit de l'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Si i >= j renvoie vrai
    sinon renvoie faux
    et ça se comprend
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #14
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,
    il y a là une orgie avec le même algo … mais on peut aussi imaginer d'autres approches (pas forcément des plus utiles ou utilisées ou adéquates) :

    Une version récursive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    fonction est_palindrome( chaine, longueur) : booleen
    début
      si longueur=0 ou 1 alors
        revoyer vrai
      sinon si premiere_lettre(chaine)=derniere_lettre(chaine) alors
        renvoyer est_palindrome(sous_chaine(chaine,2,longueur-2), longueur-2)
      sinon
        renvoyer faux
      fin si
    fin
    Une version autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fonction est_palindrome( chaine ) : booleen
    début
      eniahc=renverser(chaine)
      si chaine=eniach alors
        renvoyer vrai
      sinon
        renvoyer faux
      fin si
    fin
    ...

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Resultat = vrai est complètement inutile.
    exact copier coller malheureux ^^
    l'affectation ne sert a rien
    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
     
    Fonction Palindrome(T: tab[1..n]: caractère): booléen;
    Var
        i, j: entier;
    Debut
        i := 1;
        j := longueur(Mot);
        TantQue ( i < j ) Faire
            Si(T[i] = T[j]) Alors
                i = i + 1;
                j = j - 1;
            Sinon
                Renvoyer Faux;
            FinSi
        FinTantQue
        Renvoyer Vrai;
    Fin
    je ne suis pas d'accord avec ton écrit les conditions de sortie de boucle dans un algo sont importante
    dans ton cas tu fait un mixte entre du pseudo code et du C si je l’écrit en pascal il ne marcheras pas a moins de lui adjoindre un exit après le renvoyer
    pour moi un pseudo code ne doit en aucune présumer de quelque langage que ce soit et donc être le plus descriptif possible
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Quite à donner des exemples d'algo, j'aime bien celui-là en Prolog :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    palindrome(X) :-
       phrase(palindrome,X).
     
    palindrome -->   % base case for even number of elements
       [].
    palindrome -->   % base case for odd number of elements
       [A].
    palindrome -->   % general case: a palindrome is
       [A],          % some element A...
       palindrome,   % ... followed by a palindrome ...
       [A].          % ... followed by element A
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. tester si une chaine de caractère est un entier ?
    Par farid0031 dans le forum C++Builder
    Réponses: 7
    Dernier message: 12/05/2009, 16h32
  2. Réponses: 3
    Dernier message: 12/12/2008, 10h47
  3. Vérifier qu'une chaine de caractère est bien présente
    Par kilian67 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 28/09/2007, 18h10
  4. Réponses: 9
    Dernier message: 19/10/2006, 17h02

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