Wczytanie pliku do pamęci, posortowanie linii i zapis do drugiego pliku

0

Witam
Pisze w pascalu.
Mam plik zapisany w taki sposob:
Niemam pojecia jak sie zabrac za sortowanie go wedlug indeksu. (cyfra z kropka)

  1. Zbigniew Moniek 48
  2. Beata Kopa 55
  3. Dariusz Saletra 15
  4. Jan Kowalski 50
             var
              plik:text;
              linia,linia2,xx:string;
                a,i,dl,x,yy,tab:integer;

begin
  assignFile(plik,'osoby.txt');
  reset(plik);
  while not eof(plik) do
  begin
  readln(plik,linia);
  dl:=length(linia);
  x:=pos('.',linia);
    //writeln(x);
    yy:=dl-(dl-x+1);
    xx:=copy(linia,1,yy);
    writeln(xx);
end;

  readln();
end.
             

Program robie zeby sie nauczyc na mature prosze o pomoc.

Poki co wysupłałem indeks z linijek i mysle by to teraz zapisac w tablicy. A potem jakos posortowac babelkowo i zapisywac jesli indeks wynosi 1 potem inc. Czy mysle w odp sposob?

Przerobilem stringa za pomoca vala na liczbe, teraz czy moge zrobic cos takiego:

 for i:=1 to 30 do 
begin
string[i]=liczba;
end;
0

Może wróć do podstaw arytmetyki, skoro piszesz coś takiego yy:=dl-(dl-x+1); to masz kiepsko z arytmetyką, bez której programowanie staje się bardzo trudną dziedziną.
writeln(copy(linia,1,pos('.',linia)-1));

0
_13th_Dragon napisał(a):

Może wróć do podstaw arytmetyki, skoro piszesz coś takiego yy:=dl-(dl-x+1); to masz kiepsko z arytmetyką, bez której programowanie staje się bardzo trudną dziedziną.
writeln(copy(linia,1,pos('.',linia)-1));

Uwielbiam programistow, mam wielu kolegow programistow i tez jak ty czepiaja sie najdrobniejszych szczegolow nawet jesli nie sa zwiazane z tematem. Niby małe a cieszy.
Wyobraz sobie ze to co napisalem jest dla mnie 10 razy bardziej zrozumiale niz to twoj kod. Na to jeszcze za wczesnie.

0

i tez jak ty czepiaja sie najdrobniejszych szczegolow

Ty też kiedyś zaczniesz, jak tylko zrozumiesz, że dl-(dl-x+1) jest idiotycznie zapisanym x-1.

Wyobraz sobie ze to co napisalem jest dla mnie 10 razy bardziej zrozumiale niz to twoj kod.

O! Opisałeś "zrozumienie" skalą! Jakim cudem?

Na to jeszcze za wczesnie.

To sobie rozbij kod @_13th_Dragon na części pierwsze albo powiedz, czego nie rozumiesz.

PS źle nazywasz zmienne - sam dojdź do tego, co jest w nich źle...

0

No tak tylko cyfry w pliku maja rozna dlugosc i indeks rowniez jest roznej dlugosc, ma 1, 2 czasem nawet 3 cyfry. Gdybym wycinal dlugosc lini-1 to wysuplalbym tylko 1 znak, a chce caly indeks. Co do nazw zmiennych masz racje, czyste lenistw.

1

cyfry w pliku maja rozna dlugosc

Em... co?
http://pl.wikipedia.org/wiki/Cyfra
http://pl.wikipedia.org/wiki/Liczba

Gdybym wycinal dlugosc lini-1 to wysuplalbym tylko 1 znak, a chce caly indeks.

Nie mam pojęcia, do czego w tej chwili się odnosisz, ale rozwiązanie Dragona jest z tego wszystkiego najczytelniejsze.
Spójrz na nie etapami, a jeżeli wciąż nie rozumiesz, zadaj konkretne pytanie.

0
 program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };
            var
              plik,plik2:text;
              linia,linia2,xx:string;
                a,i,dl,x,yy,tab,blad,liczba:integer;
                  tablica:array[1..30] of integer;
begin
  assignFile(plik,'osoby.txt');
  reset(plik);
  assginFile(plik2,'trzy.txt');
  rewrite(plik2);
  repeat

  while not eof(plik) do
  begin
         for i:=1 to 30 do
         begin
         readln(plik,linia);
  dl:=length(linia);
  x:=pos('.',linia);
    //writeln(x);
    yy:=dl-(dl-x+1);
    xx:=copy(linia,1,yy);

      val(xx,liczba,blad);
         writeln(liczba);
         tablica[i]:=liczba;
         if liczba=1 then
         begin
           writeln(plik2,linia,' ');
           end

         end;
        until liczba=30


         end;


    end;

  readln();
end.                    

Otóż rzeczywiscie niefortunnie wytłumaczyłem. Przestudiowalem to x-1 ktore dales i rzeczywiscie jest poprawne. Po prostu troche przesadzilem z kombinowaniem.
Wracajac do tematu. Kazda wysuplana liczbe zapisalem w tablicy, teraz chce tak dlugo sprawdzac czy element tablicy jest rowny 1 i jesli jest zapisac tę linie do pliku wynikowego, po czym zwiekszyc liczbe do 2 i tak do 30. Czy mozna to tak zrobic? Ewentualnie sortowanie babelkowe moge skopiowac z internetu ale sam go nie napisze bo nie rozumiem.

