Sortowanie liczb wczytanych z pliku tekstowego

0

Witam, jestem jeszcze zielony w tym temacie i chciałbym się dowiedzieć jak napisać taki program jak poniżej. Jeśli ktoś mógłby pomóc to byłbym wdzięczny.
PS program w Pascalu próbuję napisać.

Tworzymy plik tekstowy dane.txt w którym wpisujemy 3 różne liczby całkowite. Program sort3 ma odczytać te liczby z pliku, wypisać na ekranie w oryginalnej kolejności, posortować rosnąco, wypisać na ekranie posortowane liczby. Na koniec posortowane liczby umieścić w nowym pliku tekstowym wyniki.

0

Czego konkretnie nie rozumiesz?

0

1) czy w ogóle masz tego Pascala zainstalowanego, wiesz jak się go obsługuje i umiesz stworzyć jakikolwiek program, który np. wypisze na ekranie napis w stylu "SIEMA"?
**2) ** czy umiesz "po ludzku" napisać, jakie etapy/czynności należy wykonać, aby uzyskać pożądany efekt? Jakbyś był Ty (zamiast programu), a zamiast pliku miałbyś kartkę z napisanymi liczbami, to jak byś wykonał to zadanie?

0

Jeśli chodzi o jakieś podstawy to rozumiem, mogę np. napisać program który wpisze coś do pliku i go zapisze lub sortowanie liczb (metoda bąbelkowa), rozumiem że pierwsze plan musi być czyli co robi po kolei tylko mam problem żeby połączyć jakoś tak jak w tym poleceniu.

PS
Pascala mam zainstalowanego.

0

plan musi być czyli co robi po kolei tylko mam problem żeby połączyć jakoś tak jak w tym poleceniu

Na razie nie myśl o jakichkolwiek "poleceniach", tylko postaraj się zastanowić i napisać krok po kroku, jakie czynności trzeba wykonać, żeby zrealizować Twoje zadanie. Opisz własnymi słowami, co jest do zrobienia i w jakiej kolejności. Jak to ustalimy, to się zajmiemy zamianą tego na gotowy i działający kot.

1
  1. Otwarcie i odczytanie pliku tekstowego dane.txt
  2. Wypisanie na ekranie trzech liczb z pliku tekstowego
  3. Posortowanie rosnąco liczb z pliku tekstowego dane.txt
  4. Wypisanie na ekranie posortowanych liczb
  5. Przeniesienie posortowanych liczb do nowego pliku tekstowego

coś takiego ?

0

Dokładnie :)

To teraz jedziemy po kolei. Pisałeś, że umiesz czytać/pisać z/do pliku - więc jakbyś zrobił pkt. 1 i 2 oraz 5?

P.S. W opisie problemu nie jest zaznaczone, w jaki sposób liczby będą od siebie oddzielone, więc zakładam, że każda liczba jest w osobnej linii i w ten sam sposób mamy je zwrócić.

0
program xyz;
var plik: text;
wyraz: string;
begin
	assign(plik,'C:\dane.txt');
	reset(plik);
repeat
	readln(plik, wyraz);
	writeln(wyraz);
until eof(plik);
	close(plik);
	readln();
end.

Przenoszenie to jest MoveFile('C:\plik.exe', 'D:\plike.exe'); coś takiego ?

0

zakładam, że każda liczba jest w osobnej linii

Co wczytasz w podany poniżej sposób?

ReadLn(F, s);

EDIT
Widzę, że poprawiłeś swój kod. Jest już lepiej, ale teraz wczytane liczby tylko wyświetlasz, a masz je jeszcze posegregować. W tym celu musisz je jakoś zachować. Opcje są dwie:
1) stworzyć jakieś zmienne i do nich to zapisać (wersja o wiele słabsza, odradzam)
albo
2) zastosować tablicę. Czy wiesz, co to są tablice i jak się z nich korzysta? Jeśli nie, to masz do poczytania: https://pl.wikibooks.org/wiki/Object_Pascal/Tablice lub http://pascal.kurs-programowania.pl/turbo_pascal,tablice.html albo http://zelota.netshock.pl/pdf/Pascal/41_tablice.pdf

0
program xyz;
var 
i,j,tymczasowa:integer;
plik: text;
wyraz: string;
plik : file of byte;
tablica:array[1..80,1..25]of byte;
i, j : integer;

begin
    assign(plik,'C:\dane.txt');
    reset(plik);
repeat
    readln(plik, wyraz);
    writeln(wyraz);
until eof(plik);
    close(plik);
    readln();
end;
begin
     assign('C:\dane.txt');
    reset(plik);
  j:=l_w-1;
  for i:= 1 to j do
    if t[i] < t[i+1] then
    begin
      tymczasowa:= t[i];
      t[i]:= t[i+1];
      t[i+1]:=tymczasowa;
      tymczasowa:=0;
      read(plik, tablica[i][j]);
      close('C:\dane.txt');
end.
0

Tablice niestety nie są mi znane

