IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на файл, некоторые проблемы
сообщение
Сообщение #1


только вперед...
*

Группа: Пользователи
Сообщений: 20
Пол: Женский

Репутация: -  1  +


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

Задача состоит в следущем:
создать многоуровневую диалоговую программу, с помощью которой создается основной файл и 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
Отредактировать файл уже нет мыслей никаких....
Подскажите, пожалуйста....уже замучалась....



Сообщение отредактировано: what is -


--------------------
Завтра будет. Лучше???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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

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


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


только вперед...
*

Группа: Пользователи
Сообщений: 20
Пол: Женский

Репутация: -  1  +


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

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


--------------------
Завтра будет. Лучше???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


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


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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


только вперед...
*

Группа: Пользователи
Сообщений: 20
Пол: Женский

Репутация: -  1  +


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


--------------------
Завтра будет. Лучше???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


только вперед...
*

Группа: Пользователи
Сообщений: 20
Пол: Женский

Репутация: -  1  +


замучалась.... 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.если я саму сортировку меняю по убыванию, то все в норме...


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

Сообщение отредактировано: what is -


--------------------
Завтра будет. Лучше???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 30.09.2020 7:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name