PDA

Zobacz pe┼én─ů wersj─Ö : program w Turbo Pascalu



ArchI
10-12-06, 13:27
Mam problem z zadaniem z informatyki
Mam podany program i musze go zmodyfikowaŠ, tak aby:
1) przed zamkniŕciem program pyta│ czy zapisac
2) program (w zale┐noÂci od tego czego oczekujemy) nadpisywa│ lud dopisywa│ dane
3) wprowadzane dane wpisywa│ z du┐ej litery
4) pozwala│ na edycjŕ danych
5) pyta│ siŕ (przy otwieraniu programu) czy wczytaŠ dane

Program ten jest zbudowany na zasadzie typu plikowego

Program P12 jest baz▒ danych z mozliwoÂci▒ wprowadzania, przegl▒dania, zapisywania i odczytywania danych z dysku


program p12;
uses crt2;
type osoba=record
nazwisko:string[10];
imie:string[10];
wiek:byte;
end;
const Esc =#27;
var listaosob:array[1..100] of osoba;
plik:file of osoba;
i,Nrosoby:integer;
{.......}
procedure czekaj;
var z:char;
begin
writeln;
write(' nacisnij cos');
repeat until KeyPressed;
while KeyPressed do z:=ReadKey;
end;
{.......}
function czytajznak:char;
var z:char;
begin
czytajznak:=UpCase(ReadKey);
end;
{.....}
procedure zapisdanychdopliku;
var i:integer;
begin
assign(plik,'dane0001.dat');
rewrite(plik);
for i:=1 to Nrosoby do write(plik,listaosob[i]);
close(plik);
end;
{........}
procedure odczytdanychzpliku;
var i:integer;
begin
assign(plik,'dane0001.dat');
{$I-}reset(plik);
if IoResult<>0 then begin
clrscr;writeln('brak pliku');
czekaj;
end
{$I+} else begin
i:=1;
while not eof(plik) do begin
read(plik,listaosob[i]);
inc(i)
end;
close(plik);
Nrosoby:=i-1;
clrscr;write('dane wczytane'); delay(1000);clrscr;
end;
end;
{..........}
procedure wprowadzanie;
begin
ClrScr;
writeln('wprowadz dane',Nrosoby+1,'osoby:');
writeln;
Nrosoby:=Nrosoby+1;
with listaosob[Nrosoby] do
begin
writeln('nazwisko:');
readln(nazwisko);
write('imie :');
readln(imie);
write('wiek:');
readln(wiek);
end;
end;
{..........}
procedure przegladanie(i:byte);
begin
clrscr ;
writeln('wyswietlanie danych[',i,'] osoby:');
writeln;
with ListaOsob[i] do begin
writeln ('nazwisko:',nazwisko);
writeln('imie: ',imie);
writeln('wiek: ',wiek) ;
end;
end;
{.........}
procedure menu;
begin
Clrscr;
writeln('***************Lista osob***********');
writeln('[1]-Wprowadzanie danych');
writeln('[2]-Wyswietlanie danych');
writeln('[3]-Zapis danych na dysku');
writeln('[4]-Odczyt danych z dyku');
writeln ('<esc>-koniec pracy');
end;
{....}
begin
NrOsoby:=0 ;
repeat
menu;
case CzytajZnak of
'1':Wprowadzanie;
'2':begin
ClrScr;
if NrOsoby=0 then begin
writeln('brak danych');
czekaj;
end
else for i:=1 to NrOsoby do
begin
Przegladanie(i);
czekaj;
end;
end;
'3': if NrOsoby=0 then begin
ClrScr;writeln('brak danych');
czekaj;
end
else ZapisDanychDoPliku;
'4':OdczytDanychZpliku;
esc:halt(0)
end;
until false;
end.


Prosze o przedstawianie mo┐liwych rozi▒zan
licze na Wasz▒ pomoc, bo u mnie z pascalem nie za dobrze:los:

Zefir_psv
11-12-06, 21:04
procedure odczytdanychzpliku;
var i:integer;
begin
{$I-}
assign(plik,'dane0001.dat');
reset(plik); {$I+}
if IoResult<>0 then begin
clrscr;writeln('brak pliku');
czekaj;
end
else begin
...

Pytanie o koniec pracy:

else ZapisDanychDoPliku;
'4':OdczytDanychZpliku;
#27: begin
response := @PytajCzyZapisacDane;
if response = (true/'yes'/etc.) @ZapisDanychDoPliku;
halt(0);
end;
end;


Dane z duzej litery:

ReadLn(input);
if length(input) > 0 then
input[1] := UpCase(input[1]);

Jesli chodzi o reszte, ja bym zmienil model dzialania programu. Napisz jakas biblioteke do wyswietlania porzadnego menu w okienku:

* skopiuj pamiec karty graficznej gdzies w cieple, bezpieczne miejsce [RAM]
* strzel ramke
* uzyj funkcji window
* wyswietl menu
* poczekaj na odpowiedz
* window (1, 1, 80, 25);
* przywroc ekran

Zrob funkcje wyswietlajaca to menu (np. 2 parametry: wskaznik do tablicy z elementami menu + ilosc pozycji). Funkcja powinna zwracac umer wybranej pozycji. Nastepnie strzelasz do pamieci liste wszystkich nazwisk, wyswietlasz menu, a funkcja zwaraca index pozycji do edycji. I juz.

Z pytaniem o wczytanie powinno byc tak samo. Na poczatku podziel to na biblioteki, a program glowny [begin ... end.] Powinien miec kilka linii: inicjowanie zmiennych, petla glowna, zwalnianie pamieci, end.

Tu nie trzeba byc "dobrym z pascala", zanim zaczniesz pisac, zastanow sie jak program ma dzialac i narysuj sobie schemat blokowy - na poczatku pomaga.

ArchI
11-12-06, 22:11
wielkie dzi─Öki za pomoc ;)
bardzo mi si─Ö to przyda
mam tylko 1 pytanie

ReadLn(input);
if length(input) > 0 then
input[1] := UpCase(input[1]);

czy to wystarczy do wpisywania danych z duzej litery?
jezeli tak to w kt├┼érym miejscu programu mam to wpisa─ç ?

Zefir_psv
11-12-06, 23:03
Gdzie to wpisac, to juz sam dojdz. Przeciez nie bede za Ciebie programu pisal.
Wystarczy i tyczy sie tylko imienia i nazwiska.

Siriah
11-12-06, 23:34
Moje skromne zdanie:
je┼┼║eli nie idzie Ci z Pascalem, popro┼Ť nauczyciela o dok┼éadniejsze wyt┼éumaczenie. To, ┼┼║e kto┼Ť za Ciebie odwali zadanie domowe, tylko pog┼é─Öbi Twoj─ů niewiedz─Ö.

ArchI
12-12-06, 18:46
zapisywanie i nadpisywanie danych zrobi┼éem bardziej "prost─ů" metod─ů (bo ta twoja zawiera tre┼Ťci kt├┼érych nie rozumiem, my przerabiamy podstawy pascala)
ale dalej mam problem z zapisywaniem dznych z duzej litery, ot├┼é┼┼║
gdy w programie Turbo Pascal 7.o kompilator wykrywa mi b┼é─ůd:
Error67: String expression expected
ReadLn(input);
if length(input) > 0 then
input[1] := UpCase(input[1]);
o co chodzi z tym błędem

Siriah: niestety mam takiego nauczyciela, kt├┼éry nie chce wyt┼éumaczy─ç, m├┼éwi, ┼┼║e ju┼┼║ raz to m├┼éwi┼é i wi─Öcej nie b─Ödzie;
ale w ┼Ťwi─Öta mam zamiar przerobi─ç kilka kurs├┼éw Pascala(mysle ┼┼║e to pomo┼┼║e;])

Siriah
12-12-06, 19:24
Error67: String expression expected
ReadLn(input);
if length(input) > 0 then
input[1] := UpCase(input[1]);
o co chodzi z tym b│ŕdem

masz skefion▒ deklaracjŕ zmiennych. Kompilator spodziewa siŕ stringa, a - tak na szybko przegl▒daj▒c - otrzymuje char. Moim zdaniem lepiej zadeklarowaŠ funkcjŕ, ktˇra podczas zczytywania klawiszy bŕdzie: sczytywa│a stringa, robi│a upcase i sumowa│a string'a.

ArchI
12-12-06, 19:43
│atwo napisac trudniej zrobic ;)
czy mˇg│by mi pomˇc z t▒ funkcj▒'
chodzi mi tytlko o zapisywanie danych z du┐ej litery'
z reszt▒ jakos sobie poradze;]

Zefir_psv
12-12-06, 19:55
Pascal dla DOSa (7.0, 7.1) dziala na kodzie ASCII. Jak sie ktos uwaznie przyjrzy, to roznica miedzy mala, a duza litera jest w 1 bicie. Male litery maja go ustawionego, duze - nie.
Wniosek:


function DuzaLitera(znak: char): char;
begin
DuzaLitera := Chr(Ord(znak) and 223);
end;


Nie mam 100% pewnosci, czy pojdzie pod Turbo Pascalem. Jakby co, daj znac.
Wyjasnienie: 223d to 1101 1111b. Dowolny bajt na ktorym wykonamy iloczyn logiczny z maska 223, bedzie mial wyzerowany 3 bit, co w efekcie da mala litere.

Jesli chodzi o blad, upewnij sie, ze "input" jest stringiem. To co podalem, to nie jest "gotowiec" do wstawienia do programu, tylko idea zakodowana w TP. Zmien w moim kodzie odpowiednie zmienne na te, ktorych uzywasz w swoim programie. Jesli najpierw robisz readln(imie);, a potem length(input), to jasne, ze nie przejdzie. Powinno byc length(imie).

ArchI
12-12-06, 22:01
czyli to ma wygl─ůda─ç tak?


ReadLn(imie);
if length(imie) > 0 then
imie[1] := UpCase(imie[1]);
ReadLn(nazwisko);
if length(nazwisko) > 0 then
nazwisko[1] := UpCase(nazwisko[1]);

jezeli nie tak to bardzo bym Cie prosi┼é zeby┼Ť mi napisa┼é/┼éa t─ů modyfikacje
(tylko t─ů na duze litery bo z terszt─ů prawie sobie poradzi┼éem;])
z g├┼éry dzi─Öki;]

Piotrek
12-12-06, 22:27
Poprawcie swoje posty by kod pascala by┼é uj─Öty w znacznik bbcode [ C O D E ] ... lepiej sie czyta tak sformatowan─ů czcionk─Ö i pole.

Zefir_psv
12-12-06, 23:30
:Piotrek
sorki.

:ArchI, tak to powinno wygladac jak napisales. W przypadku, gdyby kompilator sie pultal o "UpCase", wstaw na poczatku programu funkcje, ktora podalem. Oczywiscie "imie" i "nazwisko" zamien na zmienne, ktorych Ty uzywasz w swoim programie.

ArchI
14-12-06, 16:22
zrobiłem tak (pewnie źle;[):
wprowadziłem funkcję:

function DuzaLitera(znak: char): char;
begin
DuzaLitera := Chr(Ord(znak) and 223);
end;

wprowadziłem procedurę:

ReadLn(imie);
if length(imie) > 0 then
imie[1] := UpCase(imie[1]);
ReadLn(nazwisko);
if length(nazwisko) > 0 then
nazwisko[1] := UpCase(nazwisko[1]);

w programie wywo┼éa┼éem t─ů procedur─Ö
i nie działa;( pojawia się komunikat Error 3:unknown identifier
prosz─Ö o pomoc

Zefir_psv
14-12-06, 17:39
wprowadziłem procedurę:

ReadLn(imie);
if length(imie) > 0 then
imie[1] := UpCase(imie[1]);
ReadLn(nazwisko);
if length(nazwisko) > 0 then
nazwisko[1] := UpCase(nazwisko[1]);w programie wywo┼éa┼éem t─ů procedur─Ö
i nie działa;( pojawia się komunikat Error 3:unknown identifier


Ja nie poda┼éem Tobie gotowej procedury. Ja poda┼éem Tobie schemat jak to zrobi─ç. Je┼Ťli przepisa┼ée┼Ť to, co poda┼éem i owin─ů┼ée┼Ť to tylko w "procedure" i "end;", to jasne, ┼┼║e nie zadzia┼éa.



wprowadziłem funkcję:


function DuzaLitera(znak: char): char;
To, ┼┼║e j─ů wprowadzi┼ée┼Ť, to nie znaczy jeszcze, ┼┼║e wszystko jest OK. Powiniene┼Ť dodatkowo j─ů wykona─ç w odpowiednim miejscu i odpowiednim czasie! W zamy┼Ťle ta funkcja ma zast─Öpowa─ç UpCase gdyby pod TP nie dzia┼éa┼éo. Musisz sprawdzi─ç, czy UpCase dzia┼éa. Je┼Ťli nie, mo┼┼║esz u┼┼║y─ç funkcji, kt├┼ér─ů poda┼éem. Je┼Ťli dzia┼éa, u┼┼║yj UpCase.