[Pascal]Dodanie ort! rekordów!!!.

0

Witajcie, poszperałem po forum ale nie znalazłem kompletnej odpowiedzi.
Mam program taką mini baze która:
1.Dodaje nowu samochód,
2.Wyświetla wszystkie samochody,
3.Wyświetla dane wybranego samochodu,
4.Wyjście z bazy.

i musze dodać 2 rekordy, które:
-usunięcie wybranego elementu,
-zmieni zawartoś wybranego elementu

Jak będzie wyglądał taki kod tych dwóch rekordów i gdzie je wstawić.
A o to program:

PROGRAM Piotr;
USES CRT;
CONST
        PLIK='C:\ja\ta.txt';
TYPE
        MODEL =RECORD
        MARKA:STRING;
        MODEL:STRING;
        ROK:STRING;
        POJEMNOSC:STRING;
        END;
VAR
   B:STRING;
   D:TEXT;
   A:CHAR;
   R:MODEL;
   PL:FILE OF MODEL;
BEGIN
     CLRSCR;
     ASSIGN(PL,PLIK);

     REPEAT
           CLRSCR;
WRITELN('BAZA SAMOCHODOW: WYSWIETLA INFORMACJE O SAMOCHODACH NASZEJ FIRMY');
           WRITELN('1-DODAJ NOWY SAMOCHOD');
           WRITELN('2-WYSWIETL WSZYSTKIE SAMOCHODY');
           WRITELN('3-WYSWIETL KONKRETNY SAMOCHOD');
           WRITELN('4-WYJSCIE Z BAZY');
           A:=(READKEY);
           IF A='1' THEN
              BEGIN
              {$I-}reset(pl);{$I+}
              IF ioresult=0 then
                 BEGIN
                    SEEK(PL,FILESIZE(PL));
                    WRITELN('WPISZ DANE DOT. SAMOCHODOW');
                    WRITELN('PODAJ NAZWE MARKI');
                    READLN(R.MARKA);
                    IF R.MARKA<>'' THEN
                    BEGIN
                         WRITELN('PODAJ MODEL');
                         READLN(R.MODEL);
                         WRITELN('PODAJ ROK PRODUKCJI');
                         READLN(R.ROK);
                         WRITELN('PODAJ POJEMNOSC');
                         READLN(R.POJEMNOSC);
                         WRITE(PL,R);
                         WRITELN('DANE ZAPISANE');
                         READLN;
                    END {END OF IF}
                    ELSE
                    BEGIN
                         WRITELN('BRAK DANYCH DO ZAPISANIA,POWROT DO MENU');
                         READLN;
                    END {END OF ELSE}
                 END
              ELSE
                 BEGIN
                 WRITELN('BRAK PLIKU BAZY PRZYSTEPUJE DO TWORZENIA');
                 REWRITE(PL);
                  WRITELN('PODAJ DANE DO WPISANIA');
                    WRITELN('PODAJ NAZWE');
                    READLN(R.MARKA);
                    WRITELN('PODAJ MODEL');
                    READLN(R.MODEL);
                    WRITELN('PODAJ ROK');
                    WRITELN('PODAJ POJEMNOSC');
                    READLN(R.POJEMNOSC);
                    READLN(R.ROK);
                    WRITE(PL,R);
                    WRITELN('DANE ZAPISANE');
                    READLN;
                 END
              END;  {END OF WYBOR 1}
           IF A='2' THEN
              BEGIN
              WRITELN('WYSWIETLANIE WSZYSTKICH REKORDOW');
              {$I-}reset(pl);{$I+}
              IF ioresult=0 then
                 BEGIN
                 WHILE NOT EOF(PL) do
                       BEGIN
                                 READ(PL,R);
                                 WRITELN('MARKA : ',R.MARKA);
                                 WRITELN('MODEL: ',R.MODEL);
                                 WRITELN('ROK PRODUKCJI : ',R.ROK);
                                 WRITELN('POJEMNOSC :', R.POJEMNOSC);

                       END;
                 END
              ELSE
                  BEGIN
                  WRITELN('BRAK PLIKU BAZY');
                  READLN;
                  END;
              READLN;
              END; {END OF WYBOR 2}
           IF A='3' THEN
              BEGIN
                   {$I-}reset(pl);{$I+}
                   IF ioresult=0 then
                   BEGIN
                        WRITELN('WPISZ MARKE SAMOCHODU');
                        READLN(B);
                        RESET(PL);

                        WHILE NOT EOF(PL) DO
                        BEGIN
                                 READ(PL,R);
                                 IF B=R.MARKA THEN
                                 BEGIN
                                 WRITELN('NAZWA  ',R.MARKA);
                                 WRITELN('MODEL ',R.MODEL);
                                 WRITELN('ROK PRODUKCJI ',R.ROK);
                                 WRITELN('POJEMNOSC ',R.POJEMNOSC);
                                 END
                        END {end of while}
                    END; {end of ioresult}
              WRITELN('NACISNIJ ENTER');
              READLN;
              END; {END OF WYBOR 3}
           IF A='4' THEN
              BEGIN
              WRITELN('ZAKONCZENIE PROGRAMU');
              END;

 UNTIL A='4';

