Консультация № 184944
24.12.2011, 15:49
127.71 руб.
0 9 1
Здравствуйте, уважаемые эксперты! Прошу вас решить в среде Turbo Pascal следующую задачу: дан исходный файл записей, в нём содержится информация о кубиках(длина ребра, цвет(белый, чёрный, розовый и оранжевый) а также материал(железо, пластик, дерево). Требуется выдать в текстовый файл количество кубиков по отдельным цветам, количество пластиковых с объёмом больше 18. Также нужно сделать меню с возможностью просмотра файлов, редактирования файла записей(добавлять, редактировать, удалять записи из файла (не используя массив записей)). Предусмотреть проверку на существование файлов.

Обсуждение

давно
Мастер-Эксперт
425
4118
26.12.2011, 07:33
общий
Также нужно сделать меню с возможностью просмотра файлов...

Всех файлов или только файла записи, или только текстовых файлов?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
26.12.2011, 19:24
общий
Цитата: Вадим Исаев ака sir Henry
Всех файлов или только файла записи, или только текстовых файлов?
Всех файлов. К сожалению задачу я сделала сама, могу выложить код.
Неизвестный
26.12.2011, 19:41
общий
Ну это-то, на наш взгляд - наилучший вариант! Почему же, к сожалению?
Неизвестный
26.12.2011, 19:50
общий
26.12.2011, 19:51
Цитата: 422
Почему же, к сожалению?
Просто программа крайне корявая получилась, да и редактирование файла записей до ума не довела.
Неизвестный
26.12.2011, 20:10
общий
А в чем проблема? Тогда имеет смысл показать
Неизвестный
26.12.2011, 20:25
общий
Меню можно было сделать через case, проверка на существование файла выполняется не во всех пунктах меню, но это я сама сделаю, меня больше всего интересует способ редактирования файла записей без применения массива записей.
Код:
Program lab12;
Uses Crt;
Type kub = record
dl: string [4];
color: string [4];
mat: string[4];
end;
f_st_rec = file of kub;
Var n1, n2, stroka: string[40]; st: kub; f1: f_st_rec; f2: Text; i, m: integer; ch: char;
Function FileExists(n1: String): Boolean;
var f1: f_st_rec;
begin
Assign(f1,n1);
{$I-}
reset(f1);
{$I+}
if IOResult=0 then begin
FileExists:=true;
end
else fileexists:=false;
end;
Function FileExiststwo(n2: String): Boolean;
var f2: Text;
begin
Assign(f2,n2);
{$I-}
reset(f2);
{$I+}
if IOResult=0 then begin
FileExiststwo:=true;
end
else fileexiststwo:=false;
end;
Procedure create(var f1:f_st_rec;var f2: text);
begin
clrscr;
assign(f1, '1.dat');
assign(f2, '2.txt');
rewrite(f1);
rewrite(f2);
end;
Procedure transname(var f1:f_st_rec; var f2: text);
begin
repeat
clrscr;
writeln ('1-изменение имени 1-го файла ');
writeln ('2-изменение имени 2-го файла ');
writeln ('0-в меню');
repeat
write ('ваш выбор:');
write (' ');
readln(m);
until (m>=0) and (m<=3);
if m=1 then begin
writeln('введите имя');
readln(n1);
Rename(f2,n2);
end;
if m=2 then begin
close(f2);
writeln('введите имя');
readln(n2);
Rename(f2,n2);
end;
until m = 0;
end;
Procedure outputdat(var f1:f_st_rec);
begin
clrscr;
if not FileExiststwo(n2) then
writeln('исходного файла не существует')
else begin;
reset(f1);
writeln('1-белый 2-чёрный 3-розовый 4-оранжевый');
writeln('1-железо 2-пластик 3-дерево');
while not eof(f1) do begin
i:=i+1;
read(f1,st);
writeln('кубик №',i,' длина=',st.dl,' цвет=',st.color,' материал',st.mat);
end;
close(f1);
readln;
end;
End;
Procedure errase(var f1:f_st_rec; var f2: text);
begin
clrscr;
repeat
writeln ('1-удаление первого файла ');
writeln ('2-удаление второго файла ');
writeln ('3-в меню');
repeat
write ('ваш выбор:');
write (' ');
readln(m);
until (m>=1) and (m<=4);
if m=1 then erase(f1);
if m=2 then erase(f2);
until m = 3;
end;
Procedure entr (var f1:f_st_rec);
begin
clrscr;
rewrite(f1);
writeln('заполните характеристики кубиков');
repeat
with st do begin
writeln('1-белый 2-чёрный 3-розовый 4-оранжевый');
writeln('1-железо 2-пластик 3-дерево');
writeln('длина: '); readln(dl);
writeln('цвет : '); readln(color);
writeln('материал :'); readln(mat);
end;
write(f1, st);
writeln('Enter -продолжить, Esc - закончить');
ch:=readkey;
clrscr;
until ch=#27;
close(f1);
end;
Procedure obrab (var f1:f_st_rec; var f2: Text);
var kr,j,z,s,vkr,vj,vz,vs,dk,dz,ds,dj,c,d,dkyb,plastic : integer;
begin clrscr;
kr:=0; j:=0; z:=0; s:=0; vkr:=0; vj:=0; vz:=0; vs:=0; dk:=0; plastic:=0; dkyb:=0;
reset(f1);
rewrite(f2);
writeln( 'Количество кубиков');
while not(eof(f1)) do begin
read(f1, st);
if (st.color='1') then begin
kr:=kr+1;
val(st.dl,dk,c);
vkr:=vkr+dk*dk*dk;
end;
if (st.color='2') then begin
j:=j+1;
val(st.dl,dj,c);
vj:=vj+dj*dj*dj;
end;
if (st.color='3') then begin
z:=z+1;
val(st.dl,dz,c);
vz:=vz+dz*dz*dz;
end;
if (st.color='4') then begin
s:=s+1;
val(st.dl,ds,c);
vs:=vs+ds*ds*ds;
end;
val(st.dl,d,c);
if ((st.mat='2') and (d>2)) then
plastic:=plastic+1;
end;
writeln(f2,'Quantity of the white=', kr,' Volume=', vkr);
writeln(f2,'Quantity of the black=', j,' Volume=', vj);
writeln(f2,'Quantity of the pink=', z,' Volume=', vz);
writeln(f2,'Quantity of the orange=', s,' Volume=', vs);
writeln(f2,'Quantity of the plastic=', dkyb);
close(f1); close(f2); clrscr;
end;
Procedure outputtxt (var f2:Text);
begin
clrscr;
if not FileExiststwo(n2) then
writeln('текстового файла не существует')
else begin;
reset(f2);
writeln;
while not(eof(f2)) do begin
readln(f2, stroka);
writeln(stroka);
end;
close(f2);
readln;
End;
end;
Procedure menu;
begin
repeat
writeln (' Меню:');
writeln ('1-создание файлов');
writeln ('2-изменение имён');
writeln ('3-ввод данных');
writeln ('4-удаление файлов');
writeln ('5-обработка данных');
writeln ('6-просмотр конечного файла ');
writeln ('7-просмотр исходного файла  ');
writeln ('8-выход');
repeat
write ('ваш выбор:');
write (' ');
readln(m);
until (m>=1) and (m<=9);
if m=1 then create(f1,f2);
if m=2 then transname(f1,f2);
if m=3 then entr(f1);
if m=4 then errase(f1,f2);
if m=5 then obrab(f1,f2);
if m=6 then outputtxt(f2);
if m=7 then outputdat(f1);
until m = 8;
clrscr;
end;
Begin
clrscr;
n1:='1.dat'; n2:='2.txt';
assign(f1, n1);
assign(f2, n2);
menu;
writeln('Конец работы');
readkey;
End.
давно
Профессионал
304622
583
27.12.2011, 16:56
общий
меня больше всего интересует способ редактирования файла записей без применения массива записей.


Например, вот так (написано в стиле остального вашего текста -- я бы по другому сделал.):
[code h=200]
Procedure outputdat(var f1:f_st_rec);
begin
if not FileExiststwo(n2) then
writeln('исходного файла не существует')
else
repeat
clrscr;
reset(f1);
writeln('1-белый 2-чёрный 3-розовый 4-оранжевый');
writeln('1-железо 2-пластик 3-дерево');
i:=0;
while not eof(f1) do begin
i:=i+1;
read(f1,st);
writeln('кубик №',i,' длина=',st.dl,' цвет=',st.color,' материал',st.mat);
end;
close(f1);
writeln ('1-',i,' - изменение записи ');
writeln ('0-в меню');
repeat
write ('ваш выбор:');
write (' ');
readln(m);
until (m>=0) and (m<=i);
if m<>0 then
with st do begin
reset(f1);
seek(f1,m-1);
writeln('длина: ');readln(dl);
writeln('цвет : '); readln(color);
writeln('материал :'); readln(mat);
write(f1, st);
end;
until m = 0;
End;
[/code]

Сгодится?

P.s. Одно замечание по другому поводу. У вас отстуствует проверка вводимых данных -- можно задать любой текст совершенно игнорируя подсказку "1-белый 2-чёрный 3-розовый 4-оранжевый". Этому сильно способствует задание полей записи через string [4]. Нелогично.
давно
Старший Модератор
31795
6196
28.12.2011, 13:29
общий
28.12.2011, 13:37
Вам подходит вариант предложенный экспертом?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Профессионал
304622
583
28.12.2011, 18:46
общий
это ответ
Здравствуйте, Татьяна Турунжева!

Исходя из того, вы сказали в мини-форуме, предлагаю вам переделать процедуру следующим образом:

[code h=200]Procedure outputdat(var f1:f_st_rec);
begin
if not FileExiststwo(n2) then
writeln('исходного файла не существует')
else
repeat
clrscr;
reset(f1);
writeln('1-белый 2-чёрный 3-розовый 4-оранжевый');
writeln('1-железо 2-пластик 3-дерево');
i:=0;
while not eof(f1) do begin
i:=i+1;
read(f1,st);
writeln('кубик №',i,' длина=',st.dl,' цвет=',st.color,' материал',st.mat);
end;
close(f1);
writeln ('1-',i,' - изменение записи ');
writeln ('0-в меню');
repeat
write ('ваш выбор:');
write (' ');
readln(m);
until (m>=0) and (m<=i);
if m<>0 then
with st do begin
reset(f1);
seek(f1,m-1);
writeln('длина: ');readln(dl);
writeln('цвет : '); readln(color);
writeln('материал :'); readln(mat);
write(f1, st);
end;
until m = 0;
End;[/code]

С точки зрения заданного вопроса (работать напрямую с файлом, не используя массив в оперативной памяти,) ключевой момент тут -- это использование команды seek. Благодаря использованию вами типизированного файла, seek позволяет переходить к любой интересующей записи, т.е. осуществлять произвольный доступ, что является главным достоинством массива. (Разумеетсмя с учётом низкой скорости отдельного обращения.)

Замечания по остальному коду:
1) В процедуре outputdat нет обнуления i перед циклом while. Очевидно должно быть.
2) Перменная i -- глобальная. Лучше объявить её в процедуре. Перменной стоит быть глобальной, если она а) предназначена для передачи данных между подпрограммами, или б) имеет большой размер. А индексы циклов настоятельно рекомендую всегда делать локальными.
3) Опечатка в процедуре transname. Под условием if m=1 у вас стоит Rename(f2,n2). Должно быть, конечно, Rename(f1,n1);
4) Там же под m=2 есть close, а под m=1 -- нет. Вероятно, это какие-то недоделанные изменения.
5) Вообще, мне кажется лучше в каждой процедуре специально открывать нужные файлы, а в конце -- закрывать. Оставлять их открытыми, как, например, в create, не стоит -- источник путаницы и ошибок, а преимуществ почти никаких.

Если есть вопросы или требуется ещё какая-либо переделка, пишите в мини-форум.
Форма ответа