Dlatego tez podałem jakieś 3 przykładowe linki, w których możesz poczytać o tablicach oraz zobaczyć przykłady ich wykorzystania.

W dużym uproszczeniu, możesz sobie wyobrazić zmienne jako pudełka, w których trzymasz jakieś wartości. Możesz sobie zadeklarować zmienna1 i jej przypisać jakąś wartość, czyli polecenie zmienna1:= 54 oznacza, że do pudełka nazwanego zmienna1 wkładasz 54. Oczywiście pudełko musi być takiego typu, jakiego są wartości do niego wkładane, więc nie możesz wykonać polecenia zmienna1:= 54, jeśli zmienna1 została zadeklarowana jako np. string (czyli zmienna tekstowa, do której chcesz wsadzić wartość liczbową).

Działanie na zmiennych jest OK, ale przy większej ich ilościrobi się z tym niezły bałagan, stąd wymyślono tablice. Wyobraź sobie tablice jako szafkę z półkami/przegródkami. Zamiast tworzyć pełno zmiennych w stylu zmienna2, zmienna4, zmienna432 itp. to tworzysz sobie jedną szafkę/tablicę i odwołujesz się do konkretnych skrytek/przegródek. Do prostego przechowywania zmiennych wystarczy tablica jednowymiarowa, dlatego to, co podałeś - czyli tablica:array[1..80,1..25]of byte; jest ewidentnie wynikiem skopiowania czegoś bez zastanowienia/zrozumienia. Po pierwsze - skoro masz przechowywać 3 wartości, to nie potrzebujesz ich 2000 (bo tyle masz komórek w stworzonej przez Ciebie tablicy), a po drugie - tablica musi mieć typ zgodny z typem zmiennych, które chcesz w niej umieścić. Skoro wczytujesz zmienną var wyraz: string; to ciężko będzie ją zapisać do tablicy zadeklarowanej jako array of byte.

Jak przeczytasz podane przeze mnie artykuły albo poszukasz we własnym zakresie w necie (albo nawet na 4programmers.net - chociażby Tablice) informacji na ten temat, to na pewno za chwilę samodzielnie poprawisz swój powyższy kod ;)

1
Zachariasz._. napisał(a):
repeat
    readln(plik, wyraz);
    writeln(wyraz);
until eof(plik);

Tak nie rób – próbujesz czytać z pliku, choć nie wiesz czy coś tam jest. Poprawna konstrukcja to while do:

while not EoF(Plik) do
begin
  ReadLn(Plik, Wyraz);
  WriteLn(Wyraz);
end;
0
program sort3;

uses crt;

var plik : text;
    wyniki: text;
    a,b,c,v, kolejnosc:integer;



begin

  clrscr;

  assign(plik,'c:\dane.txt');

  reset(plik);

  writeln('oryginalna kolejnosc to');

  readln(plik, a, b, c);

  writeln(a);
  writeln(b);
  writeln(c);

  close(plik);

  Writeln(' ');
  Writeln('Kolejnosc rosnaca to');

 if a>=b then if c>=a then writeln(b,' ',a,' ',c) else if b>=c then writeln(c,' ',b,' ',a) else writeln(b,' ',c,' ',a);
 if a<b then if c>=b then writeln(a,' ',b,' ',c) else if c>=a then writeln(a,' ',c,' ',b) else writeln(c,' ',a,' ',b);

  assign(wyniki,'wyniki.txt');

  rewrite(wyniki);

  writeln(wyniki, kolejnosc);

  close(wyniki);

  writeln(kolejnosc);

  readln;

end.
1

Wszystko jest tylko nie mam pojęcia jak pobrać wynik i wpisać go do nowego pliku

Zapisz sobie do pomocniczego ciągu znaków, w skrócie tak:

uses
  sysutils;

var
  wynik: string; // pomocniczy ciąg
  wyniki: text;  // plik tekstowy

{..}

if a >= b then
  if c >= a then
    wynik := format(%d %d %d, [b, a, c])
  {..}

Natomiast po drabince ifów, użyj tej zmiennej do zapisu wyniku w plik oraz do wyświetlenia w konsoli:

writeln(wynik);         // na ekran
writeln(wyniki, wynik); // do pliku
0

program sort3;

uses crt;

var plik : text;
wyniki : text;
a,b,c,v : integer;
aa,bb,cc: string;
poprawne: string;

begin

clrscr;

assign(plik,'c:\dane.txt');

reset(plik);

writeln('oryginalna kolejnosc to');

readln(plik, a, b, c);

writeln(a);
writeln(b);
writeln(c);

close(plik);

Writeln(' ');
Writeln('Kolejnosc rosnaca to');

if a>=b then if c>=a then writeln(b,' ',a,' ',c) else if b>=c then writeln(c,' ',b,' ',a) else writeln(b,' ',c,' ',a);
if a=b then writeln(a,' ',b,' ',c) else if c>=a then writeln(a,' ',c,' ',b) else writeln(c,' ',a,' ',b);

