Podgląd pojedynczego posta
Stary 24.10.2010, 02:16   #11
Patrix
Pingwin specjalista.
 
Avatar użytkownika Patrix
 
Data rejestracji: 22.06.2002
Lokalizacja: Central Park
Posty: 15,089
Patrix ma z czego być dumnym <1000 - 1499 pkt>Patrix ma z czego być dumnym <1000 - 1499 pkt>Patrix ma z czego być dumnym <1000 - 1499 pkt>Patrix ma z czego być dumnym <1000 - 1499 pkt>Patrix ma z czego być dumnym <1000 - 1499 pkt>Patrix ma z czego być dumnym <1000 - 1499 pkt>Patrix ma z czego być dumnym <1000 - 1499 pkt>Patrix ma z czego być dumnym <1000 - 1499 pkt>Patrix ma z czego być dumnym <1000 - 1499 pkt>Patrix ma z czego być dumnym <1000 - 1499 pkt>
Cisza spokój to przed spaniem poddałem analizie powyższe wypociny mimo późnej godziny.

Drogi wyhylybymy17, na wstępie zapytam się o coś.
Czy Ty nie uważasz na lekcjach i potem musisz edukować się w domu czy wzór tego programu podał nauczyciel ? Jeśli to nie Twoja wina to gorzko...
Za ten program dostałbyś u mnie dwóję (w liceum/gimnazjum to i tak pozytywna ocena).
Nie bierz tego do siebie ale już wyjaśniam...

Każdy program, o którym można powiedzieć, że jest "bazodanowy" obojętnie czy operuje na plikach czy na prawdziwej bazie
rozróżnia poszczególne wpisy po niepowtarzalnych identyfikatorach w rekordach - u Ciebie ich brak.
Zastosowałeś tu substytut w postaci szurania wskaźnikiem, który w prawdzie działa ale to jest po prostu straszne
Następną straszną rzeczą jest wyświetlanie danych - zastosowałeś tutaj liczbę porządkową co za tym idzie jest ona płynna. Po skasowaniu jakiegoś filmu przed filmem z lp=5 ten film robi się lp=4. Tu znowu daje o sobie znać brak ID bo kasowanie czegoś po zmiennej liczbie porządkowej, która de facto nie ma nic wspólnego z samym zbiorem jest straszne (ponumerować i skatalogować pudełka - rzecz w tym przypadku niemożliwa)

Kasowanie wpisu przy bazie w pliku tekstowym powinno odbywać się mniej więcej tak:
- masz bazę w formacie FILM( ID, tytul, produkcja, czas trwania )
- prosisz usera o podanie ID do skasowania
- przepisujesz bazę do pliku tymczasowego z pominięciem tego ID
- nadpisujesz plik bazy utworzoną kopią, która nie posiada już tego ID
- kasujesz plik tymczasowy

LUB

usuwasz dany ID logicznie (gdzie STAN=1 to pozycja dostepna, STAN=0 to pozycja skasowana)
- masz bazę w formacie FILM( ID, STAN, tytul, produkcja, czas trwania )
- prosisz usera o podanie ID do skasowania
- zmieniasz stan na 0 przy pozycji o tym ID co za tym idzie pozycja przestaje się wyświetlać i jest pomijana.


Twój program jest napisany całkowicie źle - tyle mojego wykładu.

Przejdźmy teraz do poprawy kodu.

- zadeklarowałeś dwie rzeczy, których nie używasz - nie jest to błąd ale kompilator ma za zadnie poinformować Cię o tym co też czyni.
- program sypał się zawsze na ostatnim rekordzie ponieważ zastosowałeś zły typ pętli co za tym idzie w pewnej chwili program chciał odczytać pustkę, coś czego nie ma bo plik już dawno się skończył.

W tym przypadku najpierw wykonujesz operację a warunek sprawdzasz na końcu:
Kod:
repeat
  read(baza,dane);
  write(temp,dane);
until eof(baza);
Czyli program o końcu pliku dowie się za późno tzn po wykonaniu błędnej operacji a dokładniej to się nawet nie dowie bo się najpierw wysypie.

Program będzie działać jeśli w procedurze usuń zastosujesz pętlę, która najpierw bada warunek a potem wykonuje operacje tj.:

Kod:
while not eof(temp) do
 begin
 read(temp,dane);
 write(baza,dane);
end;
W tym przypadku program dowie się o końcu pliku przed wykonaniem błędnej operacji.

No to tyle, idę spać, popraw te pętle i program będzie działać.
__________________
amiga500site

Ostatnio zmieniany przez Patrix : 24.10.2010 o godz. 02:19
Patrix jest offline   Odpowiedz cytując ten post