Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[Pascal] Sortowanie rekordów w bazie danych



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Pascal, Delphi, ...
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Myju



Dołączył: 12 Cze 2016
Posty: 2

PostWysłany: Pon Cze 13, 2016 7:17 am  OP    Temat postu: [Pascal] Sortowanie rekordów w bazie danych Odpowiedz z cytatem Pisownia

siemka
Mam problem z sortowaniem rekordów w bazie danych. Nie chce mi sie skompilować ponieważ mam gdzieś błąd. Męczę ten temat juz dosyć długo dlatego teraz postanowiłem zwrócić sie o pomoc .
Jak ktoś mi pomoże napisać chociaż sortowanie autora lub tytułu to już sobie raczej dalej poradzę.

Kod:

program baza;
uses crt;

type

   ksiegarnia = record
      tytul, autor, rok, numer:string[20];
      cena: Real;
      ilosc:Byte;
   end;


var Klaw,
    Klawisz2:char;
    Licznik:byte;
    t1,p1:byte;
    plik:text;
    p2:single;
    r:array[1..50] of ksiegarnia;

procedure wprowadz;
begin
   clrscr;

   Licznik:=Licznik+1;
   write('Tytul             : ');
   readln(r[Licznik].tytul);
   write('Autor             : ');
   readln(r[Licznik].autor);
   write('Rok    : ');
   readln(r[Licznik].rok);
   write('Numer ISBN: ');
   readln(r[Licznik].numer);
   write('Cena              : ');
   readln(r[Licznik].cena);
   write('Ilosc             : ');
   readln(r[Licznik].ilosc);
end;

procedure pusta;
begin
   writeln('Baza jest aktualnie pusta. Dodaj nowe wpisy lub wczytaj juz istniejace z pliku');
   writeln;
   writeln('Nacisnij jakis klawisz...');
   Klawisz2:=readkey;
end;


procedure wyswietl;
begin
   if Licznik=0
   then
      pusta
   else
   begin
      writeln('Tytul             : ', r[t1].tytul);
      writeln('Autor             : ', r[t1].autor );
      writeln('Rok            : ', r[t1].rok);
      writeln('Numer ISBN: ', r[t1].numer);
      writeln('Cena              : ', r[t1].cena:4:2);
      writeln('Ilosc             : ', r[t1].ilosc);
      writeln('Wartosc           : ', (r[t1].ilosc*r[t1].cena):4:2);
      writeln;
   end
end;

procedure edytuj;
begin
  clrscr;
  if Licznik=0
  then
     pusta
  else
   begin
      writeln('Ktory wpis chcesz edytować (1..', Licznik, ')');
      readln(t1);
      write('Nowy tytul             : ');
      readln(r[t1].tytul);
      write('Nowy autor             : ');
      readln(r[t1].autor);
      write('Nowy rok wydania    : ');
      readln(r[t1].rok);
      write('Nowy numer ISBN: ');
      readln(r[t1].numer);
      write('Nowa cena              : ');
      readln(r[t1].cena);
      write('Nowa ilosc             : ');
      readln(r[t1].ilosc);
   end
end;

procedure wszystko;
begin
  clrscr;
  if (Licznik<>0) then
  begin
     t1:=0;
     repeat
        t1:=t1+1;
        wyswietl;
     until t1=Licznik;
  end
end;

procedure zapisz;
begin
  if Licznik=0 then
   begin
      clrscr;
      pusta;
   end
  else
   begin
      assign(plik, 'BAZA.txt');
      rewrite(plik);

      writeln(plik, Licznik);
      t1:=0;
      repeat
         t1:=t1+1;

         writeln(plik, r[t1].tytul);
         writeln(plik, r[t1].autor);
         writeln(plik, r[t1].rok);
         writeln(plik, r[t1].numer);
         writeln(plik, r[t1].cena);
         writeln(plik, r[t1].ilosc);

      until t1=Licznik;
      close(plik);
   end
end;

procedure czytaj;
begin
  assign(plik, 'BAZA.txt');
  reset(plik);
  readln(plik, Licznik);
  t1:=0;
  repeat
    t1:=t1+1;

    readln(plik, r[t1].tytul);
    readln(plik, r[t1].autor);
    readln(plik, r[t1].rok);
    readln(plik, r[t1].numer);
    readln(plik, r[t1].cena);
    readln(plik, r[t1].ilosc);

  until t1=Licznik;
  close(plik);
end;

procedure usun;
begin
  clrscr;
  if Licznik=0 then pusta
  else
   begin
      writeln('Podaj numer wpisu do usuniecia (1..', Licznik, ')');
      readln(t1);
   repeat
      r[t1].tytul:=  r[t1+1].tytul;
      r[t1].autor:=  r[t1+1].autor;
      r[t1].rok:= r[t1+1].rok;
      r[t1].numer:= r[t1+1].numer;
      r[t1].cena:=   r[t1+1].cena;
      r[t1].ilosc:=  r[t1+1].ilosc;
      t1:=t1+1;
   until t1=Licznik;
   Licznik:=Licznik-1;
   end
end;