poprawne := '';

Str(a,aa);
Str(b,bb);
Str(c,cc);

if a>=b then if c>=a then poprawne := bb + ' ' + aa + ' ' + cc else if b>=c then poprawne := cc + ' ' + bb + ' ' + aa else poprawne := bb + ' ' + cc + ' ' + aa;
if a=b then poprawne := aa + ' ' + bb + ' ' + cc else if c>=a then poprawne := aa + ' ' + cc + ' ' + bb else poprawne := cc + ' ' + aa + ' ' + bb;

assign(wyniki,'wyniki.txt');

rewrite(wyniki);

Writeln(wyniki, poprawne);

close(wyniki);

readln;

end.

0

Najszybsze sortowanie

{--------------------------------------------------------------------------
A very fast stringlist Quicksorting routine - many many times faster than
Delhpi's built in TStringlist.sort - even in spite of the double casts.
The whole routine sorts 100.000 words in about 1 sec (on a 650MHz machine (sic!)).

It is also much faster than using the TStringlist.Sorted := true property
while filling the stringlist. Set the sorted property to false and sort it using
this routine afterwards.

Copyright Hans J. Klarskov Mortensen 2004 - ([email protected]) Sorting routine
based on M. C. Kerman's book "Programming and Problem Solving
with Delphi", Pearsons Education, 2002.

If anyone can use this unit they're welcome. But I ask you to let
this copyright notice stay and that you don't pretend that you wrote it.

No warranty imaginable accepted. Use at your own risk.

(Language note: My native language is Danish. In this language "ord" means
"word" not ordinal.)

Usage : FastSortStList(YourStringlist);
-------------------------------------------------------------------------}

unit QuickSort;

interface

uses
  ComCtrls, Classes, Windows, Sysutils;

type
  {This explains part of the speed! I wish I (really) knew why!
  If this declaration is placed in connection with the
  procedure the whole procedure is more than ten times slower.
  The reason may be that placing it here means that the array is
  created when the program loads - if it is declared "locally"
  it is not created until the procedure requests it.}
  OrdArray = array of string;

procedure FastSortStList(Stlist: TStringlist);

implementation

{------------ Standard hand coded quicksort ------------------------------}
{ The sorting is - as you can see - based on ANSI-values, thus it is case sensitive.
If case insensitivity is needed use ANSIUPPERCASE.

If the string variables indicated are replaced by integer variables it'll
happily sort integers as well, but of course a StrToInt cast is needed.
--------------------------------------------------------------------------}

procedure Swap(var Value1, Value2: string);
var
  temp: string; //Integer;
begin
  temp := Value1;
  Value1 := Value2;
  Value2 := temp;
end;

function GetPIndex(lo, hi: Integer): Integer;
var
i : integer;
begin
  i := (lo+hi) div 2;
  GetPIndex := i;
end;
  
procedure Quicksort(low, high: Integer; var Ordliste: OrdArray);
var
  pivotIndex: Integer;
  pivotValue: string;
  left, right: Integer;
begin

  pivotIndex := GetPIndex(low, high);
  pivotValue := Ordliste[pivotIndex];

  left := low;
  right := high;
  repeat

    while ((left <= high) and (Ordliste[left] < pivotValue)) do
    begin
      Inc(left);
    end;

    while ((right >= low) and (pivotValue < Ordliste[right])) do
    begin
      Dec(right);
    end;
    if (left <= right) then
    begin
      Swap(Ordliste[left], Ordliste[right]);
      Inc(left);
      Dec(right);
    end;

  until (left > right);

  if (low < right) then
  begin
    Quicksort(low, right, Ordliste);
  end;

  if (left < high) then
  begin
    Quicksort(left, high, Ordliste);
  end;
end;
{-----------   End of Quicksort routines   -----------------------------}

{-----------   The Stringlist sorting routine with casts   -------------}

procedure FastSortStList(Stlist: TStringlist);
var
  SortArray: OrdArray;
  i, j: Integer;
begin
  //Cast Stringlist to an array
  setlength(sortArray, Stlist.count);
  for i := 0 to Stlist.count - 1 do
    SortArray[i] := Trim(Stlist.strings[i]);

  //Now sort
  QuickSort(Low(SortArray), High(SortArray), SortArray);

  //Recast
  for j := low(SortArray) to High(SortArray) do
    begin //Sometimes empty entries abound, get rid of them
    if StList.strings[j] <> '' then
    Stlist.Strings[j] := Sortarray[j];
    end;

  //Free the array
  SetLength(SortArray,0);
end;

end.
0

Szybkie usuwanie duplikatów

uses QuickSort;
....
var
sl : TstringList;
begin
  sl : TstringList.Create; 

  if Opendialog1.Execute then
  sl.LoadFromFile(OpenDialog1.FileName);

  FastSortStList(sl);

  sl.Sorted := True;

  sl.Duplicates := dupIgnore;
  sl.Text := sl.Text;
  
  sl.Sorted := False;
  
sl.free;
end;

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