lire un texte et en repertorier chaque mot? - Ada - Programmation
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 ...
Marsh Posté le 14-01-2006 à 17:30:25
Si non, j'ai fait ça :
Code :
|
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.
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
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 :
|
ps : si tu à d'autre contrainte, je suis preneur
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
@++
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
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?
Marsh Posté le 15-01-2006 à 14:06:45
Code :
|
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 ?
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
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.
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.
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.
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
Marsh Posté le 15-01-2006 à 15:34:33
Voila pour le comptage des mots
Code :
|
Pour le trie ça risque d'être un peut plus long de mon côté.
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 ?
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
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 :
|
le paquetage compteur (la specification) à mettre dans un fichier .ads
Code :
|
le corp du compteur à mettre dans un fichier .adb
Code :
|
le paquetage package_trie (la specification) à mettre dans un fichier .ads
Code :
|
le corp du package_trie à mettre dans un fichier .adb ; un peut plus long
Code :
|
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 ....
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
@++
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
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
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;