Pascal - Usuniecie rekordu

0

Witam.

Mam program typu baza danych oparty na plikach tekstowych odczytywanie / zapisywanie wyświetlanie wprowadzonych danych, wyszukiwanie, dopisywanie danych

i pozostało mi do zrobienia usunięcie rekordu np po numerze wpisu

Czyli wygląda to tak

Dodajesz auto do bazy!
Podaj jego nazwę: astra

czy chcesz dodac kolejne autko ? t/n ->t

Dodajesz auto do bazy!
Podaj jego nazwę: omega

czy chcesz dodac kolejne autko ? t/n ->n

zakonczyles dodawanie aut do bazy mozesz je przegladac wyszukiwac itd.

teraz wchodzę sobie w menu przegladanie wyswietla mi:

Dodane auto o numerze 1
Nazwa: astra

Dodane auto o numerze 2
Nazwa: omega

i teraz z bazy chcę usunąć auto o nazwie astra nie ważne jak obojętnie oby dobrze po nazwie lub po numerze wpisu

Jak to zrobic ? Czy moglby ktos napisac na przykladowych danych jak to ma wyglądać procedura usunięcia ?

0

jak przechowujesz te rekordy?? bo to tutaj jest dosc wazne...
z tego co pamietam z delphi,to bym to zrobil tak:

  • tworze liste do przechowywania rekrdow (moze byc jednokierunkowa)
  • dodajac nowe rekordy dodaje je do listy (mozna przy tym sortowac od razu alfabetycznie po nazwie lub po innym parametrze)
  • jak chce przegladac to daje sobie petle while i wyswietlanie listy, przy zapisaniu podobnie tylko do pliku to zapisuje
  • wczytywanie do listy z pliku - w sumie mozna uzyc funkcji dodajacej rekordy, a kolejne rekordy brac z pliku, az bedzie 'eof'
  • jak chce usunac to daje petle while i przeszukuje liste, w momencie znalezienia rekordu, ktory chce usunac:
    1. jesli jest to element gdzies w srodku listy, to:
      pointer poprzedzajacego elementu:=pointer usuwanego elementu(wskaznik na element bedacy na liscie po usuwanym);
      delete(rekord_ktory_chce_usunac);
    2. jesli to pierwszy element na liscie, to:
      first:=pointer usuwanego elementu;
      delete(rekord_ktory_chce_usunac);
    3. jesli to ostatni element na liscie, to:
      pointer poprzedzajacego elementu:=end;
      delete(rekord_ktory_chce_usunac);
      gdzie: first - wskaznik pokazujacy zawsze na pierwszy elemnt na liscie;
      pointer - wskaznik na nastepny element (dodajesz w rekordzie);
      end - na to wskazuje zawsze ostatni element na liscie, stad wiemy kiedy lista sie konczy i wykorzystuje sie to np jako warunek dla dzialania while'a przy wypisywaniu;
      delete - zwalnia pamiec zajmowana przez obiekt, bez tego tez by dzialalo, ale by byly smieci w pamieci, do ktorych zreszta nie mozna by sie bylo odwoac (przy tworzeniu robi sie new(nazwa) zeby rezerwowac pamiec)
0

może w ten sposób mam programik napisany w dev pascal wszystko ladnie pieknie kompiluje 0 bledow ma on wiele mankamentow np mozna podac tylko jednego pacjenta :) ale wieksza liczbe umie zrobic zeby dodawac itp wyszukiwanie tez okrojone :) ale chodzi mi tylko aby scie na tym przykladzie dodali mi do tego programu procedure ktora usunie pacjenta po imieniu ktory jest jako jedyny w bazie ale z załozeniem ze ta procedura usuwania ma byc nie tylko do jednego imienia pacjenta zrobiona ale do ogolnie ilosci ktora bym chcial podac np raz do 10 pacjentow z ktorych kazdy ma swoje imie innym razem do 5 pacjentow np wpisuje imie pacjenta ktory chce usunac np mariusz to usuwa mi go tylko zeby to usuwanie dzialalo w taki sposob prawidlowy bo raz udalo sie mi zrobic usuwanie to dzialalo tak: usuwam pacjenta o imieniu mariusz i w przegladaniu bazy juz go nie ma w pliku tez "niby go nie ma" a wyszukiwarka po wpisaniu mariusz pokazuje ze jest w bazie ? hm ?. Wlasnie chodzi mi o to usuwanie takie poprawne usuwam mariusza to wyszukiwarka juz go nie powinna widzieć. Oto kod programu (nie przejmujcie się innymi problemami ;p interesuje mnie tylko poprawne usuwanie)

program pacjencii;

