Turbo Pascal baza danych na pliku


(Olekiwanski) #1

Potrzebuje pomocy z programem, a mianowicie program jako taki działa tylko nie zapisuje trwale danych w pliku i po ponownym otworzeniu programu nie ma tam już wcześniej wpisywanych danych. to ten program

Program dziennik;

USES CRT;

TYPE

Datastyp = RECORD

Dzien:1..31;

Miesiac:1..12;

Rok:Integer;

END;

StudentTyp = ARRAY [1..10] OF RECORD

Imie:String;

Nazwisko:String;

o_z_p:String;

o_z_m:String;

o_z_n:String;

o_z_p1:String;

o_z_m1:String;

o_z_n1:String;

dataur:Datastyp;

END;

Plik = File of StudentTyp;

VAR

p1, p2: Plik;

Student:StudentTyp;

a,i:Integer;

c:char;

Procedure Do_pliku(VAR x:Plik);

Var

i:Integer;

BEGIN

ClrScr;

Assign (x, 'plik.txt');

ReWrite(x);

Write('Podaj ilosc uczniow, ktorych chcesz wprowadzic: '); Readln(a);

FOR i:=1 TO a DO

BEGIN

WriteLn('Numer w dzienniku ', i);

Write('Podaj Imie: '); ReadLn(Student_.Imie);_

Write('Podaj nazwisko: '); ReadLn(Student__.Nazwisko);

Write('Podaj dzien urodzenia: '); ReadLn(Student__.Dataur.Dzien);

Write('Podaj miesiac urodzenia: '); ReadLn(Student__.Dataur.Miesiac);

Write('Podaj rok urodzenia: '); ReadLn(Student__.Dataur.Rok);

Write('Podaj ocene z polskiego: '); ReadLn(Student__.o_z_p);

Write('Podaj ocene z niemieckiego: '); ReadLn(Student__.o_z_n);

Write('Podaj ocene z matematyki: '); ReadLn(Student__.o_z_m);

WriteLn;Write(x,student);

END;

Close(x);

END;

Procedure Dopisywanie(VAR x:Plik);

Var

b,i:Integer;

BEGIN

Assign (x, 'plik.txt');

ReWrite(x);

Write('Podaj ilosc uczniow, ktorych chcesz wprowadzic: '); Readln(b);

FOR i:=a+1 TO a+b DO

BEGIN

ClrScr;

WriteLn('Numer w dzienniku ', i);

Write('Podaj Imie: '); ReadLn(Student__.Imie);

Write('Podaj nazwisko: '); ReadLn(Student__.Nazwisko);

Write('Podaj dzien urodzenia: '); ReadLn(Student__.Dataur.Dzien);

Write('Podaj miesiac urodzenia: '); ReadLn(Student__.Dataur.Miesiac);

Write('Podaj rok urodzenia: '); ReadLn(Student__.Dataur.Rok);

Write('Podaj ocene z polskiego: '); ReadLn(Student__.o_z_p);

Write('Podaj ocene z niemieckiego: '); ReadLn(Student__.o_z_n);

Write('Podaj ocene z matematyki: '); ReadLn(Student__.o_z_m);

WriteLn;Write(x,student);

END;

a:=a+b;

Close(x);

END;

Procedure wypisywanie( VAR x:Plik);

Var

i:Integer;

Begin

ClrScr;

Assign(x, 'plik.txt');

Reset(x);

Begin

FOR i:=1 TO a DO

BEGIN

Writeln;

Writeln;

Writeln('Numer w dzienniku ',i);

Writeln(Student .Imie,' ', Student.Nazwisko);

Writeln(Student .Dataur.dzien,'.',Student.dataur.miesiac,'.', student__.dataur.rok,'r');

Writeln('ocena z polskiego ',Student .o_z_p,' ',Student.o_z_p1);

Writeln('ocena z niemieckiego ',Student .o_z_n,' ',Student.o_z_n1);

Writeln('ocena z matematyki ',Student .o_z_m,' ',Student.o_z_m1);

Writeln;

Delay(400);

END;

End;

ReadKey;

Close(x);

END;

Procedure wypisz_1(Var x:Plik);

Var

i,n:integer;

Begin

ClrScr;

Assign(x, 'plik.txt');

Reset(x);

Writeln('Podaj numer z dziennika ucznia'); Readln(n);

Begin

FOR i:=1 TO a DO

