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 :

Comptage de mots dans une chaîne


Sujet :

Pascal

  1. #1
    Candidat au Club
    Inscrit en
    décembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : décembre 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Comptage de mots dans une chaîne
    Bonjour à tous,

    Je débute en Pascal, je dispose déjà des bases mais j'ai un peu de mal à les appliquer, bref...

    Voilà, je dois faire un ptit prog : l'utilisateur doit saisir une phrase et mon programme doit en calculer le nombre de mots.

    A votre bon coeur messieurs dames.

    D'avance merci et bonnes fêtes

  2. #2
    Candidat au Club
    Inscrit en
    décembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : décembre 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai trouvé la soluce, enfin pas complètement.
    Il se pose un petit souci : si l'utilisateur tape plusieurs espaces à la suite, comment dois-je faire vu que mon compteur se situe au niveau de mes espaces ?

    Bon je repars de ce pas au boulot.

    Si une âme charitable peut m'aider, j'en serais heureux.


  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    avril 2002
    Messages
    2 454
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : avril 2002
    Messages : 2 454
    Points : 4 240
    Points
    4 240
    Par défaut
    je te propose le système suivant : un mot est délimité par deux espaces !
    Sauf pour le premier mot, et peut-être le dernier ( si on admet que l'on finit la phrase par "... mot." et non pas "....mot ." ). Tu repères en premier, le premier et le dernier mot, puis ensuite avec une boucle for, par exemple, tu lis successivement tous les caractères entre ces deux mots, en récupérant les mots que tu trouves !
    Si t'as pas tout compris, ... hé ben repose une question ! ;)
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  4. #4
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : mars 2002
    Messages : 1 212
    Points : 3 366
    Points
    3 366
    Par défaut
    Déjà, il faut voir ce qui va séparer les mots. On peut se limiter aux espaces, pourquoi pas. Ca pourrait être utile de rajouter les apostrophes dans la liste, et pourquoi pas les virgules, tant qu'on y est.

    Pour commencer, on va voir tout ce qu'on a à notre disposition pour réussir !

    1. function Pos(SousChaine, Chaine: string): Byte;

    Pos renvoie la position de SousChaine dans Chaine. Si elle n'est pas présente dedans, alors Pos renvoie 0.

    Ex: Pos('CD', 'ABCD') = 2

    2. procedure Delete(Chaine: string; Debut, Nombre: Byte);

    Delete va simplement supprimer d'une Chaine Nombre caractères, en commençant au Début-ème.

    Ex: Si S = 'ABCD', et que l'on fait Delete(S, 2, 2);, alors S = 'AD'

    3. function Length(S: string): Byte;

    Ca donne la longueur de la chaine S


    Bon, maintenant que l'on a les outils, passons à la pratique. Pour simplifier le boulot, on peut déjà remplacer toutes les virgules et apostrophes par des espaces. Ca va clarifier pas mal de choses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      i: Byte;
      S: string;
      Mots: Byte;
    begin
    { On suppose la chaine déjà remplie }
    for i := 1 to Length(S) do
      if (S[i] = ',') or (S[i] = '''') then S[i] := ' ';
    Note : S[i] accède au i-ème caractère de la chaine S (type Char)

    Bon, ensuite, virons les espaces en double, triple, etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    { Tant qu'il existe deux espaces à la suite dans la chaine, on vire le premier }
    while Pos('  ', S) > 0 do Delete(S, Pos('  ', S), 1);
    Bon, c'est mieux... On va supprimer les espaces au début et à la fin de la chaine aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    { Tant que le premier caractère est un espace... }
    while S[1] = ' ' do Delete(S, 1, 1);
    { Et idem pour le dernier (position Length(S) ) }
    while S[Length(S)] = ' ' do Delete(S, Length(S), 1);
    Ensuite, on ajoute un seul espace à la fin. Question de stratégie...

    Bon, récapitulons. On a une chaine avec des mots, spéarés par un seul et unique espace. En fait, on a même mieux. Chaque mot est suivi d'un espace ! Y'a plus qu'à les compter...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Mots := 0;
    for i := 1 to Length(S) do
      if S[i] = ' ' then Inc(Mots);
     
    WriteLn('Il y a ', Mots, ' mots dans la phrase');
    Bon. C'est une manière de faire. Il y en a plein d'autres. Sûrement même plus simples.

    A noter que je n'ai pas testé le résultat. Espérons que ça marche...

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  5. #5
    Candidat au Club
    Inscrit en
    décembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : décembre 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut


    merci bp pour ton aide Hdd34

    j'ai commencé a tester mon prog a l'aide de tes conseils, et c'est presque bon, pour le finaliser je vais utiliser ma matiere grise

    je voulais aussi savoir si il y a une fonction pour trier un tab de string par ordre alpha

    bon a+ et je trouve ce forum trop top

  6. #6
    Membre du Club

    Profil pro
    Inscrit en
    décembre 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : décembre 2002
    Messages : 43
    Points : 69
    Points
    69
    Par défaut
    on pourrait améliorer le pogramme (je n'ai pas la prétention de faire mieux que hdd34) car nous somme limités en nombre de caractères (255). La phrase de l'utilisateur ne pourrait donc pas dépasser 255 caractères (il ne pourrait pas écrire 10 fois anticonstitutionnellement !)en utilisant eoln, il n'y aurait plus ce problème.

    si je me souviens bien eoln prend la valeur true quand l'utlilisateur appuie sur 'entrée'. On considèrera donc que l'utilisateur a fini de taper sa phrase quand il appuie sur 'entrée'.
    Par contre on ne pourra plus utiliser les fonctions qu'il y avait sur les strings. Il faudra lire caractère par caractère.


    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
    var
    c:char;
    ponctuation:boolean;
    mot:integer;
     
    begin
      mot:=0;
      ponctuation:=true;
      While not eoln do
      begin
        read(c);
        if ((c=',') or (c='.') or (c='!') or (c=' ') or (c='?') or (c=':') or (c=';'))then
        begin
    {si on a à faire à un signe de ponctuation on regarde si le signe d'avant était une ponctuation (si ponctuation vaut false ou true) si ce n'en était pas on rajoute un mot, si le caractère courant n'est pas une ponctuation ponctuation vaut false... et on recommence jusqu'à trouver une fin de ligne}
          if not ponctuation then
            mot:=mot+1;
          ponctuation:=true
        else begin
          ponctuation:=false;
      end;
    end.
    j'ai pas vérifié le programme je ne sais pas s'il marche ou pas
    Désolé si je me suis planté et merci de me corriger dans ce cas

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

    Informations forums :
    Inscription : avril 2002
    Messages : 2 454
    Points : 4 240
    Points
    4 240
    Par défaut
    Pour l'algorithme de tri, il en existe des milliards ( euh un peu moins certes mais beaucoup !!! ). La seule chose à savoir, c'est qu'on peut utiliser sur les strings les opérateurs de comparaison {=,<>,<,>,<=,>=}.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mot1:='salut';
    mot2:='boujour';
    if mot1<mot2 then write(mot1,'<',mot2) else write(mot1,'>=',mot2);
    Voilà, si mot1 < mot2 alors mot1 et mot2 sont rangés alphabétiquement.
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  8. #8
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : mars 2002
    Messages : 1 212
    Points : 3 366
    Points
    3 366
    Par défaut
    En effet Kael, tu ne fais pas beaucoup mieux...
    Car ton prog a un enôôôrme problème ! Que se passe-t-il si l'utilisateur se trompe et qu'il appuie sur la touche retour arrière pour corriger un mot, voire plusieurs ? Et bien le décompte est totalement faux...

    A revoir donc...

    Pour le tri des chaînes, comme le dit Wormful, il en existe pas mal. En faisant quelques recherches sur le Net, tu trouveras ton bonheur. Pour t'aider dans tes recherches, je vais te donner quelques nom de tris : BubbleSort, SelectionSort, QuickSort, ShellSort.

    A noter que le tri à bulle (BubbleSort) est sans doûte le plus simple à mettre en oeuvre, mais aussi un des plus lents (si ce n'est pas le plus lent !).

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  9. #9
    Candidat au Club
    Inscrit en
    décembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : décembre 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    c'est bon mon prog marche correct

    merci hdd

    sinon wormful_sickfoot je vais essayer ta méthode pour mon tri de string
    dans un tableau par ordre alpha mais il faut savoir que mon tableau doit comporter 10 noms saisi par l'utilisateur

    bon si j'ai un souci je repasse par ici

    a+

  10. #10
    Membre du Club

    Profil pro
    Inscrit en
    décembre 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : décembre 2002
    Messages : 43
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par Hdd34
    Car ton prog a un enôôôrme problème !
    Je me disais bien que s'était trop beau pour qui'l marche !
    J'avais cherché une erreur mais je n'en avais pas trouvé, après tout l'utilisateur n'a qu'à pas faire de photes

    merci hdd34 de m'avoir fait remarqué l'erreur
    @+

  11. #11
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : mars 2002
    Messages : 1 212
    Points : 3 366
    Points
    3 366
    Par défaut
    Et oui...
    Foutus utilisateurs même pas capables d'écrire comme il faut du premier coup !

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

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

Discussions similaires

  1. Compter les occurences d'un mot dans une chaîne
    Par mimi2311 dans le forum Pascal
    Réponses: 4
    Dernier message: 20/04/2008, 23h37
  2. Réponses: 6
    Dernier message: 05/01/2008, 18h19
  3. [RegEx] Trouver tous les "/mot" dans une chaîne
    Par micatmidog dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2006, 13h07
  4. Compter nombre de mots dans une chaîne.
    Par xVINCEx dans le forum C++
    Réponses: 22
    Dernier message: 24/11/2004, 14h33
  5. Suppression de mots dans une chaîne
    Par psychomatt dans le forum Langage
    Réponses: 7
    Dernier message: 06/08/2004, 16h34

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