pascal - baza danych (problem)
bazę robiłem na podstawie bazy znajomego to jest jego baza:
Program ProstaBazaDanych;
Const
cMaxKsiazek = 1024; Maksymalna ilość rekordów w bazie
cBoolStr : Array [Boolean] Of String [3] = ('nie', 'tak');
Stała pomocna przy wypisywaniu wartości typu Boolean
Type
tBKsiazka = Rekord książki
Record
Tytul : String;
Autor : String [50];
Wydawnictwo : String [50];
Rok : Word;
Pozyczona : Boolean;
End;
tBaza = Array [0..cMaxKsiazek-1] Of tBKsiazka; Tablica z rekordami
tBFile = File Of tBKsiazka; Typ pliku zawierającego rekordy tBKsiazka
Var
Nazwa : String; Zmienne opisujące bazę
Baza : tBaza;
Ilosc : Word;
Wybor : Char; Zmienna pomocnicza dla menu
- Wejście i wyjście ------------------------------------------------------
Procedure Wczytaj(I: Word); Wczytywanie rekordu o indeksie I
Var
S : String; Zmienna pomocnicza
Begin
If (I<Ilosc) Then Typ Word i tak nie zawiera wartości ujemnych
With Baza Do Do tego służy instrukcja wiążąca
Begin
WriteLn('Podaj informacje o książce ', I, ':');
Write('Tytuł... ');
If (Tytul<>'') Then Write('[', Tytul, '] ');
ReadLn(Tytul);
Write('Autor... ');
If (Autor<>'') Then Write('[', Autor, '] ');
ReadLn(Autor);
Write('Wydawnictwo... ');
If (Wydawnictwo<>'') Then Write('[', Wydawnictwo, '] ');
ReadLn(Wydawnictwo);
Write('Rok... ');
If (Rok<>0) Then Write('[', Rok, '] ');
ReadLn(Rok);
Write('Czy tak książka jest pożyczona? [', cBoolStr[Pozyczona], '] ');
ReadLn(S);
Pozyczona:=(S='tak');
End;
End;
Procedure Wypisz(I: Word); Wypisywanie jednego rekordu o indeksie I
Begin
If (I<Ilosc) Then
With Baza Do
Begin
Write(' ', I, '. ');
Write(Autor, ' - ', '"', Tytul, '", wyd. ');
Write(Wydawnictwo, ' ', Rok, '. Pożyczona: ', cBoolStr[Pozyczona], '.');
WriteLn;
End;
End;
- Wejście i wyjście koniec -----------------------------------------------
- Operacje na danych -----------------------------------------------------
Procedure Pokaz; Procedura pokazuje zakres rekordów z bazy
Var
I, Ia, Ib : Word;
Begin
Write('Podaj dolną granicę indeksów książek, które chcesz pokazać... ');
ReadLn(Ia);
Write('Podaj górną granicę [', cMaxKsiazek, ' dla wszystkich rekordów]... ');
ReadLn(Ib);
WriteLn;
For I:=Ia To Ib Do
Wypisz(I);
End;
Procedure Edytuj; Procedura służy do edycji danego rekordu w bazie
Var
I : Word;
Begin
Write('Podaj indeks rekordu, który chcesz edytować... ');
ReadLn(I);
WriteLn;
Wczytaj(I);
If (I>=Ilosc) Then
WriteLn('Taki rekord nie istnieje - nie możesz go edytować.');
End;
Procedure Dodaj; Procedura dodaje, a następnie pozwala na edycję rekordu
Begin
If (Ilosc<cMaxKsiazek) Then
Begin
Inc(Ilosc); Zwiększamy ilość ksiązek w bazie
WriteLn;
Wczytaj(Ilosc-1); Edytujemy ostatni rekord
End
Else
WriteLn('Baza jest pełna - nie można dodać więcej książek.');
End;
Procedure Usun; Procedura usuwa pewien zakres rekordów z bazy
Var
I, Ia, Ib, Il : Word;
Begin
Write('Podaj dolną granicę indeksów książek, które chcesz usunąć... ');
ReadLn(Ia);
Write('Podaj górną granicę... ');
ReadLn(Ib);
If (Ia<Ilosc) And (Ib<Ilosc) And (Ib>=Ia) Then
Begin
Il:=Ib-Ia+1;
For I:=Ib+1 To Ilosc-1 Do
Baza[I-Il]:=Baza;
For I:=Ilosc-Il To Ilosc-1 Do
With Baza Do
Begin
Tytul:='';
Autor:='';
Wydawnictwo:='';
Rok:=0;
Pozyczona:=False;
End;
Dec(Ilosc, Il);
End
Else
WriteLn('Nieprawidłowe granice - nie można usunąć rekordów.');
End;
- Operacje na danych koniec ----------------------------------------------
- Operacje na plikach ----------------------------------------------------
Procedure Otworz;
Var
F : tBFile; Ten typ powinien być zadeklarowany wcześniej
Begin
Write('Podaj nazwę pliku z bazą danych (ENTER - nowa baza)... ');
ReadLn(Nazwa);
If (Nazwa<>'') Then
Begin
Assign(F, Nazwa); Otwieramy plik o nazwie S
ReSet(F); Przygotowujemy plik do odczytu
While (Not EoF(F)) Do EoF(F: File) zwraca True jeśli jesteśmy
Begin na końcu pliku
Read(F, Baza[Ilosc]); Czytamy zmienną z pliku F
Inc(Ilosc);
End;
Close(F); Na koniec zamykamy plik
End;
End;
Procedure Zapisz;
Var
F : tBFile;
I : Word;
Begin
If (Nazwa='') Then
Begin
Write('Podaj nazwę pliku, do którego chcesz zapisać bazę... ');
ReadLn(Nazwa);
End;
Assign(F, Nazwa); Otwieramy plik
ReWrite(F); Czyścimy plik i przygotowujemy do zapisu
For I:=0 To Ilosc-1 Do
Write(F, Baza); Zapisujemy zmienną do pliku F
Close(F); Zamykamy plik
End;
- Operacje na plikach koniec ---------------------------------------------
Begin
Ilosc:=0; Czyścimy bazę danych
WriteLn('Witaj w Prostej Bazie Danych!');
Otworz; Wczytujemy bazę z pliku
Repeat
WriteLn; Menu
WriteLn('Co chcesz zrobić?');
WriteLn(' 1. Pokazać rekord(y)');
WriteLn(' 2. Edytować rekord');
WriteLn(' 3. Dodać nowy rekord');
WriteLn(' 4. Usunąć rekord(y)');
WriteLn(' 5. Zapisać pracę i zakończyć działanie programu');
Write('Twój wybór [1-5]... ');
ReadLn(Wybor); Wybór użytkownika
WriteLn;
Case (Wybor) Of
'1' : Pokaz; Pokazujemy rekordy
'2' : Edytuj; Edytujemy rekord
'3' : Dodaj; Dodajemy rekord
'4' : Usun; Usuwamy rekordy
'5' : Nic ;
Else WriteLn('Nie ma takiej opcji');
End;
Until (Wybor='5');
Zapisz; Zapisujemy bazę
End.
a to jest moja baza:
START
program sklep;
const
cmaxfarb = 1024; <-- maksymalna ilosc rekordow w naszej bazie
cboolstr : array [Boolean] of string [3] = ('nie', 'tak');
stała pomocna przy wypisywaniu wartości typu Boolean
bolean jest typem zmiennej przechowujący wartość prawda lub fałsz
Type
tbfarba = rekord farby
record
Firma : string;
Przeznaczenie : string [50];
Rodzaj : string [50];
Cena : word;
Dostepnosc : boolean;
end;
tbaza = array [0..cmaxfarb-1] Of tbfarb; <-- tablica z rekordami
tbfile = file Of tbfarba; <-- typ pliku zawierajacego dane tbfarba
var
nazwa : string; <-- zmienne opisujace baze
baza : tbaza;
ilosc : word;
wybor : char; <-- zdeklarowana zmienna pomocnicza do menu
poczatek procedury
procedure wczytaj(I: word); <-- wczytywany jest rekord o indeksie I
var
s : string; <-- kolejna zmienna pomocnicza
begin
if (I<ilosc) then
with Baza do
begin
writeln('prosze o podanie firmy, ktora produkuje interesujaca Cie farbe ', I, ':');
Write('Firma... ');
if (Firma<>'') then write('[', Firma, '] ');
readln(Firma);
write('Przeznaczenie... ');
if (Przeznaczenie<>'') then write('[', Przeznaczenie, '] ');
readln(Przeznaczenie);
write('Rodzaj... ');
if (Rodzaj<>'') then write('[', Rodzaj, '] ');
readln(Rodzaj);
write('Cena... ');
if (Cena<>0) then write('[', Cena, '] ');
readln(Cena;
write('Czy farba jest dostepna na magazynie? [', cboolstr[Dostepnosc], '] ');
readln(s);
Dostepnosc:=(s='tak');
end;
end;
koniec procedury
poczatek procedury
procedure wypisz(I: word); <-- wypisywanie jednego rekordu o indeksie I
begin
uf (I<ilosc) then
with baza do
begin
write(' ', I, '. ');
write(Przeznaczenie, ' - ', '"', Firma, '", rodz. ');
write(Wydawnictwo, ' ', Cena, '. Dostepnosc: ', cboolstr[Dostepnosc], '.');
writeln;
end;
end;
koniec procedury
operacje na danych
procedure pokaz; <-- procedura ma za zadanie pokazywac zakres rekordow
var
I, Ia, Ib : word;
begin
write('Podaj dolną granicę indeksów książek, które chcesz pokazać... ');
readln(Ia);
write('Podaj górną granicę [', cmaxfarb, ' dla wszystkich rekordów]... ');
readln(Ib);
writeln;
for I:=Ia to Ib do
wypisz(I);
end;
procedure edytuj; <-- procedura sluzaca do edycji danego rekordu
var
I : word;
begin
write('prosze podac indeks rekordu, który chcesz edytować... ');
readln(I);
writeln;
wczytaj(I);
if (I>=ilosc) then
writeLn('niestety podany przez Ciebie rekord nie istnieje - nie możesz go edytować.');
end;
procedure dodaj; <-- procedura odpowiedzialna za dodawanie ale rownież pozwala na edycję rekordu
begin
if (ilosc<cmaxfarb) then
begin
inc(ilosc); <-- zwiekszamy ilosc farb w bazie
writeln;
wczytaj(ilosc-1); <-- edycja ostatniego rekordu
end
else
writeln('przepraszamy, nasza baza jest pelna - nie można dodać więcej farb.');
end;
procedure usun; <-- procedura odpowiedzialna za usuwanie z pewnego zakresu
var
I, Ia, Ib, Il : word;
begin
write('prosze podac dolną granicę indeksów farb, które chcesz usunąć... ');
readln(Ia);
write('prosze podac górną granicę... ');
readLn(Ib);
if (Ia<ilosc) and (Ib<ilosc) and (Ib>=Ia) then
begin
Il:=Ib-Ia+1;
for I:=Ib+1 to ilosc-1 do
baza[I-Il]:=baza;
for I:=ilosc-Il to ilosc-1 do
with baza do
begin
Firma:='';
Przeznaczenie:='';
Rodzaj:='';
Cena:=0;
Dostepnosc:=false;
end;
dec(ilosc, Il);
end
else
writeln('niestety ale podane granice sa nieprawidlowe - nie można usunąć rekordów.');
end;
koniec operacji na danych
poczatek operacji na plikach
procedure otworz;
var
f : tbfile; <-- ten typ powinien byc zdeklarowany wczesniej...
begin
write('podaj nazwę pliku z bazą danych (ENTER - nowa baza)... ');
readln(nazwa);
if (nazwa<>'') then
begin
assign(f, nazwa); <-- otwieramy plik o nazwie S
reset(f); <-- plik jest przygotowywany do odczytu
while (not EoF(f)) do EoF(f: file) zwraca true jeśli jesteśmy
begin na końcu pliku
read(f, baza[ilosc]); <-- czytamy zmienna z pliku F
inc(ilosc);
end;
close(f); <-- zamykamy nasz plik
end;
end;
procedure zapisz; jak sama jej nazwa wskazuje, procedura bedzie odpowiedzialna za zapis danych
var
f : tbfile;
I : word;
begin
if (nazwa='') then
begin
write('prosze podac nazwe pliku, do ktorego chcesz zapisac baze danych... ');
readln(nazwa);
end;
assign(f, nazwa); <-- otwieramy nasz plik
rewrite(f); <-- czyscimy plik oraz przygotowujemy do zapisu
for I:=0 to ilosc-1 do
write(f, baza); <-- zapisujemy zmienna do pliku F
close(F); <-- zamykamy nasz plik
end;
koniec operacji na plikach
begin
ilosc:=0; <-- w tym miejscu czyścimy naszą bazę danych "sklepu z farbami"
writeLn('Dominik i Kamil witaja Cie w swoim sklepie!');
otworz; <-- baza jest wczytywana z pliku
repeat
writeLn; menu naszej bazy danych
writeLn('Co chcesz zrobić?');
writeLn(' 1. Pokazać rekord(y)');
writeLn(' 2. Edytować rekord');
writeLn(' 3. Dodać nowy rekord');
writeLn(' 4. Usunąć rekord(y)');
writeLn(' 5. Zapisać pracę i zakończyć działanie programu');
write('Twój wybór [1-5]... ');
readln(wybor); wybór użytkownika
writeln;
case (wybor) of
'1' : Pokaz; <-- pokazujemy rekordy
'2' : Edytuj; <-- edytujemy rekordy
'3' : Dodaj; <-- dodajemy rekordy
'4' : Usun; <-- usuwamy rekordy
'5' : nic ;
else writeln('nie ma takiej opcji w naszym menu');
end;
until (wybor='5');
zapisz; zapisujemy nasza baze
End.
STOP
pascala niby się nie używa no ale w naszej szkole jeszcze jednak jest ale nie ważne... mam problem gdyż pozmieniałem zmienne tak by działała pod moją i kumpla, z którym robiliśmy potrzeby, np. zmienne o nazwie "Ksiażki" pozmieniałem na "Farby" tak by pasowały do naszego sklepu... lecz podczas próby kompilowanie wyskakuje nam:
lul.pas<52,25> Error: identifiter not fount "Firma"
lul.pas<52,52> Error: identifiter not fount "Firma"
lul.pas<27,43> Error: error in type definiction
oraz kilka z "Przeznaczenie"
Error: identifiter not found "Przeznaczenie"
oraz kilka z "Rodzaj"
Error: identifiter not found "Rodzaj"
oraz kilka z "Cena"
Error: identifiter not found "Cena"
a na samym dole raportu:
Error: syntax error, ">" expected but ";" found
czy może ktoś zerknąć i powiedzieć, w którym miejscu są błędy? zdaję sobie sprawę, że baza nie jest idealna ale taka też nie ma być
dzięki z góry za pomoc:)