lire un texte et en repertorier chaque mot?

lire un texte et en repertorier chaque mot? - Ada - Programmation

Marsh Posté le 14-01-2006 à 15:59:24    

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;

Reply

Marsh Posté le 14-01-2006 à 15:59:24   

Reply

Marsh Posté le 14-01-2006 à 16:49:59    

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

Reply

Marsh Posté le 14-01-2006 à 17:30:25    

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;

Reply

Marsh Posté le 15-01-2006 à 00:31:25    

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.

Reply

Marsh Posté le 15-01-2006 à 10:24:11    

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

Reply

Marsh Posté le 15-01-2006 à 11:15:04    

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

Reply

Marsh Posté le 15-01-2006 à 13:06:25    

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
@++

Reply

Marsh Posté le 15-01-2006 à 13:25:28    

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
Reply

Marsh Posté le 15-01-2006 à 13:41:00    

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?

Reply

Marsh Posté le 15-01-2006 à 14:06:45    

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
Reply

Marsh Posté le 15-01-2006 à 14:06:45   

Reply

Marsh Posté le 15-01-2006 à 14:27:40    

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

Reply

Marsh Posté le 15-01-2006 à 14:33:14    

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.

Reply

Marsh Posté le 15-01-2006 à 14:45:27    

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.

Reply

Marsh Posté le 15-01-2006 à 14:52:16    

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.

Reply

Marsh Posté le 15-01-2006 à 15:02:54    

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

Reply

Marsh Posté le 15-01-2006 à 15:34:33    

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é.

Reply

Marsh Posté le 15-01-2006 à 15:57:31    

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

Reply

Marsh Posté le 15-01-2006 à 15:59:58    

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

Reply

Marsh Posté le 15-01-2006 à 16:56:30    

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 ....  

Reply

Marsh Posté le 15-01-2006 à 17:49:16    

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
@++

Reply

Marsh Posté le 15-01-2006 à 17:59:57    

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
Reply

Marsh Posté le 15-01-2006 à 18:09:27    

ok dak
@++

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed