PDA

Zobacz pełną wersję : turbo pascal problem



sprawler
02-06-07, 19:03
Mamy maly problem z baza danych z turbo pascala ,otoz wpisuje np szukanie po gatunku ksiazki i wiem ze sa wprowadzone wiecej niz jedna pozycja(ksiazka pod te kryteria) a program wyswietla mi tylko jedna pozycje ,zamieszcam kod programu i prosze o pomoc

doderic
04-06-07, 09:58
Niestety, nie jestem w stanie uruchomi Twojego programu, bo nie mam pliku 'e:\baza.dat' :(
Jeszcze z maych uwag: prosz, dopisuj do swojego kodu komentarze oraz nazywaj zmienne bardziej zrozumiale, a nie 'a', 'b', 'c'. To na prawd uatwia czytanie i zrozumienie programu.

Co do problemw z wyszukiwaniem - procedure szuk_rodzaj:


(...)
if not z then
begin
wst_rek(s1); //wyswietlanie na ekranie
(...)
z:=true;
begin
a:=UpCase(readkey);
(...)
end;
end;
(...)

Postanawiasz wywietli znaleziony wpis tylko wtedy, gdy 'z' (znalezione?) = false, a nastpnie, zaraz po wywietleniu ustawiasz 'z' na true. Dlatego przy nastpnej znalezionej ksice ju nic nie jest wywietlane.
Poza tym nie rozumiem, co tam robi ten blok, ktry podwietliem na niebiesko? Tzn. po co te dodatkowe begin i end?

sprawler
07-06-07, 23:01
Dziekuje za pomoc ale mam jeszcze pare pytan, : ,po 1 musze zrobic mozliwosc wyswietlenia wszystkich pozycji(ksiazek)jakie zostaly wpisane do bazy,po 2 mam taka wiersz gdzie jest assign(plik,'E:\baza.dat'); musze to zmienic na cos innego tak zeby nie zaleznie na jakiej partycji czy dysku bedzie baza to zeby dziala ,zeby zapisywanie bylo zawsze domyslnie tam gdzie program ,prosze o pomoc jestem slaby z programowania

RRybak
08-06-07, 08:07
Jeli podasz samo Assign(plik, 'baza.dat'), to bdzie bra z domylnego katalogu. Zazwyczaj jest to biecy folder, w ktrym znajduje si program. Poniewa mona to oszuka, np. przez grzebanie w skrtach do programu pod Windows, to moesz sprbowa odczyta ciek do programu przez pobranie tzw. parametru zerowego - ParamStr(0) (do wgldu w helpie take ParamCount) - bdzie to co w rodzaju "C:\programy\pascal\moje\baza.exe" (czy gdziekolwiek to trzymasz). Std ju korzystasz z funkcji ExtractFilePath, ktra zwrci Ci samo "C:\programy\pascal\moje\" (bez nazwy programu). Teraz wystarczy ju tylko doklei nazw pliku z baz.
Zastosowanie funkcji, przekazywane argumenty i zwracane wartoci pozostawiam do zgbienia w helpie modemu adeptowi sztuk pascala 8-)

doderic
08-06-07, 10:27
musze zrobic mozliwosc wyswietlenia wszystkich pozycji(ksiazek)jakie zostaly wpisane do bazy

Samą funkcję do wyświetlania zadanej książki już masz: "procedure wst_rek(var s1:ksiazka);". Tak samo napisałeś już przechodzenie po wszystkich rekordach i działanie na nich w dowolnej "procedure szuk_*". Spróbuj połączyć te dwie rzeczy - zamiast sprawdzać, czy np. autor książki jest tym szukanym autorem, po prostu wypisz dane na ekran.
"Zadanie na 5+": przy wypisywaniu zrób tak, żeby po zapisaniu całego ekranu program się zatrzymywał, pozwalał spokojnie przczytać to, co wypisał i czekał na "any key". 8)

sprawler
08-06-07, 17:08
Jeszcze raz dziekuje za pomoc ale jutro mam do pokazania ten program i musze jeszcze dzis to wszystko zrobic ,zamienilem assign(plik e:baza.dat); na assign(plik,'baza.dat'); i program nie moze teraz odnalezc pliku ,po drugie jezlei dobrze zrozumialem musze polaczyc takie dwie rzeczy zeby wyswietlic wszystkie pozycje :


procedure wst_rek(var s1:ksiazka);
begin
gotoxy(10,10);
write('Autor ksiki - ',s1.autor);
gotoxy(10,11);
write('Tytuˆ ksiaki - ',s1.tytul);
gotoxy(10,12);
write('Gatunek ksiaki - ',s1.rodzaj);
gotoxy(10,13);
write('Ilo˜† stron - ',s1.stron);
gotoxy(10,14);
write('Cena - ',s1.cena,'zl');
end;



procedure szuk_rodzaj(var plik:baza);
var
s1:ksiazka;
j:byte;
z:boolean;
i:longint;
p:longint;
a:char;
begin

reset(plik);

clrscr;
z:=false;
i:=0;
while not eof(plik) do
begin
i:=i+1;
read(plik,s1);
if Pos(DuzeLitery(c),DuzeLitery(s1.rodzaj))=1 then
begin
if not z then
begin
wst_rek(s1);
ukryj;
gotoxy(10,20); write('U');
gotoxy(12,20); textcolor(red); write('U'); textcolor(black); writeln('SU KSIAKE');
gotoxy(10,21); write('E');
gotoxy(12,21); textcolor(red); write('E'); textcolor(black); write('DYTUJ WPIS');
gotoxy(10,22); write('POWRT DO MENU <enter>');
z:=false;
begin
a:=UpCase(readkey);