uses crt;

type osoba = record
                imie:string[15];
                nazwisko:string[30];
                wiek:integer;
                miejscowosc:string[50];
                nr:integer;
             end;

var pliczek: text;
    pacjent:osoba;

    wybor,liczba,liczbaPacjentow,i:integer;
    ile,ilosc,a,c:integer;


    spis:array[0..30]of osoba;



procedure Odczyt;
begin
assign(pliczek,'C:\baza.dat');
reset(pliczek);
readln(pliczek,c);
close(pliczek);
end;


procedure Zap;
begin
assign(pliczek,'C:\baza.dat');
rewrite(pliczek);
writeln(pliczek,c);
close(pliczek);
end;

procedure nowa;

begin
Assign(pliczek, 'C:\baza.dat');
Rewrite(pliczek);
Close(pliczek);
end;

procedure dodaj;
var b:integer;
begin
Assign(pliczek, 'C:\baza.bin');
Reset(pliczek);
clrscr;
  Writeln('Podaj imie:');
  Readln(pacjent.imie);
  Writeln('Podaj nazwisko');
  Readln(pacjent.nazwisko);
  Writeln('Podaj wiek:');
  Readln(pacjent.wiek);
  Writeln('Podaj miejsce zamieszkania:');
  Readln(pacjent.miejscowosc);
  Writeln('Podaj nr ewidencji:');
  Readln(pacjent.nr);
Close(pliczek);
end;

procedure usun;

begin
Assign(pliczek, 'C:\baza.dat');
Reset(pliczek);
Writeln('Podaj nr pacjenta do usuniecia:');
Readln(liczba);
Close(pliczek);
end;

procedure wyswietl;
begin
Odczyt;
  clrscr;
  Writeln('Imie pacjenta: ' , pacjent.imie);
  Writeln('Nazwisko pacjenta: ' , pacjent.nazwisko);
  Writeln('Wiek pacjenta: ' , pacjent.wiek);
  Writeln('Miejscowosc: ' , pacjent.miejscowosc);
  Writeln('Numer: ' , pacjent.nr);
  readln;
end;

procedure wyszukajpoimieniu;
var a:string;
begin
Assign(pliczek, 'C:\baza.dat');
Reset(pliczek);
  clrscr;
  Writeln('Podaj Imie pacjenta: ');
  readln(a);
  if a<>pacjent.imie  then writeln ('Nie ma takiego pacjenta') else if a=pacjent.imie then begin
                                                                                              writeln('SZUKANY PACJENT JEST W BAZIE ')
                                                                                            end;
Close(pliczek);
end;

begin
clrscr;
repeat
Writeln(' ');
Writeln('1 - stworz nowa baze danych');
Writeln('2 - dodaj pacjenta');
Writeln('3 - usun pacjenta');
Writeln('4 - wyswietl wprowadzone dane');
Writeln('5 - wyszukaj po imieniu ');
Writeln('6 - odczytaj z pliku ');
Writeln('7 - zapisz do pliku ');
Writeln('0 - zakoncz');
Writeln(' ');
Readln(wybor);

CASE wybor of
1 : nowa;
2 : dodaj;
3 : usun;
4 : wyswietl;
5 : wyszukajpoimieniu;
6 : Odczyt;
7 : Zap;
end;
until wybor=0;

end.
 
0

Ogólnie rzecz biorąc, to masakrycznie ten prog. wygląda (baza.bin / baza.dat) (dodawanie jest ciekawe, heh).

Załóż plik typowany (chyba tak się to fachowo nazywa, jeśli nie, to naprostujcie mnie) w typie rekordu osoby pacjenta.
Powinno Ci to trochę ułatwić zadanie.

Co do usuwania i nie tylko:

  • dobrze będzie operować na tablicy (na początku raz odczytujesz cały plik z rekordami do tej tablicy, i na niej operujesz, a później zapisujesz na końcu - mniej mielenia dyskiem);
  • a samo usuwanie przeprowadzić tak: przeszukujesz tablicę, jesli znajdzie to przepisz wszystkie następne o jeden rekord wcześniej (czyli nadpisujesz tego który ma zostać usunięty) i wyczyść ostatni zapisany.
  • podobnie można zrobić jeśli byś się zdecydował na operowanie na pliku, tylko wykorzystać trzeba by było pomocniczy plik.

Myślę, że nie zrobiłem jakiegoś logicznego błędu w w.w.

0

no próbuję to sobie wyobrazić o co ci chodzi ale nie wiem jak to w kodzie napisac

0

to napisze ktoś jak to ma w kodzie mniej więcej wyglądać, nikt nie potrafi ?

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