Помощь - Поиск - Пользователи - Календарь
Полная версия: типизированный файл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
what is
Здравствуйте.
У меня тут некоторая проблемка с типизированным файлом. Прошу помощи.
Итак, суть задачи: создать основную программу и модуль. В основной выводится меню и считывается номер пункта. В модуле расположены процедуры на пункты меню.
Создается типизированный файл(справочник 2), куда вводятся данные о номенклатурном номере изделия, наименовании изделия и цене изделия. После создания файл можно распечатать и откорректировать(удалить запись, добавить запись или редактировать запись).
Собственно все работает, кроме корректирови и удаления записи. wacko.gif
выкладываю кусок модуля с процедурами на создание файла, корректировку и удаление записей.

unit modmenu4;
interface
uses crt;
type
tsprav2=record{собственно запись данных}
nom_num:integer;
name_izdel:string;
price:integer
end;
ztsprav2=array[1..30] of tsprav2;{тип записи}
var
name2:string;
n,m,i:integer;
flag,fl:boolean;
answer:char;
zap_sprav2:ztsprav2;
sprav2:file of tsprav2;

procedure vvod_sprav2;
procedure udal_zap_sprav2;
procedure corr_zap_sprav2;

implementation

procedure vvod_sprav2;{ввод типизированного файла}
var
i:integer;
name2,answer:string;
begin
i:=0;
repeat
writeln('vvedite imya faila-spravo4nika 2:');
readln(name2);
assign(sprav2,name2);
{$I-} reset (sprav2); {$I+}
if ioresult=0 then
begin
writeln('imya faila *',name2,'* yje est');
close(sprav2);
fl:=false;
end
else
begin
rewrite(sprav2);
fl:=true;
end;
until fl;
flag:=true;

while(flag=true) do
begin
inc(i);
writeln('Zapis N',i);
write('>Vvedite nom.nomer izdeliya:');
readln(zap_sprav2[i].nom_num);
write('>vvedite naimenovanie izdeliya:');
readln(zap_sprav2[i].name_izdel);
write('>vvedite cenu izdeliya:');
readln(zap_sprav2[i].price);
write(sprav2,zap_sprav2[i]);
writeln('prodoljat zapis? <y/n>');
readln(answer);
if (answer='n') or (answer='N') then
flag:=false;

end;
close(sprav2);
end;



процедура на удаление отдельных строк записи

procedure udal_zap_sprav2;
var
flag,flag1:boolean;
j,i:integer;
temp:file of tsprav2;
namet:string;
begin
repeat
writeln('vvedite imya faila-spravo4nika 2:');
readln(name2);
assign(sprav2,name2);
{$I-} reset (sprav2); {$I+}
if ioresult<>0 then
begin
writeln('imya faila *',name2,'* net');

fl:=false;
end
else
begin
reset(sprav2);
fl:=true;
end;
until fl;
namet:='temp2';
assign(temp,namet);
rewrite(temp);
m:=filesize(sprav2);

writeln('N':3,'nom.nomer':10,'name izdeliya':16,'cena':8);
writeln;
for j:=1 to m do
begin
read(sprav2,zap_sprav2[j]);
writeln('',j,'':3,zap_sprav2[j].nom_num:10,zap_sprav2[j].name_izdel:16,zap_sprav2[j].price:8);
end;
while flag=true do
begin
Write('Vvedite nomer redactiruemoy zapisi: ');{дальше этого момента прога не работает}
readln(i);
if (i<1) or (i>m) then
begin
WriteLn('Neverniy nomer!');
writeln;
writeln('Prodoljat vvod nomera? <y,n>');
readln(answer);
if (answer='n') or (answer='N') then
flag:=false;
close(sprav2);
close(temp);
erase(temp);
end
else
flag:=false;
end;
for j:=1 to i do
begin
read(sprav2,zap_sprav2[j]);
write(temp,zap_sprav2[j]);
end;
for j :=i to m-1 do
begin
zap_sprav2[j]:=zap_sprav2[j+1];
dec(m);
end;
seek(temp,filesize(temp));
for j:=i to m do
write(temp,zap_sprav2[j]);
close(sprav2);
close(temp);
erase(sprav2);
rename(temp,name2)
end;


процедура для корректировки отдельных строк записи

procedure corr_zap_sprav2;
var i,j,m:integer;
zap:ztsprav2;
s:integer;
s1,namet:string;
fl:boolean;
temp:file of tsprav2;
begin
repeat
writeln('vvedite imya faila-spravo4nika 2:');
readln(name2);
assign(sprav2,name2);
{$I-} reset (sprav2); {$I+}
if ioresult<>0 then
begin
writeln('imya faila *',name2,'* net');
fl:=false;
end
else
begin
reset(sprav2);
fl:=true;
end;
until fl;
namet:='temp3';
assign(temp,namet);
rewrite(temp);
writeln('Spravo4nik 2');
writeln('N':4,'nom.nomer':10,'name izdeliya':16,'cena':8);
writeln;
m:=filesize(sprav2);
for j:=1 to m do
begin
read(sprav2,zap_sprav2[j]);
write('',j,'':4,zap_sprav2[j].nom_num:10,zap_sprav2[j].name_izdel:16,zap_sprav2[j].price:8);
writeln;
end;
fl:=true;
repeat
begin
Writeln('--> Vvedite nomer redactiruemoy zapisi: ');{здесь тоже аналогично}
readln(i);
if (i<1) or (i>m) then
begin
WriteLn('Neverniy nomer!');
writeLn;
end
else
fl:=false;