wRITE('KONIEC PRORAMU');
READLN;


END.
0
polonezik napisał(a)

i musze dodać 2 rekordy, które:
-usunięcie wybranego elementu,
-zmieni zawartoś wybranego elementu

Chyba metody, a nie rekordy.
Jak chcesz kasować, to pobierz wszystkie dane z pliku do tablicy, potem zaczynając od samochodu następnego po tym, co chcesz skasować daj w pętli

tablica[i-1] := tablica[i]

, a następnie zapisz tablicę do pliku bez ostatniego elementu.

Co do zmieniania, to wczytaj jakiś rekord z pliku, zmodyfikuj go i zapisz w to samo miejsce w pliku, odszukując pozycję za pomocą seek.

0

Dodałem ci usuwanie!
(ale nie poprawiłem poważniejszych błędów bo cały program z nich się skłąda a czasu nie mam.

program Piotr;
uses CRT;
const
        PLIK='ta.txt';
type
        MODEL =record
        MARKA:string;
        MODEL:string;
        ROK:string;
        POJEMNOSC:string;
        end;
var
   B:string;
   D:TEXT;
   A:CHAR;
   R:MODEL;
   PL:file of MODEL;
   n:model;
   kon:boolean;
begin
     CLRSCR;
     ASSIGN(PL,PLIK);

     repeat
           CLRSCR;
WRITELN('BAZA SAMOCHODOW: WYSWIETLA INFORMACJE O SAMOCHODACH NASZEJ FIRMY');
           WRITELN('1-DODAJ NOWY SAMOCHOD');
           WRITELN('2-WYSWIETL WSZYSTKIE SAMOCHODY');
           WRITELN('3-WYSWIETL KONKRETNY SAMOCHOD');
           WRITELN('5-Usun');
           WRITELN('4-WYJSCIE Z BAZY');
           A:=(READKEY);
           if A='1' then
              begin
              {$I-}reset(pl);{$I+}
              if ioresult=0 then
                 begin
                    SEEK(PL,FILESIZE(PL));
                    WRITELN('WPISZ DANE DOT. SAMOCHODOW');
                    WRITELN('PODAJ NAZWE MARKI');
                    READLN(R.MARKA);
                    if R.MARKA<>'' then
                    begin
                         WRITELN('PODAJ MODEL');
                         READLN(R.MODEL);
                         WRITELN('PODAJ ROK PRODUKCJI');
                         READLN(R.ROK);
                         WRITELN('PODAJ POJEMNOSC');
                         READLN(R.POJEMNOSC);
                         write(PL,R);
                         WRITELN('DANE ZAPISANE');
                         READLN;
                    end {end of if}
                    else
                    begin
                         WRITELN('BRAK DANYCH do ZAPISANIA,POWROT do MENU');
                         READLN;
                    end {end of else}
                 end
              else
                 begin
                 WRITELN('BRAK PLIKU BAZY PRZYSTEPUJE do TWORZENIA');
                 REWRITE(PL);
                  WRITELN('PODAJ DANE do WPISANIA');
                    WRITELN('PODAJ NAZWE');
                    READLN(R.MARKA);
                    WRITELN('PODAJ MODEL');
                    READLN(R.MODEL);
                    WRITELN('PODAJ ROK');
                    WRITELN('PODAJ POJEMNOSC');
                    READLN(R.POJEMNOSC);
                    READLN(R.ROK);
                    write(PL,R);
                    WRITELN('DANE ZAPISANE');
                    READLN;
                 end
              end;  {end of WYBOR 1}
           if A='2' then
              begin
              WRITELN('WYSWIETLANIE WSZYSTKICH REKORDOW');
              {$I-}reset(pl);{$I+}
              if ioresult=0 then
                 begin
                 while not EOF(PL) do
                       begin
                                 read(PL,R);
                                 WRITELN('MARKA : ',R.MARKA);
                                 WRITELN('MODEL: ',R.MODEL);
                                 WRITELN('ROK PRODUKCJI : ',R.ROK);
                                 WRITELN('POJEMNOSC :', R.POJEMNOSC);

                       end;
                 end
              else
                  begin
                  WRITELN('BRAK PLIKU BAZY');
                  READLN;
                  end;
              READLN;
              end; {end of WYBOR 2}
           if A='3' then
              begin
                   {$I-}reset(pl);{$I+}
                   if ioresult=0 then
                   begin
                        WRITELN('WPISZ MARKE SAMOCHODU');
                        READLN(B);
                        RESET(PL);

                        while not EOF(PL) do
                        begin
                                 read(PL,R);
                                 if B=R.MARKA then
                                 begin
                                 WRITELN('NAZWA  ',R.MARKA);
                                 WRITELN('MODEL ',R.MODEL);
                                 WRITELN('ROK PRODUKCJI ',R.ROK);
                                 WRITELN('POJEMNOSC ',R.POJEMNOSC);
                                 end
                        end {end of while}
                    end; {end of ioresult}
              WRITELN('NACISNIJ ENTER');
              READLN;
              end; {end of WYBOR 3}
           if A='5' then
              begin
                   {$I-}reset(pl);{$I+}
                   if ioresult=0 then
                   begin
                        WRITELN('WPISZ MARKE SAMOCHODU');
                        READLN(B);
                        RESET(PL);

                        seek(pl,filesize(pl)-1);
                        read(pl,n);
                        seek(pl,0);
                        kon:=false;
                        while (not EOF(PL))and(kon=false) do
                        begin
                                 read(PL,R);
                                 if B=R.MARKA then
                                 begin
                                   seek(pl,filepos(pl)-1);
                                   write(pl,n);
                                   kon:=true;
                                 end
                        end; {end of while}
                        if kon=true then
                        begin
                          seek(pl,filesize(pl)-1);
                          truncate(pl);
                          writeln('usunieto model!');
                        end;
                    end; {end of ioresult}
              WRITELN('NACISNIJ ENTER');
              READLN;
              end; {end of WYBOR 3}
           if A='4' then
              begin
              WRITELN('ZAKONCZENIE PROGRAMU');
              end;

 until A='4';

write('KONIEC PRORAMU');
READLN;
end.

Nie podoba mi się ten program!
Pliki probujesz otwierać po kilka razy!
Nie widzę żebyś je zamykał po wykonaniu operacji.
Zamykanie pliku : close(pl);
Dlaczego nie operujesz na tablicach, tylko plik męczysz?
Wstawiasz {$i-} i $i-} nie potrzebnie, wystarczyło by raz i porządnie razem z rewrite
Dlaczego nie operujesz na np. procedurach? = program był by bardziej przejrzysty

Aha zamienianie zrobisz podobnie do usuwania do zmiennej n właduj nowy model
pozniej szukając starego zamien go i już omin tylko kasowanie przez truncate.

0

maxwklb A możesz napisać jak ten kod do zmieniania będzie wyglądał bo ma problemy. Bede ogromnie wdzięczny.

OK już sobie poradziłem :)
maxwklb dzięki za pomoć z kasowaniem, pozdrawiam.

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