Begin

If i=n Then

BEGIN

Writeln('Numer w dzienniku ',i);

Writeln(Student .Imie,' ', Student.Nazwisko);

Writeln(Student .Dataur.dzien,'.',Student.dataur.miesiac,'.', student__.dataur.rok,'r');

Writeln('ocena z polskiego ',Student .o_z_p,' ',Student.o_z_p1);

Writeln('ocena z niemieckiego ',Student .o_z_n,' ',Student.o_z_n1);

Writeln('ocena z matematyki ',Student .o_z_m,' ',Student.o_z_m1);

Writeln;

Delay(400);

End;

End;

End;

ReadKey;

Close(x);

END;

Procedure dopisywanie_oceny(var x:Plik);

Var

b,i:Integer;

BEGIN

Assign (x, 'plik.txt');

ReWrite(x);

Writeln('Ktoremu numerowi z dziennika chcesz dopisac ocene?'); Readln(b);

For i:=1 To a Do

Begin

If i=b then

Begin

Writeln;

Writeln('Numer w dzienniku ',i);

Writeln(Student .Imie,' ', Student.Nazwisko);

Writeln(Student .Dataur.dzien,'.',Student.dataur.miesiac,'.', student__.dataur.rok,'r');

Write('Podaj ocene z polskiego: '); ReadLn(Student__.o_z_p1);

Write('Podaj ocene z niemieckiego: '); ReadLn(Student__.o_z_n1);

Write('Podaj ocene z matematyki: '); ReadLn(Student__.o_z_m1);

End;

End;

Close(x);

End;

Procedure Menu;

Begin

ClrScr;

Writeln('1. Wprowadz uczniow');

Writeln('2. Wypisz wszystkich uczniow');

Writeln('3. Dopisz uczniow');

Writeln('4. Wypisz wybranego ucznia');

Writeln('5. Dopisz ocene uczniowi');

Writeln('6. Zakoncz program');

End;

Begin

repeat

Menu;

c:=readkey;

Case c of

'1':Do_Pliku(p1);

'2':wypisywanie(p1);

'3':Dopisywanie(p1);

'4':wypisz_1(p1);

'5':dopisywanie_oceny(p1);

End;

until

c='6';

END.

Czekam na propozycje


(Pablo_Wawa) #2

Pobieżnie patrząc widzę u Ciebie błąd w procedurze Dopisywanie(VAR x:Plik);

BEGIN

Assign (x, 'plik.txt');

ReWrite(x); <- to ZERUJE plik (czyści jego zawartość!)

Zamiast tego użyj Append(x); - to otwiera plik do zapisu i ustawia na końcu wskaźnik pliku, umożliwiając dopisywanie danych.


(system) #3

Najlepiej odzielnie zrób procedure, która utworzy plik elementowy przykładowo, uważam że do tego typu zadań najlepiej sprawdzi się plik elementowy :

....

const nazwa:string = 'bazadanych.ucz';

....

Type Tuczen = record ... 

procedure nowa;

Begin

 assign(plik,nazwa);

 rewrite(plik);

 close(plik);

 writeln('Zostaa utworzona baza : ',nazwa);

 writeln('Nacisnij dowolny klawisz, aby kontynuwa†... ');

 repeat until keypressed;

End;

procedure dopisz;

var u : TUczen;

Begin

 writeln('DOPISYWANIE UCZNIA DO BAZY');

 write('Podaj imie : ');

 readln(u.im);

 write('Podaj nazwisko ; ');

 readln(u.naz);

 write('podaj srednia ocen ucznia : ');

 readln(u.sr);

 assign(plik,nazwa);

 reset(plik); {!!!!!!}

 seek(plik,filesize(plik)); {przechodzi na koniec pliku }

 write(plik,u);

 close(plik);

 writeln('Uczeä zosta dopisany do bazy',nazwa);

 writeln('Nacinij przycisk, aby kontunuowa†');

 repeat until keypressed;

End;

[/code]




Ponadto, raz widzę kod dotyczący plików elementowych

[code]Plik = File of StudentTyp;

Natomiast tworzysz plik.txt

Nie znam tego sposobu file = File of StudentTyp

Mimo wszystko może łatwiej by było plik : file of TUczen {Sugerując się w moim przykładzie}

Z czystej ciekawości ... robisz ten strukturalny program w pascal'u, ponieważ?

Pozdrawiam