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

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

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

Автор: what is 5.04.2007 0:50

Помогите разобраться,плиз...

Задача состоит в следущем:
создать многоуровневую диалоговую программу, с помощью которой создается основной файл и 2 файла справочника. Для основного файла надо предусмотреть создание нового, открытие существующего, печать, также его редактирование(добавление, удаление записей) и сортировку входных данных по первому компоненту.

В общем проблема возникла с основным файлом,т.к. отсортировать или отредактировать у меня его не получилось...никак...

вот основная прога, которая выводит основное меню и запускает модуль


Program menu1;
Uses modmenu111;

var
choice,count,code:integer;
flag:boolean;
answer:char;
choice1:string;

begin
writeln(' Laboratornaya rabota 2 ');
writeln(' Variant 4 ');

writeln;
flag:=true;
while flag=true do
begin
writeln('..................MENU...................');
writeln('..1. Vedenie osnovnogo faila ..');
writeln('..2. Vedenie spravo4nikov ..');
writeln('..3. Formirovanie vedomostei ..');
writeln('..4. Vihod ..');
writeln('..........................................');
writeln;
writeln('vash vibor:');

count:=0;
repeat
readln(choice1);
val(choice1,choice,code);
if (code<>0)then
writeln ('vvedeno ne 4islo');
count:=count+1;
if count>3 then
begin
writeln ('4islo popitok is4erpano');
halt;
end
until code=0;
Case choice of
1:begin
podmenu1;;
end;
2:begin
podmenu2;
end;
3:begin
podmenu3;
end;
4:begin
writeln('Vi deistvitelno hotite viyti iz programmi? <y\n>');
readln(answer);
if answer='y' then
flag:=false;
end
else writeln('Oshibka!!!Vibran nevirnyi punkt menu:',choice);
end;
end;
end.


.

вот сам модуль(выкладываю только процедуры на основной файл)

unit modmenu1;
{модуль всех процедур для пунктов главного меню и всех подменю}
interface
type tosnfile=record {основной файл}
cod_stock:integer;
cod_ceh:integer;
nom_num:integer;
data:string;
kol_vo:integer
end;
procedure podmenu1;
procedure vvodfile;
procedure printfile;
procedure drawtabfile;
procedure drawlegs;
procedure sort(var f:atosnfile;n:byte);
implementation
--------------------------------{подменю для первого пункта меню}-----------------------------------------------
procedure podmenu1;
var
choice,count,code:integer;
flag:boolean;
answer:char;
choice1:string;
begin
flag:=true;
while(flag=true) do
begin
writeln('.1.Vedenie osnovnogo faila............');
writeln('......................................');
writeln('.1.1 Sozdanie novogo faila .');
writeln('.1.2 Korrektirovka osnovnogo faila .');
writeln('.1.3 Prosmotr osnovnogo faila .');
writeln('.1.4 Pe4at osnovnogo faila .');
writeln('.1.5 Vozvrat v glavnoe menu .');
writeln('......................................');
writeln;
writeln('vash vibor:');
count:=0;
repeat
readln(choice1);
val(choice1,choice,code);
if (code<>0)then
writeln ('vvedeno ne 4islo');
count:=count+1;
if count>3 then
begin
writeln ('4islo popitok is4erpano');
halt;
end
until code=0;
case choice of
1:begin
vvodfile;
end;
2:begin
end;
3:begin
printfile;
end;
4:begin
printfile;
end;
5:begin
flag:=false;
end
else writeln('Oshibka!!!Vibran neverniy punkt menu:',choice);
end;
end;
end;

------------------- {процедура создания нового основного файла}-------------------------------
procedure vvodfile;
var
osnfile:file of atosnfile;
zap:atosnfile;
namefile:string;
flajok:boolean;
answer:char;
i,n:byte;
begin
writeln('vvedite imya osnovhogo faila(s rasshireniem .txt):');
readln(namefile);
assign(osnfile,namefile);
rewrite(osnfile);
flajok:=true;
writeln('Vvedite kol-vo zapisey, kotorie sobiraetes vvodit:');
readln(n);
for i:=1 to n do
with zap[i] do
begin
writeln('ZaPiS N ',i);
writeln('>Vvedite kod sklada:');
readln(cod_stock);
writeln('>vvedite kod ceha-izgotovitelya:');
readln(cod_ceh);
writeln('>vvedite nomen. nomer izdeliya:');
readln(nom_num);
writeln('>data postupleniya /ddmmyy/ :');
readln(data);
writeln('>vvedite kol-vo izdelii:');
readln(kol_vo);
write(osnfile,zap);
writeln('vvod dannih zavershen? <y/n>: ');
readln(answer);
if answer='y' then
Break;
end;
close(osnfile);
assign(osnfile,namefile);
reset(osnfile);
sort(zap,n);
write(osnfile,zap);
close(osnfile);
end;
---------------------------{процедура распечатки(вывода на экран) основного файла}---------------------------------
procedure printfile;
var
namefile:string;
osnfile:file of tosnfile;
zap:tosnfile;
begin
writeln ('Vvedite imiya faila dlya pe4ati');
readln (namefile);
assign(osnfile,namefile);

