Помощь - Поиск - Пользователи - Календарь
Полная версия: паскаль
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-гость-
Помогите доделать задачку!
Не могу обойтись без дополнительно массива, он в тексте программы красным! Надо сражу записывать в файл, обходя этот массив, кто сможет помогите с данной проблемкой!



Задание:
Подготовить список из N наименований товаров. Конкретное значение N указано в варианте. Информация о каждом товаре содержит:
1) Название товара. 2) Цену. 3) Год выпуска. 4) Количество.
Список должен быть упорядочен по одному из параметров, указанных в конкретном варианте. Сведения по каждому товару необходимо представить в виде записи.
Разработать программу, которая заносит во внешний файл записи упорядоченного списка, и программу, которая добавляет в сформированный внешний файл данные об М товарах, при этом, не нарушая упорядоченности исходного файла. Если среди добавляемых товаров встречается товар, сведения о котором в файле уже есть, то необходимо их обновить, т. е. старую запись исключить.
Вариант №5.
Товары упорядочены по невозрастанию года выпу¬ска, N=7, M=3
Текст программы:

Код
Uses Crt;
Const n = 7; m = 3;
Type
t = record {tovar}
name: String; {nazvanie}
c, {cena}
y, {god vipuska}
k: Word {kol-vo}
end;
Var
  p: Array [1..n+m] of t; { <--- *** Здесь был красный цвет *** }
e: t;
i,j,k,w: Byte;
f: File of t;
Procedure Vvod(var m: t);
begin
with m do
begin
Write('Najvanie: '); ReadLn(name);
Write('Cena: '); ReadLn©;
Write('Gop vipuska: '); ReadLn(y);
Write('Koli4estvo: '); ReadLn(k)
end;
WriteLn
end;Procedure Vivod;
begin
WriteLn('Nazvanie:':15, 'Cena:':6, 'God:':6, 'Kol-vo:':8);
for i:=1 to w do
with p[i] do
begin
Write(name:15);
Write(c:6);
Write(y:6);
WriteLn(k:8)
end;
end;Procedure Save;
begin
ReWrite(f);
for i:=1 to n do
Write(f,p[i]);
Close(f)
end;Begin
w:=n;
ClrScr;
WriteLn('Vvod informacii o ', n, ' tovarah.');
WriteLn;
for i:=1 to n do
begin
WriteLn('Vvod informacii o ', i, '-m tovare.');
Vvod(p[i]) end;
WriteLn('Najmite ENTER, chtobi otsortirovat'' tovari po nevozrastaniyu ','goda vipuska i zanesti ih spisok v fail "fail.dat".');
ReadLn;
for i:=n-1 downto 1 do
for j:=1 to I do if p[j].y < p[j+1].y then
begin
e:=p[j];
p[j]:=p[j+1];
p[j+1]:=e
end;
Assign(f,'fail.dat');
Save;
WriteLn('V fail byl zapisan sleduyuschiy spisok:');
Vivod; WriteLn;
WriteLn('Nujno dobavit'' dannie po ', m, '-m tovaram. Najmite ENTER.');
ReadLn;
for i:=1 to m do begin
WriteLn('Vvod informacii o ', i, '-m tovare.');
Vvod(e);
j:=1;
while j <= w do
begin
if p[j].name = e.name then
begin
p[j]:=e;
break
end;
Inc(j)
end;
if j = w+1 then
begin
j:=1;
while (j <= w)and(p[j].y > e.y) do
Inc(j);
Inc(w);
for k:=w downto j+1 do
p[k]:=p[k-1];
p[j]:=e
end
end;
Save;
WriteLn('Dannie byli uspeshno zaneseny v spisok, ne narushaya uporyado', 'chennosti, i sohraneny v fail "fail.dat".');
WriteLn; Vivod; ReadLn
End.
volvo
Цитата
Не могу обойтись без дополнительно массива, он в тексте программы красным! Надо сражу записывать в файл, обходя этот массив, кто сможет помогите с данной проблемкой!
Обойтись-то, конечно, можно, только вот к чему это? Смысл в чем? Запутаться? Без проблем. Представь себе, что если сортировка массива выглядит так:
for i:=n-1 downto 1 do
for j:=1 to I do if p[j].y < p[j+1].y then begin
e:=p[j]; p[j]:=p[j+1]; p[j+1]:=e
end;
, то сортировка напрямую в файле будет выглядеть вот так:
for i:=n-1 downto 1 do
for j:=1 to I do begin
seek(f, j - 1); read(f, rec_j);
seek(f, j); read(f, rec_j_1);

if rec_j.y < rec_j_1.y then begin
seek(f, j - 1); write(f, rec_j_1);
seek(f, j ); write(f, rec_j );
end;
end;
Разницу чувствуешь? Это только начало. Когда придется вставлять записи в определенное место файла, будет еще веселее... Ты все еще хочешь изменить программу? wink.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.