if a='U' then
begin
usun(plik);
end;
if a='E' then
begin
p:=filepos(plik)-1;
edyt(s1);
seek(plik,p);
write(plik,s1);
readln;
end;
end;
end;
end;
end;

if not z then
begin
clrscr;
gotoxy(25,10);
writeln('Nie znaleziono takiej ksiki.');
readln;
end;
end;



bardzo prosze o edycje mojego kodu tak zeby to dzialalo,wiem ze to jest droga po najnizszej linji oporu ale mam jutro zaliczenie i dopiero teraz zadlem sobie sprawe ze za dlugo zwlekalem z tym programem ,obiecuje ze w zamian bede grzeczny az do gwiazdki :)

doderic
09-06-07, 01:41
1. eby mg czyta z lokalnego pliku (a wic z "baza.dat") musisz go mie w katalogu, do ktrego kompiluje si program, a wic w tym samym co jest wpisany w Options\Directories\Exe & TPU Directory.

2.


procedure wyswietl_wszystkie(var plik:baza);
var
s1:ksiazka;
i:longint;
begin

reset(plik);

clrscr;
i:=0;
while not eof(plik) do
begin
i:=i+1;
{ wczytaj kolejna ksiazke }
read(plik,s1);
{ i ja wyswitla na ekranie }
wst_rek(s1)
{ i jeszcze moe jaki 'separator'? }
writeln('------------------------');
end; { i tak wszystkie ksiazki }
end;
{prawda, ze proste? ;) }

Tylko wywaliem z Twojej procedury szuk_rodzaj wszystko, co niepotrzebne.
Mam nadzieje, e zadziaa dobrze ;) Wybacz... w kocu jest sobota rano i po piwku ju nie mam cierpliwoci, eby to sprawdzi w praktyce. Zadanie na 5+ musisz jednak zrobi sam ;)
Do zobaczenia na Gwiazdke 8)

sprawler
13-06-07, 09:58
przepraszam ze tak wam zawracam glowe z tym programem ale potrzebuje pomocy jeszcze w jednej kwestii ,co mam zmienic w programie zeby np : po wyszukiwaniu lub wyswietlaniu wszystkich pozycji na ekranie sie pojawialo wiecej wpisow,zalozmy ze szukam ksiazki po autorze jest tych ksiazek z 5,znalazlo mi te 5 ale wywietla jedna i jezeli chce zobaczyc druga to musze naciskac klawisz i tak przelatywac po kolei ,to nie jest problem jezeli pozycji jest 5 ale gdyby bylo 50 to troche musialbym juz po naciskac ten klawisz z 50 razy zeby wszystko przejzec ,strasznie oszczedne jest wyswietlanie tylko jedna pozycja na caly ekran ,to samo mam jezeli chce wyswietlic wszystkie pozycje w bazie ,sa one pokazywane pojedynczo,zxamieszczam nowy kod programu jako zalacznik :

doderic
13-06-07, 17:34
(...) potrzebuje pomocy jeszcze w jednej kwestii ,co mam zmienic w programie zeby np : po wyszukiwaniu lub wyswietlaniu wszystkich pozycji na ekranie sie pojawialo wiecej wpisow

1. Musisz zmieni procedur wypisujc zadany rekord wst_rek tak, aby mona byo wypisywa w zadanym miejscu ekranu. eby nie przeszukiwa caego kodu i nie poprawia nazw, moesz skopiowa wst_rek do wst_rekxy(s1; y: integer) i pozmienia np. tak:


procedure wst_rekxy(var s1:ksiazka; x: integer);
begin
gotoxy(10,y); write('Autor ksiki - ',s1.autor);
gotoxy(10,y+1); write('Tytuˆ ksiaki - ',s1.tytul);
gotoxy(10,y+2); write('Gatunek ksiaki - ',s1.rodzaj);
gotoxy(10,y+3); write('Ilo˜† stron - ',s1.stron);
gotoxy(10,y+4); write('Cena - ',s1.cena,'zl');
writeln;
end;

procedure wst_rek(var s1:ksiazka);
begin
wst_rekxy(s1,10);
end;

Dzieki temu stare wywoania dziaaj nadal tak samo, ale te masz now procedur.

2. Majc powysze moesz przystpi do modyfikacji wywietlania w procedure wyswietl. Uyj wst_rekxy(s1,tx); zamiast wst_rek(s1); i uywajc "i" moesz wyznacza wiersz, w ktrym ma si pojawia "ksika", np.:
tx:=((i-1) mod 3) * 6 + 1; czyli 3 ksiki co 6 wierszy zaczynajc od pierwszego. Aby wciska klawisz co trzy pozycje, znowu musisz uy "i" i "mod" aby ReadKey byo wywoywane tylko co trzeci raz.
Pozostawi Ci do rozwizania problem, dlaczego nie wywietla si ostatnia (niepena) strona z listy ;) (<- jakie 5 minut klnicia) oraz jak wywietla tak samo dla wynikw wyszukiwania (<- jakie 5 minut kopiowania linijek).

3. Na koniec pozwol sobie ponaeka, jak to moe zrobi (wredny) uytkownik Twojego programu: ;)
- w menu masz zjedzon literk (smacznego),
- jak wywietlam wszystkie ksiki (mam ich pi), to "zostaj" mi literki z poprzedniej "strony",
- po wyjciu z programu ekran nie jest wyczyszczony, tylko zostaje mi "to wszystko",
- wchodz do szukania, a tam "Wyjd z programu W", ktre nie chce wyj tylko wraca do gwnego menu,
- czy jak kto nie lubi kolorkw, to s jakie skiny/templajty, eby je sobie pozmienia - i skd mona cign? ;)

Specjalnie nie przedstawiam penego rozwizania, eby nie byo podane na tacy, ale jak by mia problemy, to jutro znw bd si nudzi w pracy 8)