Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1170 connectés 

  FORUM HardWare.fr
  Programmation
  Ada

  lire un texte et en repertorier chaque mot?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

lire un texte et en repertorier chaque mot?

n°1283608
sandforce2​13
Posté le 14-01-2006 à 15:59:24  profilanswer
 

Bonjour, et voila mon prog
je doit ouvrir un texte et isoler tout les mots pour apres en faire un dico
mais voila je but sur ma boucle while pour l'enregistrement et la mise dans un tableau
alors si une personne a une idée a me sugerer je suis preneur merci d'avance :hello:  
 
with Ada.Text_Io,Ada.Integer_Text_Io,Ada.Strings.Unbounded;
use Ada.Text_Io,Ada.Integer_Text_Io,Ada.Strings.Unbounded;
 
procedure isoler_mot is
   
   subtype Ligne is String (1..80);
   F:File_Type;
   function Separateur(C:Character) return Boolean is
   begin Return c=' ' or ',' or ';' or '.';
   end separateur;
   Lgn:Integer:=0;
   Max_Positive:constant:=1000;
   Tableau: array (1..Max_Positive) of Ligne;
   Pos_In_Tab:Positive:=1;
   
   
begin
   
   Open(F,In_File,"toto.txt" );
   while not (End_Of_File(F)) loop
      Get_Line(F,Lg,Lgn);
      for I in 1..Lgn loop
         while Lgn(I)=C loop
            Lgn:=Lgn+1;
            tableau(pos_in_tab)(
         
             
            Pos_In_Tab:=Pos_In_Tab + 1;
           
      end loop;
      Pos_In_Tab:=Pos_In_Tab + 1;
         end loop;
      end loop;
       
   end isoler_mot;

mood
Publicité
Posté le 14-01-2006 à 15:59:24  profilanswer
 

n°1283632
Profil sup​primé
Posté le 14-01-2006 à 16:49:59  answer
 

Renvoi la derniere version de ton code, que je vois ce que je peut faire avec par-ce que celui la ...  :cry:

n°1283649
Profil sup​primé
Posté le 14-01-2006 à 17:30:25  answer
 

Si non, j'ai fait ça :

Code :
  1. with Text_Io;
  2. use Text_Io;
  3. procedure Main2 Is
  4.   subtype String_80 is String(1..80);
  5.   Fichier : File_Type;
  6.   Indice, pos : Positive := 1;
  7.   Tableau : array (1..10_000) of String_80 := (others => (others => ' '));
  8.   Char : Character;
  9.  
  10. begin
  11.   Open(Fichier, In_File, "main2.adb" );
  12.   while not End_Of_File(Fichier) loop
  13.      Get_Immediate(Fichier,Char);
  14.      case Char is
  15.         when
  16.           ' ' |
  17.           '.' |
  18.           ',' |
  19.           ';' |
  20.           Ascii.lf
  21.           =>
  22.            Indice := Indice + 1;
  23.            Pos := 1;
  24.         when others =>
  25.            Tableau(Indice)(Pos) := Char;
  26.            Pos := Pos+1;
  27.      end case;
  28.   end loop;
  29.   Close(Fichier);
  30.   for I in 1..Indice loop
  31.      Put_Line(Tableau(I));
  32.   end loop;
  33. end Main2;

n°1283826
sandforce2​13
Posté le 15-01-2006 à 00:31:25  profilanswer
 

merci cela m'a avancé
il ne me reste plus qu'as les classe par odre lexicographique
et a afficher leur occurence et mon prog seras terminer  
donc encore merci pour ta reponse rapide je bosse de mon coté et si vraiment je n'y arrive pas j'espere pouvoir me tourner vers ta science.

n°1283855
sandforce2​13
Posté le 15-01-2006 à 10:24:11  profilanswer
 

petite question car j'y est passer la nuit et la j'ai le cerveau en panne
je souhaiterais avant tout utiliser ada.character.handeling et sont
to_basic pour me permettre d'etre sur de repertorier chaque mot et de les enregistrer dans un tableau dans un ordre lexicomachin et de compter le nombre d'ocurence.
bon si jamais tu as une idée je suis preneur

n°1283862
Profil sup​primé
Posté le 15-01-2006 à 11:15:04  answer
 

Pour le to_basic, facile ; Comme tu peut le voir dans le code suivant, j'ai rajouté un test pour evité de sauter des cases du tableau. Il va sans dire que ce code n'est certainement pas optimal, je supose !
J'ai donc ajouté To_Basic dans le test de Is_Iter. Pour le trie lexicomachin, je plance.  

Code :
  1. with Ada.Characters.Handling;
  2. use Ada.Characters.Handling;
  3. with Text_Io;
  4. use Text_Io;
  5. procedure Main2 Is
  6.   subtype String_80 is String(1..80);
  7.   Fichier : File_Type;
  8.   Indice, pos : Positive := 1;
  9.   Tableau : array (1..10_000) of String_80 := (others => (others => ' '));
  10.   Char : Character;
  11.   Is_Iter : Boolean := False;
  12. begin
  13.   Open(Fichier, In_File, "main2.adb" );
  14.   while not End_Of_File(Fichier) loop
  15.      Get_Immediate(Fichier,Char);
  16.      case Char is
  17.         when
  18.           ' ' |
  19.           '.' |
  20.           ',' |
  21.           ';' |
  22.           Ascii.lf
  23.           =>
  24.           if not Is_iTer then
  25.            Tableau(indice) := To_Basic(Tableau(indice));
  26.            Indice := Indice + 1;
  27.            Pos := 1;
  28.            Is_Iter := True;
  29.           end if;
  30.         when others =>
  31.            Tableau(Indice)(Pos) := Char;
  32.            Pos := Pos+1;
  33.            Is_Iter := False;
  34.      end case;
  35.   end loop;
  36.   Close(Fichier);
  37.   -- trie du tableau --
  38.  
  39. end Main2;


ps : si tu à d'autre contrainte, je suis preneur

n°1283908
sandforce2​13
Posté le 15-01-2006 à 13:06:25  profilanswer
 

dit moi a la ligne 22 tu as employer Ascii.1f cela ve dire quoi
je suis un peu perdu car j'essai de decrypter ligne par ligne ton prog pour le comprendre mais je t'avous que tu as ete trops vite pour moi
alors si tu as deux min pour tu mettre des petit commentaire SVP
@++

n°1283918
Profil sup​primé
Posté le 15-01-2006 à 13:25:28  answer
 

Je taite le fichier caractere par caratere donc a la ligne 22 je considère ascii.lf alias "saut de ligne" comme un séparateur.
Donc, en peut-être un peut plus claire ::
 
Tant que la lecture du fichier n'est pas terminé, lire un caractere,
selon le caractere,  
       cas d'un séparateur =>
             s'il est le premier d'une serie
                convertir la chaine du tableau à l'indice
                incrémenté l'indice
                reinitialiser la position dans le mot
                affecter comme un début de serie de séparateur
       cas d'un autre caractere =>
                affecter le caractere au tabeau à l'indice à la position dans le mot
                incrementer la position dans le mot
                affecter comme une fin de serie de separateur


Message édité par Profil supprimé le 15-01-2006 à 13:25:51
n°1283924
sandforce2​13
Posté le 15-01-2006 à 13:41:00  profilanswer
 

a dac donc c caracter par caracter
mais donc seras t'il possible d'avoir un affichage final de
a          5
boris      2
cerise     8
 tu vois en fait classer par ordre lexitruc et avec le nombre de fois qu'il apparaisse dans le texte en face.
car si la recherche ce fait avec ada.unbounded.strings je crois que cela me perttrais de cataloguer des mots sans me soucier de leur longueur
quand pensse tu?

n°1283937
Profil sup​primé
Posté le 15-01-2006 à 14:06:45  answer
 

Code :
  1. with ada.strings.fixed;
  2.  
  3. -- affichage
  4.   for I in Tab'Range loop
  5.      if Tab(I)(1) = ' ' then
  6.         exit;
  7.      end if;
  8.      Put_line(Tab(I)& ' ' & Integer'Image(ada.strings.fixed.Index(Tab(I)," " )- 1));
  9.   end loop;


 
une des fonctions index :: ada.strings.fixed.Index renvoie la position d'un motif, en lui donnant comme motif " " et en autant 1 au resulat, on obtien la longeur du mot
 
Si tu préfaire utilisé ada.strings.unbonded.string_access plutot que des string_80 c'est pas un problème
 
Au fait, au fait, c'est quoi un trie lexicographique ?  :ouch:


Message édité par Profil supprimé le 15-01-2006 à 14:08:25
mood
Publicité
Posté le 15-01-2006 à 14:06:45  profilanswer
 

n°1283955
sandforce2​13
Posté le 15-01-2006 à 14:27:40  profilanswer
 

tu c'est en fait il faut faire une comparaison de chaque mots pour pouvoir les classer par odre alphabetique comme dans un dico.
peu etre avec mot1<mot2  
encore merci our ton aide

n°1283961
sandforce2​13
Posté le 15-01-2006 à 14:33:14  profilanswer
 

ton affichage est bon sauf que ma contrainte est que l'on compte le nombre de fois que peu apparaitre un mot dans un texte et non pas le nombre de caractere du mot.

n°1283970
sandforce2​13
Posté le 15-01-2006 à 14:45:27  profilanswer
 

re
dit moi est 'il possible qu'a la ligne 30 j'ajoute
if not Is_Iter then
Tableau(Indice):=To_Lower(Tableau(Indice));
Indice:=Indice+1;
Pos:=1;
Is_iTer:=True;
end if;
 
pour avoir un texte sans majuscule
pour un affiche final plus propre
je l'est mis mais le resultat n'es pas la alors je me suis surement planter.

n°1283977
sandforce2​13
Posté le 15-01-2006 à 14:52:16  profilanswer
 

oubli le dernier post
j'ai juste eu a faire
 
if not Is_iTer then
 
Tableau(indice) := To_Basic(Tableau(indice));
tableau(indice) := to_lower(tableau(indice));
Indice := Indice + 1;
 
Pos := 1;
 
et c bon pour avoir tout mes mot en minuscule et sans accents.

n°1283984
sandforce2​13
Posté le 15-01-2006 à 15:02:54  profilanswer
 

pour l'affiche que pense tu de ça
 
-- affichage du tableau --    
   Set_Col(5);Put("mots" );
   
   Set_Col(20);Put("occurence" );
   new_line;
  for I in Tableau'Range loop
if Tableau(I)(1) = ' ' then
exit;
end if;
Put_line(Tableau(I) & Integer'Image(Index(Tableau(I)," " )- 1));
end loop;  
end Main3;  
 
il ne me reste plus qu'as calquer les mot  et les occurence

n°1283994
Profil sup​primé
Posté le 15-01-2006 à 15:34:33  answer
 

Voila pour le comptage des mots

Code :
  1. package body Compteur is
  2. --   subtype String_80 is String(1..80);
  3. --   type Tableau is array(Integer range <> ) of String_80;
  4.   function Compte_Les_Mots(Dans : Tableau; Mot : String_80) return Natural is
  5.      Res : Natural := 0;
  6.   begin
  7.      for I in Dans'Range loop
  8.      if Dans(I) = Mot then
  9.         Res := Res + 1;
  10.      end if;
  11.      end loop;
  12.      return Res;
  13.   end Compte_Les_Mots;
  14. end Compteur;


 
Pour le trie ça risque d'être un peut plus long de mon côté.

n°1284000
sandforce2​13
Posté le 15-01-2006 à 15:57:31  profilanswer
 

pardonne mon manque de culture je suis depuis peu dans le ada
mais comment integrer un package a mon prog ?

n°1284002
sandforce2​13
Posté le 15-01-2006 à 15:59:58  profilanswer
 

pour l'instant sans ton compteur mon prog est
 
with Ada.Characters.Handling;use Ada.Characters.Handling;
with Text_Io;use Text_Io;
with ada.Strings.Fixed;use ada.Strings.Fixed;
procedure Main3 Is
 
subtype String_80 is String(1..80);
F: File_Type;
Indice, pos : Positive := 1;
 Tableau : array (1..2_000) of String_80 := (others => (others => ' '));
 
 
Char : Character ;
Is_Iter : Boolean := False;
 
begin
 
Open(F, In_File, "toto.txt" );
 
while not End_Of_File(F) loop
Get_Immediate(F,Char);
case Char is
when ' ' |'.' |',' |';' |
                   
Ascii.Lf =>
 
if not Is_iTer then
 
Tableau(indice) := To_Basic(Tableau(indice));
tableau(indice) := to_lower(tableau(indice));
Indice := Indice + 1;
 
Pos := 1;
 
Is_Iter := True;
 
end if;
 
when others =>
 
Tableau(Indice)(Pos) := Char;
Pos := Pos+1;
Is_Iter := False;
 
end case;
end loop;
   
   Close(F);
   
 
-- affichage du tableau --    
   Set_Col(5);Put("mots" );
   
   Set_Col(20);Put("occurence" );
   New_Line;
   new_line;
   
   for I in Tableau'range loop
       
 
if Tableau(I) (1)= ' ' then
exit;
      end if;
       
            Set_Col(5);Put(Tableau(I));
      set_col(15);put("==>" );
set_col(20);put( Integer'Image(Index(Tableau(I)," " )- 1));
       
 
   end loop;
     
   
end Main3;  
 
 
et donc voili voilou merci
donc comment l'integrer

n°1284026
Profil sup​primé
Posté le 15-01-2006 à 16:56:30  answer
 

T'a plusieur solution, soit tu copie la fonction dans le main3, soit tu fait comme moi, un petit paquetage.
 
Finalement, j'ai rapidement trouvé une solution
 
Voila du code à mettre entre balise code=ada  pour commencer et /code pour finir avec des crochet autour
 
ton main3, je t'ai encadré les insertions effectuée. à mettre dans un fichier .adb
 

Code :
  1. with Ada.Characters.Handling;use Ada.Characters.Handling;
  2. with Text_Io;use Text_Io;
  3. with ada.Strings.Fixed;use ada.Strings.Fixed;
  4. -------------------------------
  5. -------------------------------
  6. with Compteur, Package_Trie;---
  7. use  Compteur, Package_Trie;---
  8. -------------------------------
  9. -------------------------------
  10. procedure Main3 Is
  11.  
  12.   subtype String_80 is String(1..80);
  13.   F: File_Type;
  14.   Indice, pos : Positive := 1;
  15.   Tableau : array (1..2_000) of String_80 := (others => (others => ' '));
  16.  
  17.  
  18.   Char : Character ;
  19.   Is_Iter : Boolean := False;
  20.  
  21. begin
  22.   -------------------------
  23.   Open(F, In_File, "test" );
  24.   -------------------------
  25.   while not End_Of_File(F) loop
  26.      Get_Immediate(F,Char);
  27.      case Char is
  28.         when ' ' |'.' |',' |';' |
  29.  
  30.         Ascii.Lf =>
  31.  
  32.         if not Is_iTer then
  33.  
  34.            Tableau(indice) := To_Basic(Tableau(indice));
  35.            tableau(indice) := to_lower(tableau(indice));
  36.            Indice := Indice + 1;
  37.  
  38.            Pos := 1;
  39.  
  40.            Is_Iter := True;
  41.  
  42.         end if;
  43.         when others =>
  44.  
  45.            Tableau(Indice)(Pos) := Char;
  46.            Pos := Pos+1;
  47.            Is_Iter := False;
  48.  
  49.      end case;
  50.   end loop;
  51.  
  52.   Close(F);
  53.  
  54.  
  55.   --------------------------------
  56.   --------------------------------
  57.   Trier(Package_Trie.Tab(Tableau));
  58.   --------------------------------
  59.   --------------------------------
  60.  
  61.  
  62.  
  63.   -- affichage du tableau --
  64.   Set_Col(5);Put("mots" );
  65.  
  66.   Set_Col(20);Put("occurence" );
  67.   New_Line;
  68.   new_line;
  69.  
  70.   for I in Tableau'range loop
  71.  
  72.  
  73.      if Tableau(I) (1)= ' ' then
  74.         exit;
  75.      end if;
  76.  
  77.      Set_Col(5);Put(Tableau(I));
  78.      set_col(15);put("==>" );
  79.  
  80.  
  81.      ----------------------------------------------------------
  82.      set_col(20);put(Integer'Image(Compte_Les_mots(Compteur.Tab(Tableau),Tableau(I))));
  83.      ----------------------------------------------------------
  84.  
  85.   end loop;
  86.  
  87.  
  88. end Main3;


 
 
le paquetage compteur (la specification) à mettre dans un fichier .ads

Code :
  1. package Compteur is
  2.   subtype String_80 is String(1..80);
  3.   type Tab is array(Integer range <> ) of String_80;
  4.   function Compte_Les_Mots(Dans : Tab; Mot : String_80) return Natural;
  5. end Compteur;


 
le corp du compteur à mettre dans un fichier .adb

Code :
  1. package body Compteur is
  2.   function Compte_Les_Mots(Dans : Tab; Mot : String_80) return Natural is
  3.      Res : Natural := 0;
  4.   begin
  5.      for I in Dans'Range loop
  6.         if Dans(I) = Mot then
  7.            Res := Res + 1;
  8.         end if;
  9.      end loop;
  10.      return Res;
  11.   end Compte_Les_Mots;
  12. end Compteur;

 
 
le paquetage package_trie (la specification) à mettre dans un fichier .ads

Code :
  1. package Package_Trie is
  2.   subtype String_80 is String(1..80);
  3.   type Tab is array (Integer range <> ) of String_80;
  4.   procedure Trier(Un : in out Tab);
  5. end Package_Trie;


le corp du package_trie à mettre dans un fichier .adb ; un peut plus long

Code :
  1. with Text_Io;
  2. use Text_Io;
  3. package body Package_Trie is
  4.   function Est_Plus_Grand(Gauche, Droit : String_80) return Boolean is
  5.      Res : Boolean := False;
  6.      Pos : Positive := 1;
  7.   begin
  8.      loop
  9.         if Character'Pos(droit(Pos)) > Character'Pos(gauche(Pos)) then
  10.            Res := False;
  11.            exit;
  12.         elsif
  13.           Character'Pos(droit(Pos)) < Character'Pos(gauche(Pos)) then
  14.            Res := True;
  15.            exit;
  16.         else
  17.            Pos := Pos+1;
  18.         end if;
  19.         exit when Pos = 80;
  20.      end loop;
  21.      return Res;
  22.   end Est_Plus_grand;
  23.  
  24.   procedure Permute(Tableau : in out Tab;I,J : Positive) is
  25.      Tampon : String_80 := Tableau(j);
  26.   begin
  27.      Tableau(j) := Tableau(i);
  28.      Tableau(i) := Tampon;
  29.   end Permute;
  30.   procedure Trier(Un : in out Tab) is
  31.   begin
  32.      for I in Un'range loop
  33.         for J in I+1..Un'length loop
  34.            if Est_Plus_Grand(Un(j),Un(i)) then
  35.               Permute(Un,I,J);
  36.            end if;
  37.         end loop;
  38.  
  39.      end loop;
  40.   end Trier;
  41. end Package_Trie;


 
Voila je pense qu'on a bien travaillé ; C'est un peut le souc mais ça marche à peut prés ...
Il faudrait soit tout integrer dans le main, finalement pas si gros que ça, ou faire un paquetage des types utilisés ....  

n°1284060
sandforce2​13
Posté le 15-01-2006 à 17:49:16  profilanswer
 

merci pour tout je n'es plus qu'a finaliser enfin organiser le souc  
et cela roule encore merci
juste un truc mais ne t'embete pas avec ça
c'est juste que si il y a 7 fois le mot " ete "
dans le tableau ont verra ecris 7 fois
ete    7
ete    7
.
.
.
.
mais ça c rien vu le boulot que yu a realiser
alors encore merci et j'espere a bientot
@++

n°1284065
Profil sup​primé
Posté le 15-01-2006 à 17:59:57  answer
 

Si je me remet sur le problème, je te tiens au courant de mes résulats,
Bonne continuation
 
Merci à toi


Message édité par Profil supprimé le 15-01-2006 à 18:00:51
n°1284073
sandforce2​13
Posté le 15-01-2006 à 18:09:27  profilanswer
 

ok dak
@++

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Ada

  lire un texte et en repertorier chaque mot?

 

Sujets relatifs
"<texte>" interpreter comme une balise, comment eviter cela ?Boite de texte dans un encadré extensible
Lire et Ecrire dans un fichierSi la valeur décimale = 0, comment afficher un message TEXTE ?
[CSS] correspondance entre taille du texte et realité sur l'ecran[wxWidgets] Texte cliquable
html /ajuster automatique zone de texte a la saisieScript décorer du texte
Datagrid C# affichage dynamique de champs de texteC# : affichage dynamique de champ de texte
Plus de sujets relatifs à : lire un texte et en repertorier chaque mot?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR