program sortujący zdania po liczbach w tekście
program w Pascal z pliku txt z listy miałby szukać w zdaniach liczb i sortować kolejność na ich podstawie
robiłem już podstawowe programy w Pascal, ale zastanawiam się jak zrobić by program szukał liczb (wielocyfrowych) w zdaniach z literami i jak to posortować? te liczby przechować w tablicy?
Podaj zawartość pliku, z którego program miałby odczytywać dane i napisz jak ma wyglądać plik wyjściowy, czy ogólnie wyjście; No i opisz sensownie problem, bo tak nieskładnie napisałeś, że niewiele można z tego opisu wywnioskować.
plik wejściowy - plik txt z linkami, każdy w innej linijce i każdy zawiera liczby według których program miałby sortować linki
plik wyjściowy - plik txt z posortowanymi linkami
nie wiem jak program miałby przeszukiwać w linkach liczb, zapisywać je to tablicy, następnie przechodzić to kolejnego i to samo
i jak to późnej sortować?
Te liczby trzeba będzie poznajdywać i powyciągać ręcznie, co jakimś wielkim problemem nie będzie; Podaj jakiś przykładowy link - choćby zmyślony, ale żeby pokazywał zasadę ich tworzenia; Wtedy coś może uda się doradzić.
http://kaplab.ge/index.php/component/k2/itemlist/user/3708
I chcesz wyciągnąć ostatnią liczbę, czyli przykładowe 3708
? Jeśli tak, to poniżej masz funkcję:
function ExtractNumberFromURL(const AURL: String): Integer;
const
SEPARATOR_CHAR = Char('/');
var
intURLLen, intSepIdx: Integer;
strNumber: String;
begin
intURLLen := Length(AURL);
intSepIdx := intURLLen;
while (intSepIdx > 0) and (AURL[intSepIdx] <> SEPARATOR_CHAR) do
Dec(intSepIdx);
strNumber := IfThen(intSepIdx > 0, Copy(AURL, intSepIdx + 1, intURLLen - intSepIdx), '');
if not TryStrToInt(strNumber, Result) then
Result := -1;
end;
Wartość -1
zostanie zwrócona, gdy URL nie posiada końcowego numeru lub jest on niepoprawny; Funkcja IfThen znajduje się w module StrUtils
; Tak przy okazji - skoro już istnieje funkcja IfThen
, powinna być też IfTrue
i IfFalse
- także były by przydatne.
no tak, jak wyciągnę liczbę 3708 raz wszystkie inne, to potem jak je posortuje trzeba wstawić cały link w miejsce poukładanych liczb i zapisać do pliku, jak to zrobić?
Zapamiętywać dodając do tablicy tyb rekordowy z polami do przechowywania pełnego url i tym identyfikatorem jako zmienną liczbową. Ewentualnie TList i dodawać własny typ TObject z tymi polami. Później już sortowanie jest łatwo zaimplementować bo listy mają do tego metodę. Tablicę też posortować nie problem. Na temat tych zagadnień jest mnóstwo stron do wygooglowania. Jakbyś zamiast od razu leciec na forum z pytaniami, wcześniej sam poszukał i pokombinował, to według mnie dawno miałbyś napisany program tak, jak potrzebujesz.
Sprawdziłem to kilkanaście minut pisania z upewnieniem się w Google jak się sortuje TList
. Kod oczywiście kompatybilny z Delphi 7 i FPC. Chociaż z tagu Pascal wnioskuje, że raczej powinieneś mieć to pod FPC. Zajeło by mi to mniej czasu gdybym podczas pisania nie musiał jeszcze odebrać telefonu. I co, takie to skomplikowane? Jak widać nie. Banał, tylko trzeba mieć zainstalowany komponent TBrain
.
I wiem, że pewnie dało by się na 1000 sposobów inaczej i prościej, ale tak jest też według mnie ok i skutecznie. Celowo wymieszałem odczyt pliku rodem z Turbo Pascala, a zapis już obiektowo żebyś sobie zobaczył, że są różne alternatywy. I na przyszłośc, co powtarzam tutaj jak mantre. Najpierw kombinujemy sami wytrtwale kodując i googlując, dosłownie do bółu, nie poddając się przy pierwszych problemach. A dopiero w ostateczności piszemy na forum. Dział Newbie czy nie. Nieważne, trzeba wykazać się trochę chęcią. Tutaj masz ode mnie rozleniwiającego gotowca. Ale chciałem sam sprawdzić, bo myśle - kurcze czy to aż tak trudne zadanie? Jak widać wcale.
Przykładowy plik input.txt
:
http://kaplab.ge/index.php/component/k2/itemlist/user/5032
http://kaplab.ge/index.php/component/k2/itemlist/user/9098
http://kaplab.ge/index.php/component/k2/itemlist/user/3708
http://kaplab.ge/index.php/component/k2/itemlist/user/4507
http://kaplab.ge/index.php/component/k2/itemlist/user/6667
http://kaplab.ge/index.php/component/k2/itemlist/user/1234
http://kaplab.ge/index.php/component/k2/itemlist/user/5555
Kod lazy_s_matysik.pp
:
program lazy_s_matysik;
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
uses
Classes, SysUtils;
const
Input_FileName = 'input.txt';
Output_FileName = 'output.txt';
type
TUrlData = class(TObject)
Url : string;
Ident : integer;
end;
function ExtractNumberFromURL(const AURL : string) : integer;
const
SEPARATOR_CHAR = Char('/');
var
StrNumber : string;
IntURLLen, IntSepIdx : integer;
begin
IntURLLen := Length(AURL);
IntSepIdx := IntURLLen;
while (IntSepIdx > 0) and (AURL[IntSepIdx] <> SEPARATOR_CHAR) do
begin
Dec(IntSepIdx);
end;
if IntSepIdx > 0 then
begin
StrNumber := Copy(AURL, IntSepIdx + 1, IntURLLen - IntSepIdx)
end
else
begin
StrNumber := '';
end;
if not TryStrToInt(StrNumber, Result) then
begin
Result := -1;
end;
end;
function CompareIdents(Item1, Item2 : Pointer) : Integer;
var
I1, I2 : integer;
begin
I1 := TUrlData(Item1).Ident;
I2 := TUrlData(Item2).Ident;
if I1 < I2 then
Result := -1
else
if I1 > I2 then
Result := 1
else
Result := 0;
end;
var
I : integer;
Lst : TList;
TF : TextFile;
UD : TUrlData;
Line : string;
SL : TStringList;
begin
AssignFile(TF, Input_FileName);
{$I-}
Reset(TF);
{$I+}
if IOResult = 0 then
begin
Lst := TList.Create;
while not EOF(TF) do
begin
Readln(TF, Line);
if Line <> '' then
begin
UD := TUrlData.Create;
UD.Url := Line;
UD.Ident := ExtractNumberFromURL(Line);
Lst.Add(UD);
end;
end;
CloseFile(TF);
Lst.Sort(@CompareIdents);
SL := TStringList.Create;
for I := 0 to Lst.Count - 1 do
begin
UD := TUrlData(Lst[I]);
if UD <> nil then
begin
SL.Add(UD.Url);
end;
end;
SL.SaveToFile(Output_FileName);
SL.Free;
for I := Lst.Count - 1 downto 0 do
begin
UD := TUrlData(Lst[I]);
if UD <> nil then
begin
FreeAndNil(UD);
Lst.Delete(I);
end;
end;
Lst.Free;
end;
end.
I wynikowy plik output.txt
po uruchomieniu skompilowanego programu:
http://kaplab.ge/index.php/component/k2/itemlist/user/1234
http://kaplab.ge/index.php/component/k2/itemlist/user/3708
http://kaplab.ge/index.php/component/k2/itemlist/user/4507
http://kaplab.ge/index.php/component/k2/itemlist/user/5032
http://kaplab.ge/index.php/component/k2/itemlist/user/5555
http://kaplab.ge/index.php/component/k2/itemlist/user/6667
http://kaplab.ge/index.php/component/k2/itemlist/user/9098