Hi to all,
I have this homework with Pascal.

We have a text file that has some text in it (thetext.txt). we want to put all the words of the text and the frequency in another file without repeating the word(file name finalfile.txt).

Example:

thetext.txt has this text in it:

the quick brown fox jumps over a big brown bear that was sleeping on a big brown board.

this is how the finalfile should look.
finalfile.txt:

the 1
quick 1
brown 3
fox 1
jumps 1
over 1
a 2
big 2
bear 1
that 1
was 1
sleeping 1
on 1
board 1

-------------------------------
I tried to solve this exercise this way.

1st we read the thetext.txt letter one by one and merge them in a string. than use a linked list to keep the word and the frequency. If for instance one of the words is in the list than we raise the frequency by one otherwise we add the word to the list and set the frequency to one.

at the end we write all the elements of the list in the finalfile.txt and we're done.

BUT when i run the program i wrote it just gets stuck!

i am pasting the code so you'll see what i wrote.
Please if anyone can help me in finding the bug, i would really appreciate that.
Have a nice weekend :D

Program DenduridheFjale;
Uses WinCRT;

Type
str=string[15];
fjale=^liste;
liste=record
fjala:string[15];
den:integer;
tjetri:fjale;
end;


var listajone,element,org:fjale; ff,fp:text; ch:char;fj:str;

Procedure Kontrollo_listen(Var l:fjale;fj2:str);
Var tmp,tmp2,koka:fjale; c:boolean;
Begin
 c:=False;
 tmp:=l; koka:=l;
 If tmp=nil then
 Begin
   new(tmp2);
   tmp2^.fjala:=fj2;
   tmp2^.den:=1;
   tmp2^.tjetri:=tmp;
   tmp:=tmp2;
   l:=tmp;
   dispose(tmp2);
 End
 else
  Begin
   while tmp<>nil do
    Begin
     If tmp^.fjala=fj2 then
     Begin
      tmp^.den:=tmp^.den+1;
      c:=true;
     End;
     tmp:=tmp^.tjetri;
    End;
 End;
If c=false then
   Begin
    new(tmp2);
    tmp2^.fjala:=fj2;
    tmp2^.den:=1;
    tmp2^.tjetri:=koka;
    koka:=tmp2;
    l:=koka;
    dispose(tmp2);
   End;
  End;

Begin {Programi Kryesor}
 Assign(ff,'c:\SKTP\SKTXT\tekst.txt');    Reset(ff);
 Assign(fp,'c:\SKTP\SKTXT\fjaleden.txt'); Rewrite(fp);
 listajone:=nil;
 new(element);
 fj:='';
 While not eof(ff) do
     Begin
      While not eoln(ff) do
       Begin
        Read(ff,ch);
        If ((ch<>'') and (ch<>' ') and (ch<>',') and (ch<>'.') and (ch<>'?') and (ch<>'!')) then
        fj:=fj+ch
        else
        If fj<>'' then
        Begin
         Kontrollo_listen(listajone,fj);
         fj:='';
        End;
       End;
      Readln(ff);
     End;

 org:=listajone;
 while org<>nil do
 Begin
  writeln(fp,org^.fjala,org^.den);
  org:=org^.tjetri;
 End;
 Close(ff);Close(fp);
END.

guys sorry,
thetext.txt = tekst.txt
finalfile.txt= fjaleden.txt

Member Avatar for Micheus

BUT when i run the program i wrote it just gets stuck!

Olsi009, start with this changes:

Procedure Kontrollo_listen(Var l:fjale;fj2:str);
Var tmp,tmp2,koka:fjale; c:boolean;
Begin
  c:=False;
  tmp:=l; koka:=l;
  If tmp=nil then
  Begin
    new(tmp2);
    tmp2^.fjala:=fj2;
    tmp2^.den:=1;
    tmp2^.tjetri:=tmp;
//   tmp:=tmp2;
    l:=tmp;
//   dispose(tmp2);
  End
  else
  Begin
    while (tmp<>nil) and (not c) do
//   while tmp<>nil do
    Begin
      If tmp^.fjala=fj2 then
      Begin
        tmp^.den:=tmp^.den+1;
        c:=true;
      End;
      tmp:=tmp^.tjetri;
    End;
  End;
  If c=false then
  Begin
    new(tmp2);
    tmp2^.fjala:=fj2;
    tmp2^.den:=1;
    tmp2^.tjetri:=koka;
    l:=tmp2;  // use this
//    koka:=tmp2;
//    l:=koka;
//    dispose(tmp2);
  End;
End;

You cannot call dispose after have allocated memory that you still will use - You will use than until your program has finished. So, you will need to write a procedure in order to free allocated memory at end of your program - don't forget it.

Bye

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.