reset(osnfile);
writeln('Pe4at faila: ',namefile);
drawtabfile;
repeat
read(osnfile,zap);
writeln('*',zap.cod_stock:12,'*',zap.cod_ceh:10,'*', zap.nom_num:10,'*',zap.data:8,'*',zap.kol_vo:8,'*');
drawlegs;
until (EOF(osnfile));
close(osnfile);
writeln;
end;
--------------------------{процедура рисует подобие таблицы}------------------------------------------------
procedure drawtabfile;
begin
writeln('******************************************************');
writeln('* KOD * KOD CEHA * NOMEN. * DATA * KOL-VO *');
writeln('* SKLADA * IZGOTOV. * NOMER * * IZDELIY*');
writeln('******************************************************');
end;
-------------------------------{процедура рисует линии-ограничители}-----------------------------------------------
procedure drawlegs;
begin
writeln('******************************************************');
end;
-------------------------------{процедура сортировки по коду склада}----------------------------------------------
вот в ней то и проблема
procedure sort(var f:atosnfile;n:byte);
var
i:byte;
zap:tosnfile;
flag:boolean;
begin
repeat
flag:=true;
for i:=1 to n-1 do
if not (f[i].cod_stock >= f[i+1].cod_stock) then
begin
zap:=f[i];
f[i]:=f[i+1];
f[i+1]:=zap;
flag:=false;
end;
until flag;
end;
end.

.

все на что меня хватило.Дальше - мозговой затык.... wacko.gif
Отредактировать файл уже нет мыслей никаких....
Подскажите, пожалуйста....уже замучалась....


Автор: klem4 5.04.2007 1:37

Во первых что за тип atosnfile ? Что-то я его описания в упор не вижу blink.gif Во вторых в процедуре ввода, ты в цикле считываешь записи поэлементно zap[i], и там-же в цикле зачемто пытаешься писать каждый раз весь массив в файл.

Либо уж записывай массив в файл поэлементно, либо сначала введи все записи в массив а потом его полностью запиши файл, судя по всему тебе нужен второй вариант ибо файл у тебя описан как file of atosnfile, а atosnfile - подозреваю что это массив записей.

Автор: what is 5.04.2007 12:16

Да...конечно, atosnfile=array[1..30] of tosnfile....не скопировала... wacko.gif
насчет zap - это да...возможно поэтому при выводе таблица была невероятных размеров)

а вот как редактировать файл, ведь он же типизированный....если б был текстовый, то через pos,insert,delete без проблем....а так что надо через временный файл производить редактирование?

Автор: Archon 5.04.2007 12:58

Цитата
а вот как редактировать файл, ведь он же типизированный....если б был текстовый, то через pos,insert,delete без проблем....а так что надо через временный файл производить редактирование?
Да, или через временный, или сперва считать все записи в оперативку, потом отредактировать их и перезаписать файл.

Автор: volvo 5.04.2007 13:04

Цитата
если б был текстовый, то через pos,insert,delete без проблем...
Как раз с текстовыми получила бы большую проблему в виде того, что редактировать надо ВЕСЬ файл, нельзя заменить одну строку, не переписав всего остального... С типизированными файлами все гораздо проще: ищешь компоненту, которую будешь править, запоминаешь ее позицию в файле, читаешь ее (только ее, заметь, все остальное - без изменений) в переменную типа "запись", правишь переменную, и перезаписываешь на туже позицию в файле, откуда считала...

Автор: what is 5.04.2007 13:28

О...спасибо ....попробуем воплотить в жизнь...

Автор: what is 5.04.2007 17:36

замучалась.... wacko.gif
поменяла считывание записей на поэлементное, т.е. zap[i]


with zap[i] do
begin
writeln('ZaPiS N ',i);
writeln('>Vvedite kod sklada:');
readln(cod_stock);
writeln('>vvedite kod ceha-izgotovitelya:');
readln(cod_ceh);
writeln('>vvedite nomen. nomer izdeliya:');
readln(nom_num);
writeln('>data postupleniya /ddmmyy/ :');
readln(data);
writeln('>vvedite kol-vo izdelii:');
readln(kol_vo);
write(osnfile,zap[i]);<--------вот тут


тогда паскаль потребовал заменить на zap[i], там где я перезаписываю файл после сортировки....

reset(osnfile);
(может здесь надо цикл пустить for i:=1 to n do.....?)
sort(zap,n);
write(osnfile,zap[i]);<-----------вот здесь
close(osnfile);



После этого сортируется следущим образом: вместо первой строки ставится с меньшим *кодом склада*, а на место той строки ставится наименьшая продублированная. Т.е. после сортировки 1-я строка исчезает...
т.е. вот

Pe4at faila: 77
******************************************************
* KOD * KOD CEHA * NOMEN. * DATA * KOL-VO *
* SKLADA * IZGOTOV. * NOMER * * IZDELIY*
******************************************************
* 0* 8* 9* 7* 89*<--------первая до сортировки строка заменяется на наименьшую,
******************************************************
* 0* 8* 9* 7* 89*<--------дальше сама строка удаляется,дублируя теперь уже 1-ю
******************************************************
* 1* 32* 4* 6* 5*
******************************************************
* 35* 65* 4* 75* 6*
******************************************************


я-то понимаю, что неправильно norespect.gif , но вот в чем именно не могу..
P.S.если я саму сортировку меняю по убыванию, то все в норме...


в чем ошибка-то?