Witam!
Zrobiłem sobie program, lecz potrzebuję jeszcze sprawdzania poprawności wprowadzania danych. Proszę więc Was o jakieś rady jak to najlepiej zrobić. A drugi problem to chciałbym również,aby kolejne elementy wektora zawierającego rekordy były zapisywane do pliku każdy od nowej lini i najlepiej z jakimiś nagłówkami tak jak w procedurze Wyswietl. Nie mogę użyć writeln ponieważ jest plik typowany,więc jak można inaczej to zrobić? I co można by ewentualnie poprawić(zoptymalizować) w kodzie.
Oto kod:
Program P1;
{$mode objfpc}{$H+}
Uses //Gotowe biblioteki
{$IFDEF UNIX}{$IFDEF UseCThreads} cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp,CRT
{ you can add units after this };
Type
TData=record
Dzien:1..31;
Miesiac:string[15];
Rok:886..2014;
End;
TDaneKsiazek=record
Tytul:string[15];
Data_Druku:Tdata;
Typ:string[50];
End;
Vec=array of TDaneKsiazek;
Var
B_D:Vec;
L:byte;
Plik:File of TDaneKsiazek;
//==========================WCZYTYWANIE==================================
Procedure Wczytaj(var BD:Vec;var LL:byte);
Var
i:byte;
Begin
Writeln('Dla ilu ksiazek chcesz stworzyc baze?');
Readln(LL);
LL:=LL+1;
SetLength(BD,LL);
For i:=1 to LL-1 do
With BD[i] do
With Data_druku do
Begin
Writeln('Podaj tytul ksiazki[',i,']');
Readln(Tytul);
//===================Data====================
Writeln('Podaj dzien druku ksiazki[',i,']');
Readln(Dzien);
Writeln('Podaj miesiac druku ksiazki[',i,']');
Readln(Miesiac);
Writeln('Podaj rok druku ksiazki[',i,']');
Readln(Rok);
//============================================//
Repeat //Instrukcja pętli
Writeln('Czy ksiazka [',i,'] jest podrecznikiem');
Readln(Typ); //Wczyta typ
Case Typ of //Instrukcja warunkowa
'Tak','tak','TAK':Typ:='Podrecznik';
'Nie','nie','NIE':Typ:='To nie jest podrecznik';
End;
Until (Typ='Podrecznik') or (Typ='To nie jest podrecznik');
Writeln;
End;
End;
//==================SORTOWANIE WG.TYTUŁU=================================
Procedure Sortuj_T(var BD:Vec;LL:byte);
Var
i,j:byte;
tmp:TDaneKsiazek;
Begin
Writeln('//Elementy posortowane wg.tytulu:');
For i:=1 to LL-1 do
For j:=1 to LL-1 do
If BD[i].Tytul<BD[j].Tytul then
Begin
tmp:=BD[i];
BD[i]:=BD[j];
BD[j]:=tmp;
End;
End;
//=======================SORTOWANIE WG.ROKU DRUKU========================
Procedure Sortuj_R(var BD:Vec;LL:byte);
Var
i,j:byte;
tmp:TDaneKsiazek;
Begin
Writeln('//Elementy posortowane wg.roku druku:');
For i:=1 to LL-1 do
For j:=1 to LL-1 do
With BD[i] do
With Data_druku do
If BD[i].Data_druku.Rok<BD[j].Data_druku.Rok then
Begin
tmp:=BD[i];
BD[i]:=BD[j];
BD[j]:=tmp;
End;
End;
//==========================WYŚWIETLANIE=================================
Procedure Wyswietl(BD:Vec;LL:byte);
Var
i:byte;
Begin
For i:=1 to LL-1 do
With BD[i] do
With Data_druku do
Begin
Write('Tytul:"',Tytul,'" ');
Write('Data druku:',Dzien,' ',Miesiac,' ',Rok,' ');
Write('Typ:',Typ,' ');
Writeln;
End;
End;
//======================ZAPIS DO PLIKU====================================
Procedure Zapis(BD:Vec;LL:byte);
Var
i:byte;
Nazwa,Sciezka:string[255];
Begin
Writeln('Podaj sciezke zapisu pliku');
Readln(sciezka);
Writeln(UTF8ToConsole('Podaj nazwe pliku'));
Readln(nazwa);
Sciezka:=Sciezka+Nazwa+'.dbf';
Assign(Plik,Sciezka);
Rewrite(Plik);
For i:=1 to LL-1 do
Write(Plik,BD[i]);
Close(Plik);
End;
//======================PROGRAM GŁÓWNY====================================
BEGIN
Wczytaj(B_D,L);
Clrscr;
Sortuj_T(B_D,L);
Wyswietl(B_D,L);
Zapis(B_D,L);
Sortuj_R(B_D,L);
Wyswietl(B_D,L);
Zapis(B_D,L);
Readln;
END.