Chce majac indeksy w tablicy posortowac je od 1 do 30 i zapisac linie w ktorych sa te indeksy w takiej kolejnosci w 2 pliku.

1

Przestudiowalem to x-1 ktore dales i rzeczywiscie jest poprawne.

dl-(dl-x+1)=dl-dl+x-1=x-1...

Czy mozna to tak zrobic?

Tak, i będzie to coś w stylu sortownia bąbelkowego.

Ewentualnie sortowanie babelkowe moge skopiowac z internetu ale sam go nie napisze bo nie rozumiem.

Więc odłóż pisanie tego programu i wróć do czegoś łatwiejszego - programowanie polega na rozumieniu, a nie kopiowaniu.

0

Masz kłopoty z podstawowymi pojęciami z matematyki takie jak:

  • Nie odróżniasz liczb od cyfr
  • Nie widzisz z pierwszego rzutu oka że dl-(dl-x+1) zdecydowanie da się uprościć
    Dopóki nie uzupełnisz braków z podstaw matematyki, zabieranie się za programowanie to bezsensowna strata twego czasu.
0

Kazda wysuplana liczbe zapisalem w tablicy, teraz chce tak dlugo sprawdzac czy element tablicy jest rowny 1 i jesli jest zapisac tę linie do pliku wynikowego, po czym zwiekszyc liczbe do 2 i tak do 30. Czy mozna to tak zrobic?

Jeżeli do pliku chcesz wpisać jedynie same liczby, a nie całe linie to owszem - można; Wystarczy się jedynie zapoznać z sortowaniem bąbelkowym - chyba najprostsze, składające się z dwóch pętli i swapa;

Jednak żeby było co sortować to polecam utworzyć sobie rekord zawierający wartość całej linii wczytanej z pliku i osobnej liczby przekonwertowanej z początkowej części łańcucha; Z takiego rekordu budujesz sobie tablicę, do której wczytujesz najpierw wszystkie linie, następnie z wszystkich linii pobierasz prefiks (liczbę) i konwertujesz go na liczbę, po czym wpisujesz ją do drugiego pola danego rekordu; Kolejnym krokiem jest posortowanie rekordów w takiej macierzy i w końcu zapis do pliku linii z każdego rekordu macierzy;

Jeżeli nie wczytasz zawartości pliku do pamięci to nie będziesz miał czego zapisać do drugiego pliku.

0
_13th_Dragon napisał(a):

Masz kłopoty z podstawowymi pojęciami z matematyki takie jak:

  • Nie odróżniasz liczb od cyfr
  • Nie widzisz z pierwszego rzutu oka że dl-(dl-x+1) zdecydowanie da się uprościć
    Dopóki nie uzupełnisz braków z podstaw matematyki, zabieranie się za programowanie to bezsensowna strata twego czasu.

Przyznam sie ze:
przekombinowalem, a jesli chodzi o to twoje czepianie sie o dl-(dl-x+1) nawet sie specjalnie temu nie przygladalem, widze ze z dl-dl =0 ale po prostu z gory uznalem ze to co napisales jest zle. Widze urazona duma boli.
Z tymi liczbami i cyframi to byl zwykly skrot myslowy.

@furious programmingu
właśnie w taki sposob probuje to zrobic, pomecze sie z tym, mam nadzieje ze cos pojdzie.

0

@Alegizard: jeżeli @_13th_Dragon miałby się z jakiegoś powodu czuć urażony, tylko chyba tylko takiego, że masz gdzieś jego rady. Pomimo iż jest On na pewno bardziej doświadczonym programistą i użytkownikiem tego forum. Ty jednak wolisz atakować w odpowiedziach zamiast skupić się na ogarnięciu tego co dostajesz jako rady tutaj :/

0

@furious programming, sorka ale wieczorami masz skłonności do przekombinowania. Tablica struktur? Bąbelkowe? Przesada i tyle!

function cmp(List:TStringList;A,B:Integer):Integer;
begin
  A:=StrToInt(Copy(List[A],1,Pos('.',List[A])-1));
  B:=StrToInt(Copy(List[B],1,Pos('.',List[B])-1));
  Result:=Ord(A>B)-Ord(A<B);
end;

procedure SortFile(const FileName:String);
var Lst:TStringList;
begin
  Lst:=TStringList.Create();
  try
    Lst.LoadFromFile(FileName);
    Lst.CustomSort(cmp);
    Lst.SaveToFile(FileName);
  finally
    Lst.Free;
  end;
end;
0
olesio napisał(a):

@Alegizard: jeżeli @_13th_Dragon miałby się z jakiegoś powodu czuć urażony, tylko chyba tylko takiego, że masz gdzieś jego rady. Pomimo iż jest On na pewno bardziej doświadczonym programistą i użytkownikiem tego forum. Ty jednak wolisz atakować w odpowiedziach zamiast skupić się na ogarnięciu tego co dostajesz jako rady tutaj :/

Pewnie ale czepianie sie tego samego po kilka razy sytuacjii nie zmieni, a zauwaz ze wczesniej napisalem ze rozumiem co bylo błędem. Ja programistą nie jestem, staram sie tego nauczyc wiec troszke pokory nikomu nie zaszkodzi.

0

@Alegizard, wybrałeś złą kolejność nauczania się. Najpierw się uczy podstaw. Bo inaczej wyjdzie jak w tym kawale:
Dyrektor szpitala psychiatrycznego na otwarciu przyszpitalnego basenu ze skocznią: - "Najpierw nauczcie się skakać a później wodę nalejemy."

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