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

Langage Pascal Discussion :

[Récursivité] Fonction inversant une chaîne


Sujet :

Langage Pascal

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut [Récursivité] Fonction inversant une chaîne
    Bonjour,
    Je suis en train d'apprendre les algorithmes récursifs au lycée. On me propose d'écrire une fonction récursive qui inverse une chaine donnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function inv(ch:string):string;
    begin
    if ch='' then inv:=''
    else inv:=ch[length(ch)] + inv(copy(ch,1,length(ch)-1));
    end;
    Ceci est proposé par le professeur mais ne fonctionne pas.
    Moi, je propose plutôt ça qui n'arrange pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function inv(ch:string):string;
    begin
    if ch<>'' then inv:=ch[length(ch)] + inv(copy(ch,1,length(ch)-1));
    end;
    Et voici tout le programme qui ne fonctionne pas non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    program rec;
    uses wincrt;
    var ch:string;
    function inv(ch:string):string;
    begin
    if ch='' then inv:=''
    else inv:=ch[length(ch)] + inv(copy(ch,1,length(ch)-1));
    end;
     
    BEGIN
    ch:='SRUEPPOLEVEDSEDMUROF';
    writeln(inv(ch));
    END.
    ça affiche Run Time Error...

    Merci de m'avoir lu!

  2. #2
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    j'ai pas lu à fond ton code mais tu peux preciser le type d'erreur
    runtime error (?) tu a retenu le nombre qui suivait runtime error?
    @+

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    Runtime error 202 at 0001:000D.

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Stack Overflow ! http://pascal.developpez.com/faq/?pa...overflow-error

    Si tu passes des strings, qui font 256 octets, ca va vite ! Soit tu utilises la directive de compilation {$M} soit tu changes la variable que tu passes, en définissant par exempe un type string limité à 20 caractères.

  5. #5
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    Sinon la fonction de ton prof est correcte.
    La tienne ne l'est pas par contre car il y'a des cas pour lesquels elle ne retourne rien.

    La raison pour laquelle ton programme ne fonctionne pas, c'est que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch:='SRUEPPOLEVEDSEDMUROF';
    n'est pas reconnu comme un string mais comme un caractère (char).

    Pour définir un String, il faut mettre des guillemets "doubles" : "...".

    Si tu changes ton code comme ça, ça devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch:="SRUEPPOLEVEDSEDMUROF";

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    Avec un autre developpeur peut-être ! Avec le miens, je suis sûr que c'est comme ça. Merci d'avoir essayé. Merci Wormful_Sickfoot mais, je n'ai pas réussi à utiliser {$M...}, j'ai essayé de l'utiliser comme décrit dans le cours ou la FAQ, c'est à dire en remplaçant les ... par 3 paramètres. Ça a répondu : "Too Much Data" ou quelque chose comme ça... J'ai aussi essayé de limiter la chaîne à 20 en mettant : var ch:string[20];, ceci non plus n'a rien changé. Ah d'ailleurs, je viens de réaliser que j'aurais peut-être dû créer un nouveau type chaine[20] pour pouvoir l'utiliser dans la définition de la fonction. Il n'est que 22:56 et je suis déjà KO...

    Loceka, s'il te plaît, peux-tu commencer par vérifier ma fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function inv(ch:string):string;
    begin
    if ch<>'' then inv:=ch[length(ch)] + inv(copy(ch,1,length(ch)-1));
    end;
    Merci infiniment.

  7. #7
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Essaye en définissant un type string[20]

  8. #8
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    on a fait cette fonction en classe vaoici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function inverse(var ch : string ): string;
    begin
    if length(ch) = 1 then
     inverse := ch[length(ch)] 
    else 
     inverse := ch[length(ch)] + inverse(copy(ch,1,length(ch)-1);
    end;

  9. #9
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Bonjour
    a katrena99 j'ai tester ton code il est bon sauf a ce niveau
    j'ai remplacer j'ai mis et la ça marche mais en meme temps j'ai fixé la taille ddu String a 20,et j'ai fais plusieurs test lorque la chaine depasse 18 caracteres ça lance l'erreur que tu as signaler *
    Apres j'ai refait ce que tu as proposer et la ça marche mais il initialisant le chaine dans le programme principal a ' '(espace); sinon ton code est j'avoue que moi meme je m'y perd un peu mais je crois que l'erreur vient du test sur la chaine avec ''(vide ou espace) et a l'initialisation de la chaine)
    je vais creuser un peu et je reviens donner des nouvelles
    @+

  10. #10
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    je reviens sans avoir trop avancer sauf que je remarque avec une condition supplementaire dans la fonction ça a l'air d'allé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function inv(ch:string):string;
    begin
       if ch<>'' then inv:=ch[length(ch)] + inv(copy(ch,1,length(ch)-1))
       else inv:='';
    end;
    je crois que avec les string et comme c'est recursive il depassement dans la pile
    si la taille du string passé est inf à 18(ça veut dire 18caract/255 reservé mais coté memoire ça veut dire quoi?) no problem,je suis en train de pensé si ne faut utiliser un pointeur et liberer de la memoire au fur et a mesure pour voir ce que ça donne
    je vous tiens au courant si j'ai le temps

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Mui,
    Citation Envoyé par Loceka Voir le message
    Sinon la fonction de ton prof est correcte.
    La tienne ne l'est pas par contre car il y'a des cas pour lesquels elle ne retourne rien.

    La raison pour laquelle ton programme ne fonctionne pas, c'est que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch:='SRUEPPOLEVEDSEDMUROF';
    n'est pas reconnu comme un string mais comme un caractère (char).

    Pour définir un String, il faut mettre des guillemets "doubles" : "...".

    Si tu changes ton code comme ça, ça devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch:="SRUEPPOLEVEDSEDMUROF";
    Non, en Pascal, Char et String sont limités par des apostrophes '

  12. #12
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    Mea culpa, j'étais persuadé du contraire.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function inv (ch:string):string;
    begin
    if ch='' then inv:='' else
     
    inv:=inv(copy(ch,2,length(ch)-1))+ch[1];
     
    end;

  14. #14
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    Je pense que depuis 11 ans il a dû soit résoudre son problème, soit ne plus avoir besoin de la solution ^^

Discussions similaires

  1. [Débutant] Inverser une chaîne de caractères
    Par zbooon dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 28/04/2017, 14h44
  2. Action : remplacer la fonction par une chaîne
    Par 84mickael dans le forum JSF
    Réponses: 2
    Dernier message: 06/02/2009, 04h42
  3. Inverser une chaîne de caractères
    Par Nyko17 dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 10/05/2008, 20h45
  4. Réponses: 3
    Dernier message: 24/10/2007, 02h47
  5. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 12h09

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