Sortowanie przez wstawianie.

Krwawy Szczur
2016-03-18 15:21
Krwawy Szczur
0

Program polega na wczytywaniu liczb z pliku txt (liczby po enterze). Chodzi aby program pobrał je z pliku, posortował i zapisał do innego pliku.
Witam udało mi się napisać coś takiego ale niestety nie działa (problem w wyświetlaniem wczytanych liczb):
Siedze prawie cały dzień i jestem laikiem od razu mówię. Proszę bardzo nie krytykować :)

procedure TForm1.Button3Click(Sender: TObject);      //procedura do przycisku POSORTUJ LICZBY
type
a1=array [1..9999] of integer;
b1=array [1..9999] of integer;
var
LICZ:TStringlist;
N: integer;
t:text;
w:integer;
i,j,s:integer;
a:a1;
b:b1;
function fp(x,y : integer) : boolean;
begin
  fp := (x <= y)
end;
begin
LICZ:= TStringlist.Create;
LICZ.LoadFromFile('przedsortowaniem.txt');
N:=LICZ.Count-1;
LICZ.Free;
ShowMessage(FloatToStr(N));
begin
AssignFile(t, 'przedsortowaniem.txt');
reset(t);
for i:=0 to N do
begin
readln(t,w);
a[i]:=w;
end;
for i := N - 1 downto 1 do
  begin
    j := i + 1;
    while (j <= N) and not fp(a[i],a[j]) do
    begin
      a[j-1] := a[j];
      inc(j);
    end;
    a[j - 1] := a[i];
  end;
for i := 1 to N do ShowMessage(i:4, b[i]:9, a[i]:9);
end;
end;                               

Prosił bym o informację co jet źle i co muszę poprawić.

edytowany 1x, ostatnio: olesio, 2016-12-13 18:26

Pozostało 580 znaków

Krwawy Szczur
2016-03-18 15:42
Krwawy Szczur
0

Od razu mówię, że bez wyświetlania chodzi. Problem jest z wyświetlaniem.

Pozostało 580 znaków

2016-03-18 15:50
Moderator

Rejestracja: 11 lat temu

Ostatnio: 2 miesiące temu

Lokalizacja: Szczecin

1

Nie wgłębiałem się w kod, ale wskazać mogę co na pewno wedle mnie było i jest źle na pierwszy rzut oka w calym wątku, który musialem edytować.

  1. Bezsensowny tag. ludzie! Czy na prawdę nie możecie podawać konkretnie sam język?!
  2. Kod byl wstawiony w ogólne tagi, a nie konkretne kolioryzujące. A to jest nieczytelne.
  3. Kod nie jest sformatowany. Nieważne, że jest krótki. Ma być maksymalnie czytelny.

Poprawiłem poza formatowaniem, bo to powinien robić autor wątku. Następnym razem kiedy zobaczę taki wątek, powinien on polecieć do kosza. I to nie jest żart. Bo gdy ludziom o tym się wspomina, to wielkie zdziwienie. Ale jak mamy postąpić my Moderatorzy, skoro bez reakcji macie nasze uwagi w poważaniu.

Poza tym jest powód usunięcia o niskiej czytelności wątku, a to jest brakiem szacunku do potencjalnego czytelnika. Polecam zatem stosować się i sformatować swój kod porządnie. Jeśli nie umiesz samodzielnie są do tego odpowiednie narzędzia. Napisałem o tym przyklejony wątek. Ale po cóż spojrzeć. Ja mam problem to klękajcie narody, macie pomóc i tyle. Nieważne, żę się tego czytać nie da. Sorry, ale tak to często z mojej perspektywy wygląda. I to nieważne, czy to pierwszy czyjś czy ktoryś z kolei wątek na forum. I to nie tylko na tym :/


edytowany 1x, ostatnio: olesio, 2016-03-18 16:19

Pozostało 580 znaków

Krwawy Szczur
2016-03-18 15:54
Krwawy Szczur
0

Bardzo mi przykro, dopiero zaczynam z programowanie. Chce się sam czegoś nauczyć ale no po prostu mi nie wychodzi. Bardzo byłbym wdzięczny za pomoc.

Pozostało 580 znaków

2016-03-18 18:20

Rejestracja: 9 lat temu

Ostatnio: 3 godziny temu

1

tak na pierwszy rzut oka to trochę bezsensownym jest dwukrotny odczyt pliku
skoro już masz go w stringliście 'LICZ' , to użyj jej do zapełnienia tablicy "a"

for i=0 to licz.count-1 do 
  try 
     a[i+1]:=strtoint(licz[i]);
  except
     // tu  obsługa wyjątku w sytuacji gdyby string licz[i] nie był znakową reprazentacją wartości typu integer 
  end;

po drugie :
pętla

for i:=0 to N do
begin
 readln(t,w);
 a[i]:=w;
end;

nie może się wykonać prawidłowo , bo z deklaracji typu 'al' wynika że jest indeksowany od jeden , a Ty w pierwszym przejściu pętli robisz podstawienie pod element z indeksem zero , do tego robisz podstawienie dla N+1 elementów. Albo masz pętlę od zera i kończysz na N-1 , albo od jeden do N. Przy włączonej opcji kompilatora "Range checking" miał byś komunikat o wyjściu poza zakres tablicy: a[0]

po trzecie : w jakim celu definiujesz dwa identyczne typy 'al' i 'bl' i do tego zmienną 'b' typu 'bl' pod którą nic nie podstawiasz , ale próbujesz ją wyświetlić w funkcji 'showmessage'

po czwarte : argumentem funkcji 'showmessage' jest tekst (string) , kod który podałeś nawet się nie skompiluje

edytowany 1x, ostatnio: grzegorz_so, 2016-03-18 18:28

Pozostało 580 znaków

Damian Zdyb
2016-03-19 11:06
Damian Zdyb
0

Witam poownie a jak zapisać tą tablice do pliku posortowane.txt

Napisałem coś takiego:

  AssignFile(TF, 'posortowaniu.txt');
  ReWrite(TF);
  Writeln(TF, a[i]);
  CloseFile(TF);

ale wyświetla mi tylko 1 posortowaną liczbę.

Pozostało 580 znaków

2016-03-19 11:09

Rejestracja: 9 lat temu

Ostatnio: 3 godziny temu

0

zapis musisz robić w pętli

Pozostało 580 znaków

Damian Zdyb
2016-03-19 11:13
Damian Zdyb
0

Mógłbym prosić o jakiś przykładowy kod wtedy pokombinuję i zrobię go pod swój skrypt? Bo nie wiem jak przypisać pętle pod zmienną. Bo jak mam zmienna to ja podstawie pod

writeln(TF, a[i]);

a[i] i wtedy mi wpisze to do pliku.

Z góry dzięki :)

Pozostało 580 znaków

2016-03-19 11:13

Rejestracja: 14 lat temu

Ostatnio: 1 dzień temu

0

Wpisujesz jedną: Writeln(TF, a[i]); a chcesz aby pojawiły się wszystkie?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2016-03-19 11:16

Rejestracja: 9 lat temu

Ostatnio: 3 godziny temu

0
for i:=low(a) to high(a) do
  Writeln(TF, a[i]);
edytowany 1x, ostatnio: grzegorz_so, 2016-03-19 11:20

Pozostało 580 znaków

Damian Zdyb
2016-03-19 11:22
Damian Zdyb
0

Dobra wszystko super pięknie :) tylko wyświetla mi nie wiadomo jakie liczby. Do tablicy wczytuje poprawnie.

Pozostało 580 znaków

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