procedure info;
begin
  if Licznik=0 then pusta
  else
   begin
   t1:=0;
   p1:=0;
   p2:=0;
   repeat
     t1:=t1+1;
     p1:=p1+r[t1].ilosc;
     p2:=p2+(r[t1].ilosc*r[t1].cena);
   until t1=Licznik;
   if p1=1
      then writeln('Posiadasz ', p1, ' ksiazke o wartosci ', p2:4:2, ' zl.');
   if (p1=2) or (p1=3) or (p1=4)
      then writeln('Posiadasz ', p1, ' ksiazki o lacznej wartosci ', p2:4:2, ' zl.');
   if p1>=5
      then writeln('Posiadasz ', p1, ' ksiazek o lacznej wartosci ', p2:4:2, ' zl.');

   writeln('Nacisnij jakis klawisz...');
   Klawisz2:=readkey;
   end
end;

procedure sortuj(n:integer;var r:ksiegarnia);
var i,j:integer;
procedure zamien_dane(var a,b:ksiegarnia);
var c:ksiegarnia;
begin
  c:=a;
  a:=b;
  b:=c;
end;
begin
for i:=1 to n-1 do
  for j:=1 to n-i do
    if r[j].tytul>r[j+1].tytul then zamien_dane(r[j],r[j+1])

end;

begin
        Licznik:= 0;

   repeat
      writeln('1. Sorotwanie wedlug tytulu');
      writeln('2. Sortowanie wedlug autora');
      writeln('3. Sortowanie wedlug roku');
      writeln('4. Sortowanie wedlug ceny');
      writeln('5. Sortowanie wedlug roku wwydania');
      writeln('6. <-- Powrot ');

      repeat Klaw:= readkey; until (Klaw>='1') and (Klaw<='6');
      if Klaw='1' then sortuj;




      until Klaw='6';


end;

begin


   Licznik:= 0;

   repeat
      clrscr;
      writeln('1. Nowy wpis');
      writeln('2. Usun wpis');
      writeln('3. Wyswietlanie wpisu');
      writeln('4. Wyswietlanie wszystkich wpisw');
      writeln('5. Odczyt z pliku');
      writeln('6. Zapis do pliku');
      writeln('7. Stan zbioru ksiazek' );
      writeln('8. Sortuj');
      writeln('9. Koniec programu');


      repeat Klaw:= readkey; until (Klaw>='1') and (Klaw<='9');

      if Klaw='1' then wprowadz;
      if Klaw='2' then usun;
      if Klaw='3' then
        begin
           clrscr;
           write('Podaj numer wpisu (1..', Licznik, '): ');
           readln(t1);
           wyswietl;
           writeln;
           writeln('Wcisnij jakis klawisz...');
           Klawisz2:=readkey;
        end;
      if Klaw='4' then begin wszystko; info; end;
      if Klaw='5' then czytaj;
      if Klaw='6' then zapisz;
      if Klaw='7' then begin clrscr; info; end;
      if Klaw='8' then begin clrscr; sort; end;


   until Klaw='9';
end.


Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
wiesniak



Dołączył: 18 Sty 2012
Posty: 423
Skąd: Gliwice

PostWysłany: Pon Cze 13, 2016 9:35 pm      Temat postu: Odpowiedz z cytatem Pisownia

Czy procedura zamien_dane dobrze Ci działa? Tzn jak odpalisz debug, to czy po przejściu przez tę procedurę, dwa rekordy są zamienione miejscami?
Nie jestem takim specem od pascala by stwierdzić to patrząc na kod, ale mam wątpliwości czy przepisanie ma miejsce (w procedurze między rekordami - tak, ale poza nią chyba nie). Poza tym przy Twoim kodzie, wystarczyłoby przekazać indeksy do zamiany, skoro "r" jest globalna.
Skoro masz błąd, to napisz jaki - środowisko powinno Ci napisać detale błędu kompilacji i wskazać potencjalne miejsce błędu.
Aha, umieściłeś procedurę zamien_dane wewnątrz procedury sortującej - to raczej nie zadziała. Uporządkuj ten kod.

Tak poza tym, trochę słabo, że używasz samych procedur i operujesz na globalnych zmiennych. Powinieneś raczej używać funkcji i przekazywać między nimi parametry / zwracać wartości. Nazewnictwo jest liche - nazywasz księgarnią pojedynczy rekord książki, natomiast całą bibliotekę nazywasz nic nie znaczącym "r" zamiast np "książki". To samo z p1, p2, t1 - nic nie znaczące nazwy. Zwróć uwagę na spójność formy - gdzie wielką literą, gdzie małą. To ułatwia czytanie kodu (bo np od razu wiesz, czy dana zmienna jest lokalna czy globalna, bez szukania jej deklaracji). Pomyśl, czy zmienna "Klawisz2" (dlaczego nie Klawisz78?) musi być globalna? Może wystarczy jak się pojawi raz czy dwa w używających jej procedurach? Jeśli myślałeś o optymalizacji, to nie jest to poprawne - jedna, dwie czy 20 prostych zmiennych nie robią różnicy i nie trzeba (wręcz nie można) tego optymalizować wprowadzając zmienną globalną.
Fajnie by było, jakby baza nie była ograniczona do 50 pozycji. Użycie dynamicznej struktury, np listy albo wektora byłoby tu na miejscu.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Pascal, Delphi, ... Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.02374 sekund, zapytan = 12
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |