Разработать программу, которая заносит во внешний файл записи упорядоченного списка, и программу, которая добавляет в сформированный внешний файл данные об М товарах, при этом, не нарушая упорядоченности исходного файла. Если среди добавляемых товаров встречается товар, сведения о котором в файле уже есть, то необходимо их обновить, т. е. старую запись исключить.
(Упорядочены товары по невозрастанию [убыванию] года выпуска)
------------
проблемы во второй..если смотреть только добавление записей и проверку на идентичность с ранее написанным то проблем не возникает. корректно удаляется старая запись и в конец файла под нужным номером добавляется новая. а вот если брать весь алгоритм [с сортировкой вместе] то здесь корректного выполнения не получается..
если запсиь какого-то товара не свопадает с ранее написанной,то она как надо встанет на своё место при сортировке по году выпуска товара, но если старую запись надо удалить,она конечно будет удалена, но встанет ровно на то мевсто где стояла старая (с тем же названием). примечательно,что запуская прогу во второй раз, всё отсортируется нормально,включая вновь забитые записи. Вопрос: в чём ошибка?? в коде думаю не стоит приводить заполнение файла исходными данными, поэтому собсно часть 2:
Код: Выделить всё
program ch2;
const n=11;
m=3;
type tovar=record
nazvanie:string[20];
cena:500..50000;
god:1990..2007;
kolvo:byte;
end;
var s,s1,p,p1,p2,p3,p4,z1,z2,z3:tovar;
f:file of tovar;
y,h,i,c,j,k,l,z,q,r:integer;
begin
assign(f,'C:/tovars.dat');
reset(f);
while not eof(f) do begin
read(f,s1);
with s1 do
writeln(nazvanie:20,' ':5,cena:5,' ':5,god:4,' ':5,kolvo);
end;
close(f);
writeln('dobavlyaem ',m,' tovarov:');
reset(f);
seek(f,filesize(f));
for i:=1 to m do begin
with s1 do begin
writeln('vvedite nazvanie tovara');
readln(nazvanie);
writeln('vvedite stoimost tovara');
readln(cena);
writeln('vvedite god vipuska tovara');
readln(god);
writeln('vvedite kol-vo tovara');
readln(kolvo);
end;
k:=0;
z:=filesize(f)-1;
while k<=z do begin
seek(f,k);
h:=filepos(f);
read(f,p);
if (p.nazvanie=s1.nazvanie) then begin
for j:=h to z-1 do begin
seek(f,j+1);
read(f,p);
seek(f,j);
write(f,p);
end;
seek(f,z);
truncate(f);
z:=z-1;
end else k:=k+1;
end;
write(f,s1);
for q:=0 to filesize(f)-1 do
for r:=q to filesize(f)-2 do begin
seek(f,r); read(f,z1);
seek(f,r+1); read(f,z2);
If (z1.god<z2.god) then begin
seek(f,r);
write(f,z2);
seek(f,r+1);
write(f,z1);
end;
end;
end;
close(f);
reset(f);
while not eof(f) do begin
read(f,s1);
with s1 do
writeln(nazvanie:20,' ':5,cena:5,' ':5,god:4,' ':5,kolvo);
end;
close(f);
readln;
end.