HUFFMAN

roro1689 Messages postés 1 Date d'inscription jeudi 27 mars 2008 Statut Membre Dernière intervention 9 avril 2008 - 9 avril 2008 à 15:12
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 10 avril 2008 à 10:49
Bonjour
Pouvez vous m'aider je doit réaliser un programme en pascal me permettant de calculer le nombre d'apparition des lettres dans le texte et ensuite de réaliser le l'arbre correspondent voici ce que j'ai fait seulement il ne marche et de plus je ne voi pas comment rétuliser les resultat pour construire l'arbre.
je suis débutant
merci d'avance pour vos explication

program compter;
uses wincrt;


var texte:string;
    a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z:integer;
    it:integer;


 


Begin
Writeln('Entrez le texte');
readln(texte);
 
  for it:=1 to length(texte) do
     if texte[it]='a'
        then a:=a+1;
        writeln(a);
 
 for i:=1 to length(texte) do
     if texte[i]='b'
        then b:=b+1;
        writeln ('b');
  for i:=1 to length(texte) do
     if texte[it]='c'
        then c:=c+1;
        writeln (c);
 
  for i:=1 to length(texte) do
     if texte[it]='d'
        then d:=d+1;
        writeln (d);
  for i:=1 to length(texte) do
     if texte[it]='e'
        then e:=e+1;
        writeln (e);
  for i:=1 to length(texte) do
     if texte[it]='f'
        then f:=f+1;
        writeln (f);
  for i:=1 to length(texte) do
     if texte[it]='g'
        then g:=g+1;
        writeln (g);
  for i:=1 to length(texte) do
     if texte[it]='h'
        then h:=h+1;
        writeln (h);
  for i:=1 to length(texte) do
     if texte[it]='i'
        then i:=i+1;
        writeln (i);
  for i:=1 to length(texte) do
     if texte[it]='j'
        then j:=j+1;
        writeln (j);
  for i:=1 to length(texte) do
     if texte[it]='k'
        then k:=k+1;
        writeln (k);
  for i:=1 to length(texte) do
     if texte[it]='l'
        then l:=l+1;
        writeln (l);
  for i:=1 to length(texte) do
     if texte[it]='l'
        then l:=l+1;
        writeln (l);
  for i:=1 to length(texte) do
     if texte[it]='m'
        then m:=m+1;
        writeln (m);
  for i:=1 to length(texte) do
     if texte[it]='n'
        then n:=n+1;
        writeln (n);
  for i:=1 to length(texte) do
     if texte[it]='o'
        then o:=o+1;
        writeln (o);
  for i:=1 to length(texte) do
     if texte[it]='p'
        then p:=p+1;
        writeln (p);
  for i:=1 to length(texte) do
     if texte[it]='q'
        then q:=q+1;
        writeln (q);
  for i:=1 to length(texte) do
     if texte[it]='r'
        then r:=r+1;
        writeln (r);
  for i:=1 to length(texte) do
     if texte[it]='s'
        then s:=s+1;
        writeln (s);
  for i:=1 to length(texte) do
     if texte[it]='t'
        then t:=t+1;
        writeln (t);
  for i:=1 to length(texte) do
     if texte[it]='u'
        then u:=u+1;
        writeln (u);
  for i:=1 to length(texte) do
     if texte[it]='v'
        then v:=v+1;
        writeln (v);
  for i:=1 to length(texte) do
     if texte[it]='w'
        then w:=w+1;
        writeln (w);
  for i:=1 to length(texte) do
     if texte[it]='x'
        then x:=x+1;
        writeln (x);
  for i:=1 to length(texte) do
     if texte[it]='y'
        then y:=y+1;
        writeln (y);
  for i:=1 to length(texte) do
     if texte[it]='z'
        then z:=z+1;
        writeln (z);
 End.

2 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
9 avril 2008 à 16:39
var
  Letters : array['a'..'z'] of longword;
  i, L, T : integer;
  P       : single;
  C       : char;
 
begin
  // reset
  for C := 'a' to 'z' do
    Letters[C] := 0;
  T := 0;

  // count letters
  L := Length(Text);
  for i := 1 to L do
  begin
    C := LowerChar(Text[i]);
    if C in ['a'..'z'] then
    begin
      inc(Letters[C]);
      inc(T);
    end;
  end;
  P := 100/T;

  // show result
  for c := 'a' to 'z' do
    if Letters[C] <> 0 then
      Writeln(format(C+'= %6.d | %.2f%%',[Letters[C], P*Letters[C]]));
end;
   

<hr size="2" width="100%" />
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
10 avril 2008 à 10:49
@foxi :
j'ai effectué quelques corrections.

procedure TForm1.Button1Click(Sender: TObject);
var
  Letters: array['a'..'z'] of longword;
  i, L, T: integer;
  P: single;
  C: char;
  Ch, Chm: string;
  F1: textFile; {fichier de sortie}
begin
  try
    screen.Cursor := CrHourGlass;
  // reset
    Ch := 'Foxi est un brillant informaticien';
    AssignFile(F1, 'c:\temp\fichResult.csv');
    Rewrite(F1);          {écrasement et création du fichier de sortie}


    for C := 'a' to 'z' do
      Letters[C] := 0;
    T := 0;


  // count letters
    L := Length(Ch);
    Chm := LowerCase(Ch); {conversion de la chaîne en miniscule }
    for i := 1 to L do
    begin
      C := Chm[i];
      if C in ['a'..'z'] then
      begin
        inc(Letters[C]);
        inc(T);
      end;
    end;
    if T <> 0 then
      P := 100 / T;


  // show result
    for c := 'a' to 'z' do
      if Letters[C] <> 0 then
        Writeln(F1, format(C + '= %6.d | %.2f%%', [Letters[C], P * Letters[C]]));
  finally
    Screen.Cursor := CrDefault;
    CloseFile(F1);
    ShowMessage('terminé !');
  end;
end;

cantador
0
Rejoignez-nous