Ĺadny brzuch
1 Wstęp
Celem zadania 1 jest przećwiczenie podstawowych konstrukcji języka pascal/Delphi (tablice, pętle, procedury, instrukcje warunkowe) oraz podstawowych funkcji standardowych (obsługa plików, działania na łańcuchach znaków).
2 Dane wejściowe
Danymi wejściowymi dla programu jest nazwa pliku tekstowego (plain-ASCII), który zawiera tekst w dowolnym języku naturalnym zapisany alfabetem łacińskim.
3 Działanie programu i wyniki
Program ma za zadanie obliczyć ilość wystąpień poszczególnych słów w tekście. Za słowo uważa się ciąg liter nie zawierający żadnego innego znaku, przy czym program nie powinien rozróżniać dużych i małych liter.
4 Wyniki
Wynikiem działania programu powinien być plik zawierający:
1. Wszystkie słowa w tekście w kolejności alfabetycznej.
2. Wszystkie słowa w tekście w kolejności od najczęściej do najrzadziej występujących.
(w jednym pliku)
5 Uwagi
1. Dopuszczalne jest arbitralne ograniczenie maksymalnej liczby słów występujących w tekście. Ograniczenie to nie może być mniejsze niż 1000 słów.
2. Program nie musi uwzględniać polskich liter “z ogonkami” (tzn. może je po prostu opuszczać).
Na razie różnymi metodami mam coś takiego:
unit zad11; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TRecord = record Nazwa : string[255]; Wystapien: integer; end; var f: textfile; f2: TextFile; litera : char; Slowo:string; TablicaSlow : array[0..1000] of TSlowo; TabPos: integer; index : integer; type TForm1 = class(TForm) Button1: TButton; Memo: TMemo; // procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function IndexOfSlowo(slowo: string):integer; var i: integer; begin Result:= 0; for i:=0 to TabPos do if (TablicaSlow[i].Nazwa = slowo) then begin Result:= i; Exit; end; end; procedure IncWystapien(Index: integer); begin Inc(TablicaSlow[Index].Wystapien); end; procedure AddSlowo(slowo: string); begin index:= IndexOfSlowo(slowo); if (index = -1)then begin Inc(TabPos); TablicaSlow[TabPos].Nazwa := slowo; TablicaSlow[TabPos].Wystapien:= 1; end else if Index > -1 then incWystapien(Index); end; procedure TForm1.Button1Click(Sender: TObject); begin slowo:=''; assignFile(f,'d:\gpl.txt'); reset(f); while not eof(f) do begin read(f,litera); if litera in ['a'..'z','A'..'Z'] then slowo:= slowo + lowercase(litera) else begin if slowo <> '' then AddSlowo(slowo); end; end; assignFile(f2,'d:\gpl_sort.txt'); Rewrite(f2); writeln(f2,'--- alfabetycznie ---'); Writeln(f2, ); writeln(f2,'--- czestosc wystepowania ---'); Writeln(f2, ); CloseFile(f2); Memo.Lines.LoadFromFile('d:\gpl_sort.txt'); end; end.
Program niby działa (nie wywala się) :) kiedy napisze Writeln(f2, slowo ); to wypisuje mi cały tekst bez spacji a jak wpisze "TablicaSlow[TabPos].Nazwa" to nic nie wypisuje tak jakby nie miał niczego w tablicy. A z ilością wystąpień mam ten problem, że wypisuje mi ogólną ilość wyrazów w tekscie (dlatego nie stosuje narazie pętli). Nie mam zielonego pojęcia jak to naprawić. Będę wdzięczny za jakąkolwiek pomoc z dokończeniu tego programu. Najlepiej traktować mnie jak zielonego. Jeśli uznacie, że nikt nie odpowie to napiszcie, żebym nie robił sobie jakichkolwiek złudzeń.
Chciałbym jak najszybciej dokończyć go (29 oddaje go na zaliczenie), bo w wtedy w weekend mam również trochę innych zaliczeń (analiza,miernictwo,sprawdzian z przedmiotu na jaki to mam napisać) do napisania (pierwszych terminów).
So please help me.
for JAKIŚINDEX := 0 to 1000 do begin Writeln(f2,(TablicaSlow[TabPos].Nazwa + ' ')); end;
I spacje już są :)
//W rekordzie SLOWO nie ograniczaj Nazwa : string[255] do 255 bo to ogranicznik typu, i i tak więcej przy zmiennej typu String nie władujesz :)
////TablicaSlow : array[0..1000] of TSlowo; jest zapełniona zmienną TSlowo, a gdzie ją masz? Mi się wydaje, że powinna być wypełniona TRecord :P i bedzie działało ;)
//////Co do ilości powturzeń to klepie procedurke :P poczekaj a ją wkleje.
////////Powinno działać ;)
for Licznik := 0 to 1000 do begin for LicznikLinijek := 0 to Memo1.Lines.Count - 1 do begin TempLine := Memo1.Lines.Strings[LicznikLinijek]; while Pos(TablicaSlow[Licznik].Nazwa,TempLine) <> -1 do begin TempLine := Copy(TempLine,Pos(TablicaSlow[Licznik].Nazwa,TempLine) + Length(TablicaSlow[Licznik].Nazwa),Length(Memo1.Lines.Strings[LicznikLinijek] )); TablicaSlow[Licznik].Wystapien := TablicaSlow[Licznik].Wystapien + 1; end; end; end;
Licznik i LicznikLinijek to oczywiście zmienne typu Integer, a TempLine String. Teraz napewno powinno działać ;)
Użytkownik mariuszlorenc edytował ten post 21 styczeń 2006, 15:35
Miałem jednak ustawiony na Trecord i może tytaj nie zmienilem wszystkiego pod to( korzystałem posta z innego forum a tam miałem jeszcze na Tslowo i może nie wszędzie zmieniłem .slowo na nazwa a Tslowo na TRecord).
Writeln(f2,(TablicaSlow[TabPos].Nazwa + ' ')); Coś podobnego do tego używałem już, przy użyciu TablicaSlow[TabPos].Nazwa właśnie mi nic nie wypisuje, jak wklepie zamiast tego slowo to idzie cały text. a jak wpisze TablicaSlow[0] to również mi nic nie wypisuje
Uzywajać twojej procedury, genialne delphi wywala się(zreszta przy moim programowaniu delphi lubi to robic :) ) Nie wiem dlaczego jak wstawie to jako osobną procedure to przyczepia mi sie do memo. A własnie, memo używam tu tylko do automatycznego podglądu pliku do ktorego to wszystko zapisuje(leń ze mnie i nie chce mi sie skakać między tyloma okienkami).
Załozyłeś sobie konto, żeby przedstawić nam swoje zadanie domowe, z którym oczywiście kolejny student sobie nie moze poradzić. Albo nie słuchałeś na lekcji albo nie chcesz dać zarobić odpowiednim ludziom, którzy to pykają wam zadania.
Jeśli o mnie chodzisz to możesz nie zaliczyc informatyki.
mariuszlorenc pisze zawsze zgłowy :) ładne teraz wstawił zdjęcie pewnie ze studniówki więc nie możesz ufać teraz jego głowie.
No i? Dałeś stary kod i sam mam się domyśleć co do tej pory zmieniłeś?
//Zdjęcie po ślubie siorki :lol: :lol: :lol:
Użytkownik mariuszlorenc edytował ten post 21 styczeń 2006, 16:50
Z tego co przejrzałem kod jest aktualny, tlyko to TRecord sie nie zgadzało.
Załozyłeś sobie konto, żeby przedstawić nam swoje zadanie domowe, z którym oczywiście kolejny student sobie nie moze poradzić. Albo nie słuchałeś na lekcji albo nie chcesz dać zarobić odpowiednim ludziom, którzy to pykają wam zadania. No ta bo do pomocy to już tylko nie liczni są zdolni, bo reszta tylko chce zarabiać :/ znam to . A sluchać to słuchałem i chodziłem na laborki i cwiczenia,ale facet od laborek nie ma zbytnio talentu do tlumaczenia z czym co się je (mimo, że on wie). A płacić to cóż, co się naucze dając komuś do napisania? A w ten sposób zawsze coś się naucze.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Celem zadania 1 jest przećwiczenie podstawowych konstrukcji języka pascal/Delphi (tablice, pętle, procedury, instrukcje warunkowe) oraz podstawowych funkcji standardowych (obsługa plików, działania na łańcuchach znaków).
2 Dane wejściowe
Danymi wejściowymi dla programu jest nazwa pliku tekstowego (plain-ASCII), który zawiera tekst w dowolnym języku naturalnym zapisany alfabetem łacińskim.
3 Działanie programu i wyniki
Program ma za zadanie obliczyć ilość wystąpień poszczególnych słów w tekście. Za słowo uważa się ciąg liter nie zawierający żadnego innego znaku, przy czym program nie powinien rozróżniać dużych i małych liter.
4 Wyniki
Wynikiem działania programu powinien być plik zawierający:
1. Wszystkie słowa w tekście w kolejności alfabetycznej.
2. Wszystkie słowa w tekście w kolejności od najczęściej do najrzadziej występujących.
(w jednym pliku)
5 Uwagi
1. Dopuszczalne jest arbitralne ograniczenie maksymalnej liczby słów występujących w tekście. Ograniczenie to nie może być mniejsze niż 1000 słów.
2. Program nie musi uwzględniać polskich liter “z ogonkami” (tzn. może je po prostu opuszczać).
Na razie różnymi metodami mam coś takiego:
unit zad11; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TRecord = record Nazwa : string[255]; Wystapien: integer; end; var f: textfile; f2: TextFile; litera : char; Slowo:string; TablicaSlow : array[0..1000] of TSlowo; TabPos: integer; index : integer; type TForm1 = class(TForm) Button1: TButton; Memo: TMemo; // procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function IndexOfSlowo(slowo: string):integer; var i: integer; begin Result:= 0; for i:=0 to TabPos do if (TablicaSlow[i].Nazwa = slowo) then begin Result:= i; Exit; end; end; procedure IncWystapien(Index: integer); begin Inc(TablicaSlow[Index].Wystapien); end; procedure AddSlowo(slowo: string); begin index:= IndexOfSlowo(slowo); if (index = -1)then begin Inc(TabPos); TablicaSlow[TabPos].Nazwa := slowo; TablicaSlow[TabPos].Wystapien:= 1; end else if Index > -1 then incWystapien(Index); end; procedure TForm1.Button1Click(Sender: TObject); begin slowo:=''; assignFile(f,'d:\gpl.txt'); reset(f); while not eof(f) do begin read(f,litera); if litera in ['a'..'z','A'..'Z'] then slowo:= slowo + lowercase(litera) else begin if slowo <> '' then AddSlowo(slowo); end; end; assignFile(f2,'d:\gpl_sort.txt'); Rewrite(f2); writeln(f2,'--- alfabetycznie ---'); Writeln(f2, ); writeln(f2,'--- czestosc wystepowania ---'); Writeln(f2, ); CloseFile(f2); Memo.Lines.LoadFromFile('d:\gpl_sort.txt'); end; end.
Program niby działa (nie wywala się) :) kiedy napisze Writeln(f2, slowo ); to wypisuje mi cały tekst bez spacji a jak wpisze "TablicaSlow[TabPos].Nazwa" to nic nie wypisuje tak jakby nie miał niczego w tablicy. A z ilością wystąpień mam ten problem, że wypisuje mi ogólną ilość wyrazów w tekscie (dlatego nie stosuje narazie pętli). Nie mam zielonego pojęcia jak to naprawić. Będę wdzięczny za jakąkolwiek pomoc z dokończeniu tego programu. Najlepiej traktować mnie jak zielonego. Jeśli uznacie, że nikt nie odpowie to napiszcie, żebym nie robił sobie jakichkolwiek złudzeń.
Chciałbym jak najszybciej dokończyć go (29 oddaje go na zaliczenie), bo w wtedy w weekend mam również trochę innych zaliczeń (analiza,miernictwo,sprawdzian z przedmiotu na jaki to mam napisać) do napisania (pierwszych terminów).
So please help me.
for JAKIŚINDEX := 0 to 1000 do begin Writeln(f2,(TablicaSlow[TabPos].Nazwa + ' ')); end;
I spacje już są :)
//W rekordzie SLOWO nie ograniczaj Nazwa : string[255] do 255 bo to ogranicznik typu, i i tak więcej przy zmiennej typu String nie władujesz :)
////TablicaSlow : array[0..1000] of TSlowo; jest zapełniona zmienną TSlowo, a gdzie ją masz? Mi się wydaje, że powinna być wypełniona TRecord :P i bedzie działało ;)
//////Co do ilości powturzeń to klepie procedurke :P poczekaj a ją wkleje.
////////Powinno działać ;)
for Licznik := 0 to 1000 do begin for LicznikLinijek := 0 to Memo1.Lines.Count - 1 do begin TempLine := Memo1.Lines.Strings[LicznikLinijek]; while Pos(TablicaSlow[Licznik].Nazwa,TempLine) <> -1 do begin TempLine := Copy(TempLine,Pos(TablicaSlow[Licznik].Nazwa,TempLine) + Length(TablicaSlow[Licznik].Nazwa),Length(Memo1.Lines.Strings[LicznikLinijek] )); TablicaSlow[Licznik].Wystapien := TablicaSlow[Licznik].Wystapien + 1; end; end; end;
Licznik i LicznikLinijek to oczywiście zmienne typu Integer, a TempLine String. Teraz napewno powinno działać ;)
Użytkownik mariuszlorenc edytował ten post 21 styczeń 2006, 15:35
Miałem jednak ustawiony na Trecord i może tytaj nie zmienilem wszystkiego pod to( korzystałem posta z innego forum a tam miałem jeszcze na Tslowo i może nie wszędzie zmieniłem .slowo na nazwa a Tslowo na TRecord).
Writeln(f2,(TablicaSlow[TabPos].Nazwa + ' ')); Coś podobnego do tego używałem już, przy użyciu TablicaSlow[TabPos].Nazwa właśnie mi nic nie wypisuje, jak wklepie zamiast tego slowo to idzie cały text. a jak wpisze TablicaSlow[0] to również mi nic nie wypisuje
Uzywajać twojej procedury, genialne delphi wywala się(zreszta przy moim programowaniu delphi lubi to robic :) ) Nie wiem dlaczego jak wstawie to jako osobną procedure to przyczepia mi sie do memo. A własnie, memo używam tu tylko do automatycznego podglądu pliku do ktorego to wszystko zapisuje(leń ze mnie i nie chce mi sie skakać między tyloma okienkami).
Załozyłeś sobie konto, żeby przedstawić nam swoje zadanie domowe, z którym oczywiście kolejny student sobie nie moze poradzić. Albo nie słuchałeś na lekcji albo nie chcesz dać zarobić odpowiednim ludziom, którzy to pykają wam zadania.
Jeśli o mnie chodzisz to możesz nie zaliczyc informatyki.
mariuszlorenc pisze zawsze zgłowy :) ładne teraz wstawił zdjęcie pewnie ze studniówki więc nie możesz ufać teraz jego głowie.
No i? Dałeś stary kod i sam mam się domyśleć co do tej pory zmieniłeś?
//Zdjęcie po ślubie siorki :lol: :lol: :lol:
Użytkownik mariuszlorenc edytował ten post 21 styczeń 2006, 16:50
Z tego co przejrzałem kod jest aktualny, tlyko to TRecord sie nie zgadzało.
Załozyłeś sobie konto, żeby przedstawić nam swoje zadanie domowe, z którym oczywiście kolejny student sobie nie moze poradzić. Albo nie słuchałeś na lekcji albo nie chcesz dać zarobić odpowiednim ludziom, którzy to pykają wam zadania. No ta bo do pomocy to już tylko nie liczni są zdolni, bo reszta tylko chce zarabiać :/ znam to . A sluchać to słuchałem i chodziłem na laborki i cwiczenia,ale facet od laborek nie ma zbytnio talentu do tlumaczenia z czym co się je (mimo, że on wie). A płacić to cóż, co się naucze dając komuś do napisania? A w ten sposób zawsze coś się naucze.