Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Помогите с сортировкой

Автор: Гость 19.04.2007 22:42

Задание на запись.Создадь БД студентов, про каждого известно ФИО, пол, возр,средний балл.Отсортировать по возрасту.
написал, но пишет ошибку при попытке отсортировать, не могу устранить. помогите пожалуйста

Код
program lab_Zapisi;
uses crt;
const n=9;
type stud=record
  fio:string;
  srb:integer;
  age:integer;
  pol:char;
  end;
var f1:file of stud;
m,k,a:stud;
gruppa:array[1..n] of stud;
vid: byte;
flag: boolean;
i:integer;
name:string;

procedure file_name;{ima fila}
begin
write(' Vvedite ima fila ');
readln(name);
end;

procedure zapici; {sozdanie zapici}
begin
writeln(' zapici gryppi ',filepos(f1)+1);
with gruppa[i] do
  begin
   write(' Enter FIO ');  readln(fio);
  write(' Vozrast ');  readln(age);
  write(' Pol ');  readln(pol);
  write(' CPEDHUU BALL ');  readln(srb);
  write(f1,gruppa[i]);
  end;
end;

procedure dobavit_zapic;
var
i,p:integer;
begin
file_name;
assign(f1, name);
rewrite(f1);
writeln(' Sozdanie novoy zapisi ',name);
write(' Vvedite colichestvo zapisey ');
readln(p);
for i:=1 to p do
zapici;
writeln(' Dobavlenie novogo file ');
writeln(' File imeet ',filesize(f1),' zapicei ');
close(f1);
end;

procedure vivod;
begin
read(f1,gruppa[i]);
with gruppa[i] do
begin
  write(filepos(f1));
  writeln(' FIO ',fio,' Bo3PaCT ',age,' CPEDHUU BALL ', srb,' Pol ',pol);
  end;
end;

procedure vivod_zapicei;
begin
  file_name;
  assign(f1, name);
  {$I-}
  reset(f1);
  {$I+}
  if IOresult = 0 then
   begin
   seek(f1, 0);
   writeln(' Vivod zapicei ',name);
   while (not Eof(f1)) do
   vivod;
  close(f1);
end
  else
  writeln(' File s imenem ',name,' NET');
end;

procedure updaterec;
var
numrec: longint;
  begin
  file_name;
  assign(f1, name);
  {$I-}
  reset(f1);
  {$I+}
  if IOresult = 0 then
   begin
   write('N zapici');
   readln(numrec);
   seek(f1,numrec-1);
   writeln(' Staroe znachenie ');
   vivod;
   seek(f1,numrec-1);
   writeln(' Zadaem novoe znachenie ',numrec,' zapici ');
   zapici;
  close(f1);
end
else
  writeln('Faila s imenem ',name,' NET ');
end;

procedure zapic_end;
begin
file_name;
assign(f1, name);
{$I-}
reset(f1);
{$I+}
if IOresult = 0 then
begin
seek(f1, filesize(f1));
zapici;
writeln('Otkritiy file imeet ',filesize(f1),' zapisey ');
close(f1);
end
else
  writeln(' File s imenem ',name,' NET ');
end;

procedure findfio;
var
f: file of stud;
gruppa: stud;
maska: string;
flag: boolean;
countrec: integer;
  begin
  file_name;
  assign(f, name);
  {$I-}
  reset(f);
  {$I+}
  if IOresult = 0 then
   begin
   write('vvedite familiy dly poiska: ');
   readln(maska);
   flag:=false;
   countrec:=0;
   while (not Eof(f)) do
    begin
    read(f,gruppa);
    with gruppa do
    if pos(maska,fio) <> 0 then
      begin
      flag:=true;
      inc(countrec);
      writeln(' FIO ',fio,' Vozrast ',age,' sped ball ', srb,' Pol ',pol);
     end;
  end;
if flag then
  begin
  writeln(' Chislo zapisey s imenem ',maska,'=',countrec);
end
else
writeln(' File ne sodershit familii ',maska);
close(f);
end
else
writeln(' Fila s imenem ',name,' NET ');
end;

procedure sort_age;
var i:integer;
f1:file of stud;
k,m:stud;
flag:boolean;
  begin
  file_name;
  assign(f1,name);
  {$I-}
  reset(f1);
  {$I+}
  if IOresult = 0 then
   begin
   for i:=1 to filesize(f1) do begin
   seek(f1,i);
   read(f1,m);
   seek(f1,i+1);
   read(f1,k);
    repeat
    if m.age >k.age then begin
    a.age:=m.age;
    m.age:=k.age;
    k.age:=a.age;
    if i>1 then dec(i);
   end
  else inc(i);
   until i>=filesize(f1);
   for i:=1 to filesize(f1) do begin
   with gruppa[i] do
   write(' FIO ',fio,' Vozrast ',age,' srednii ball',srb ,' Pol ',pol);
  end;
end;
  close(f1);
  end
  else writeln(' Fila s imenem ',name,' NET ');
end;

Begin
textcolor(6);
flag:=false;
repeat

writeln(' 1. New file');
writeln(' 2. Prosmotr gruppi ');
writeln(' 3. Izmenenie zapisi');
writeln(' 4. Dobavlenie zapici');
writeln(' 5. Poik zapisi');
writeln(' 6. Sortirovka po Bo3PACTY');
writeln(' 0. Exit');
readln(vid);
case vid of
1: dobavit_zapic;
2: begin
   clrscr;

    vivod_zapicei;
   end;
3: updaterec;
4: zapic_end;
5: findfio;
6: begin
   sort_age;
   vivod;
   end;
0: flag:=true;
end;
writeln('Nagmite enter');
readln;
clrscr;
until flag;
END.

Автор: мисс_граффити 19.04.2007 23:02

М
1. При размещении исходного кода программ необходимо пользоваться тегами!


Гости не могут редактировать сообщения, поэтому исправлю сама...
но на будущее....

2.

for i:=1 to filesize(f1) do begin {откуда? нумерация вообще-то идет с 0}
seek(f1,i);
read(f1,m);
seek(f1,i+1); {seek(f1,filesize(f1)+1) - это лихо..}
read(f1,k);


3.Что это за деятельность?
    a.age:=m.age;
m.age:=k.age;
k.age:=a.age;

то есть из Пети 17 лет и Виктора 93 лет получится Петя 93 лет и Виктор 17 лет. Зачем?
Тем более что в файл эти изменения не пойдут...