Program sortujący zdania po liczbach w tekście

0

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?

0

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ć.

0

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ć?

0

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ć.

0

http://kaplab.ge/index.php/component/k2/itemlist/user/3708

1

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.

0

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ć?

1

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.

2

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1