PASCAL-Suppression de caractères identiques chaîne.
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

PASCAL-Suppression de caractères identiques chaîne.



  1. #1
    inviteeb8d72a7

    PASCAL-Suppression de caractères identiques chaîne.


    ------

    Bonjour, alors on me demande d'écrire un programme permettant de saisir une chaîne puis d'effacer les caractères identiques dans cette chaine

    par ex si ch=aaabbbaacca le résultat sera abc . alors j'ai écris mon programme et il m'a semblé logique mais en l’exécutant sur pascal m'affiche ''an error has occurred in your application'' puis il se bloque. voici ce que j'ai écrit:

    uses wincrt;

    var

    ch:string;

    i,j:integer;

    begin

    write('saisir ch ');

    readln(ch);

    for i:=1 to length(ch) do;

    j:=i;

    repeat

    if ch[i]=ch[j] then delete(ch,j,1) ;

    else j:=j+1;

    until j=length(ch);

    write(ch);

    end.


    Merci d'avance pour votre aide

    PS: lorque je remplace for i:=1 to length(ch) do par son équivalent par le boucle repeat :

    i:=0

    repeat

    i:=i+1

    ...

    until i=length

    et quand je remplace aussi until j=length(ch) par j>length(ch) le programme marche comme il faut mais je ne comprend pas pourquoi . Quelqu'un pourrait m’éclaircir ? merci pour vos réponses

    -

    -----

  2. #2
    PA5CAL

    Re : PASCAL-Suppression de caractères identiques chaîne.

    Bonsoir

    Tout d'abord, il est convenu que les extraits de code présentés sur le forum doivent être présentés entre balises [CODE]...[/CODE] (bouton « # » dans l'éditeur avancé).

    Ensuite, il faudrait revoir la syntaxe des boucles for-do, qui doit être du type :
    Code:
    for variable := debut to fin do instruction;
    ou bien :
    Code:
    for variable := debut to fin do
    begin
      instructions;
    end;
    car à l'évidence, ta ligne de code :
    Code:
    for i:=1 to length(ch) do;
    (terminée par un point-virgule) ne fait pas grand chose.
    Dernière modification par PA5CAL ; 24/02/2019 à 19h16.

  3. #3
    danyvio

    Re : PASCAL-Suppression de caractères identiques chaîne.

    j:=i;

    repeat

    if ch[i]=ch[j] then delete(ch,j,1) ;
    ************************4
    Déjà, tu vas systématiquement deleter le premier caractère qui ne le mérite peut-être pas…

    Ensuite, sur le plan de la méthode, perso je commencerais par faire un tri pour passer de aaabbbaacca à aaaaaabbbcc, afin de faire une exploration systématique des caractères de "gauche à droite".
    On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !

  4. #4
    pm42

    Re : PASCAL-Suppression de caractères identiques chaîne.

    Citation Envoyé par danyvio Voir le message
    Ensuite, sur le plan de la méthode, perso je commencerais par faire un tri pour passer de aaabbbaacca à aaaaaabbbcc, afin de faire une exploration systématique des caractères de "gauche à droite".
    Tu vas perdre l'ordre de la chaine et passer d'une complexité en n à une complexité en n log(n).

    Une technique simple si on se limite à des caractères 8 bits est de faire un tableau de booléens indexé par le code ascii du caractère. Au départ, toutes les entrées sont à false.
    On parcourt la chaine 1 fois et pour chaque caractère :
    - si le tableau de booléens est à false pour son code, on le met à true. C'est la 1ère fois qu'on le rencontre
    - si le tableau de booléens est à true, on l'a déjà rencontré et on l'efface

    On échange un peu de mémoire contre de la vitesse surtout comparé à l'algo du primo-posteur qui est en n^2.

  5. A voir en vidéo sur Futura
  6. #5
    LeMulet

    Re : PASCAL-Suppression de caractères identiques chaîne.

    Autre problème :
    Code:
    if ch[i]=ch[j] then delete(ch,j,1) ;
    Le delete change la longueur de la chaine ch.

    Alors que (je fais abstraction du problème du ";" qu'il faut évidemment remplacer par un "begin" et un "end;".
    Code:
    "
    for i:=1 to length(ch) do;
    Comme on a affaire à une boucle de type "for" (qui est optimisée), la valeur finale de i est déterminée à la première execution de l'instruction for.
    Si la taille de ch change en cours de route (dans la boucle donc), la boucle "for" ne va pas revérifier la valeur de length(ch) à chaque itération (car optimisé).
    Ce qui va causer une exception de "dépassement" (on essai d'aller au delà du dernier caractère de la chaine).
    Bonjour, et Merci.

  7. #6
    Fustigator

    Re : PASCAL-Suppression de caractères identiques chaîne.

    Citation Envoyé par LeMulet Voir le message
    A
    Comme on a affaire à une boucle de type "for" (qui est optimisée), la valeur finale de i est déterminée à la première execution de l'instruction for.
    Est ce vrai quel que soit le compilateur ? Il me semble que c'est le cas avec le vieux compilateur "san diego" et plus récemment en "free pascal" (pour d'autres compilos, je ne serai pas si affirmatif, surtout que ça fait 30 ans que j'ai pas fait de pascal ....).

    Ce qui est sûr en revanche, c'est que la valeur de borne supérieure est évaluée avant celle de la borne inférieure (ceci a une implication concrète si la borne supérieure est obtenue par un appel d'une fonction dont un effet de bord est l'affectation de la borne inférieur - l'implication est tout aussi concrète dans le cas contraire d'ailleurs).

  8. #7
    pm42

    Re : PASCAL-Suppression de caractères identiques chaîne.

    Citation Envoyé par Fustigator Voir le message
    Est ce vrai quel que soit le compilateur ?
    Clairement non. Mais c'est vrai qu'il faut éviter ce genre de boucle si on change la taille en cours et faire un while ou équivalent.

  9. #8
    inviteeb8d72a7

    Re : PASCAL-Suppression de caractères identiques chaîne.

    Merci infiniment pour vos réponses ; voici le programme corrigé ( je mettrai en gras les corrections de mes fautes ):
    uses wincrt;

    var

    ch:string;

    i,j:integer;

    begin

    write('saisir ch ');

    readln(ch);

    for i:=1 to length(ch) do

    j:=i+1;

    repeat

    if ch[i]=ch[j] then delete(ch,j,1) ;

    else j:=j+1;

    until j>length(ch);

    write(ch);

    end.
    Pourriez-vous me dire pourquoi le programme ne marche pas lorsqu’on met until j:=length(ch) au lieu de until j>length(ch) ? Ah parce que j va se positionner sur la dernière lettre de ch (quand j=length(ch) ) et si cette dernière lettre est distincte j:=j+1 donc elle va dépasser la longueur de la chêne or j'ai écrit précédemment de repeat until j=length(ch) qui est impossible sauf dans le cas où la dernière lettre n'est pas distincte . et c'est pour cette raison que le programme se bloque . (je sais que c'est évident lol je sais pas pourquoi la solution m'a échappée) Sinon Pm42 votre solution est au delà de mes connaissances mais merci quand même (je suis encore au lycée lol j'ai pas fait trop attention en écrivant mon 'age)

  10. #9
    Garion

    Re : PASCAL-Suppression de caractères identiques chaîne.

    Ton programme ne peut pas fonctionner avec les corrections.
    Ton "For" ne fait qu'incrémenter j, et le i est donc indéfini dans le repeat.

    Je n'attaquerai pas le problème de cette manière car diminuer la taille de la chaine alors que tu as testé le Length(ch) quand elle était pleine ne va pas fonctionner. Le plus simple pour moi serait de créer le résultat dans une nouvelle chaine.
    L'algo serait :

    Code:
    Ch2 est initialisé à chaine vide
    Pour chaque caractère C de ch
        Si C n'est pas présent dans ch2 alors
           on ajoute C à Ch2
    Moins efficace que la méthode de PM42, mais le plus simple à écrire.
    Dernière modification par Garion ; 26/02/2019 à 07h34.

  11. #10
    danyvio

    Re : PASCAL-Suppression de caractères identiques chaîne.

    until j:=length(ch) au lieu de until j>length(ch)

    Attention : la syntaxe := est une instruction d'affectation et non de comparaison.

    Si pascal réagit comme en c, alors j:=length(ch) est toujours VRAI
    On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !

  12. #11
    LeMulet

    Re : PASCAL-Suppression de caractères identiques chaîne.

    Citation Envoyé par rima789 Voir le message
    Bonjour, alors on me demande d'écrire un programme permettant de saisir une chaîne puis d'effacer les caractères identiques dans cette chaine
    Juste une remarque.
    Si ce qui vous est demandé doit être pris à la lettre, alors la chaine "aaabbbaacca" vaudra après traitement "" (soit une chaine vide).
    Il n'est en effet précisé nulle part qu'il faut garder la première occurrence d'un caractère apparaissant plusieurs fois.

    Par ex : si ch vaut "aaabbbkaacca" alors après traitement ch vaut "k".
    Bonjour, et Merci.

Discussions similaires

  1. C18 et chaine de caracteres.
    Par invite6cb06424 dans le forum Électronique
    Réponses: 11
    Dernier message: 08/10/2015, 12h03
  2. chaîne de caractères
    Par invite11df21b5 dans le forum Programmation et langages, Algorithmique
    Réponses: 6
    Dernier message: 30/01/2013, 19h36
  3. Décodage d'une chaine de caractères, PIC 16F en C
    Par inviteb2a95bac dans le forum Électronique
    Réponses: 5
    Dernier message: 03/07/2012, 19h17
  4. Chaine de caractères en C
    Par invite953f8104 dans le forum Électronique
    Réponses: 8
    Dernier message: 03/03/2009, 20h28
  5. PIC : Chaine de caractères
    Par Toufinet dans le forum Électronique
    Réponses: 2
    Dernier message: 24/05/2006, 17h49