end;
until fl=false;
m:=filesize(sprav2);
for j:=1 to i do
read(sprav2,zap_sprav2[j]);
write(temp,zap_sprav2[j]);
Write('Vvedite novoe zna4enie i najmite *ENTER*');
with zap_sprav2[i] do
begin
Write('Nom.nomer izdeliya: ',nom_num,'--->');
ReadLn(s);
nom_num:=s;
Write('Naimenovanie izdeliya: ',name_izdel,'--->');
ReadLn(s1);
name_izdel:=s1;
Write('cena izdeliya: ',price,'--->');
ReadLn(s);
price:=s;
seek(temp,filesize(temp));
write(temp,zap_sprav2[i]);
seek(temp,filesize(temp));
for j:=i+1 to m do
read(sprav2, zap_sprav2[j]);
write(temp, zap_sprav2[j]);
end;
close(sprav2);
close(temp);
erase(sprav2);
rename(temp,name2);
end;
end.

.
Помогите пожалуйста....уже замучалась.... mega_chok.gif
what is
Помогите пожалуйста....плиззз...
а то мне завтра сдавать эту прогу....
blink.gif
Renbo
ИМХО, твой код ваще надо с 0-ля писать ))
Где ты видела программу при запуске корректировки запсиси не выпустит пользователя из запроса ВВЕДИТЕ НОМЕР КОРРЕКТИРУЕМОЙ ЗАПИСИ, пока ты не введёшь номер и не откорректируешь.

Читаю твой код и просто глаза плывут )

Всё же по сути просто:
удаление - переписываешь нужные записи во второй фаил, а первый потом удаляешь, а второй переименовываешь
корректировка - переписываешь все записи до корректируемой во второй фаил, потом внего вписываешь как бы новую запись, а потом переписываешь все остальные записи. первый удаляешь, второй переименовываешь.


Procedure Ydalenie2;
Var
h:string;
n2,code,i,n1:integer;
help2:file of TZ2;
otvet:char;
Begin
clrscr;
vivodilka2; {тут выводит на экран все записи}
writeln('Хотите ли удалить запись(Y/N) ?');
otvet:=danet; {функция по определению 'y' или 'n'}
IF otvet in ['Y','y'] then
begin
writeln('Удаление записи:');
repeat
reset(spravochnik2);
n1:=0;
while not eof(spravochnik2) do
begin
read(spravochnik2,Zap2);
inc(n1);
end;
close(spravochnik2);
reset(spravochnik2);
assign(help2,'help');
rewrite(help2);
writeln('Какую запись вы хотите удалить?');
readln(h);
Val(h,n2,code);
If (n1 < n2) or (n2=0) then
begin
writeln('Такой записи не существует!!');
readkey;
close(spravochnik2);
close(help2);
end
Else
begin
i:=0;
repeat
inc(i);
If not (i=n2) then
begin
read(spravochnik2,Zap2);
write(help2,Zap2);
end
else read(spravochnik2,Zap2);
until eof(spravochnik2);
close(help2);
close(spravochnik2);
erase(spravochnik2);
rename(help2,'spravka2');
end;
clrscr;
vivodilka2;
writeln('Хотите ли вы удалить ещё одну запись(Y/N)?');
otvet:=DaNet;
until otvet in ['N','n'];
end;
End;



Вот тебе удаление, вроде всё просто и понятно всем...
volvo
Цитата
удаление - переписываешь нужные записи во второй фаил, а первый потом удаляешь, а второй переименовываешь
С типизированным-то файлом? Ну-ну...

Вместо того, чтобы последнюю запись перенести на место удаляемой, и сделать Truncate по предпоследней записи (пример - в поиске по слову Truncate) ты будешь все записи переносить в другой файл?
what is
Эм..да....
сама пугалась своей проги( norespect.gif (

спасибо большое.....
будем переделывать)
Renbo
Цитата(volvo @ 3.05.2007 19:17) *

С типизированным-то файлом? Ну-ну...

Вместо того, чтобы последнюю запись перенести на место удаляемой, и сделать Truncate по предпоследней записи (пример - в поиске по слову Truncate) ты будешь все записи переносить в другой файл?


мне мой способ просто понятен сразу стал )
Кстати, что-то я и не подумал про Truncate, а с ним жить-то легче, ты прав ) и процедура в разы сократится, вот токо уже лабу сделал как сделал, но спасиб, на будущее буду помнить smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.