Помощь - Поиск - Пользователи - Календарь
Полная версия: Записи с вариантами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-=АнЮтА=-
В общем есть такая программка, в типизированный файл заносит определенное количество вариантных записей, при чем вариантные поля у каждой записи могут быть различны. За тем вторая процедура считывает из файла данные по определенному (заданному пользователем) признаку. Обращение идет через поле признака (значение 1 или 2 в операторе выбора case). Вопрос такой- каким еще способом можно осуществить вывод на экран записей с определенным признаком (с тем вариантным полем, которое нас интересует). Предполагаю - что мой способ самый простой.
Заранее спасибо)) rolleyes.gif

Program failo_reco;
Uses crt;
Type rec=record
A:real;
B:integer;
case c:integer of
1: (as:string);
2: (bs:char;cs:string);
end;
var r:rec;
f:file of rec;
n,i:integer;
q:char;
Procedure vvod_v_fail;
begin
assign(f,'1.dat');
rewrite(f);
for i:=1 to 5 do
begin
clrscr;
with r do
begin
writeln('Введите вещественное значение '); readln (a);
writeln('Введите целое значение '); readln (b);
writeln('Выберите 1 или 2'); readln©;
case c of
1:begin writeln('Введите строку ');
readln (as); end;
2: begin
writeln('Введите символ '); readln (bs);
writeln('Введите строку '); readln (cs); end;
end; {конец case}
write(f,r);
end;
end;
close(f);
end;
Procedure read_po_priz;
begin
clrscr;
writeln('Выберите 1 или 2');
readln(n);
assign(f,'1.dat');
reset(f);
for i:=1 to filesize(f) do begin
read (f,r);
if r.c = n then begin
with r do
begin
write(' a=',a:2:2);
write(' b=',b);
case c of
1: write(' as=',as);
2: begin write(' bs=',bs);write(' cs=',cs);end;
end;
writeln;
end;
end;
end;
end;

Begin

clrscr;
q:=readkey;
case q of
'1': vvod_v_fail;
'2': read_po_priz;
end;
end.
volvo
Цитата
Вопрос такой- каким еще способом можно осуществить вывод на экран записей с определенным признаком (с тем вариантным полем, которое нас интересует).
Ну, в принципе, способ - то один: обратиться к полю-селектору, и в соответствии с его значением сделать то или иное действие. А вот обертка у этого действия может быть самой разной. Если тебе надо как можно проще - то просто не делаешь обертку совсем, что у тебя и написано - делается все напрямую.

Если чуть-чуть пошаманить - можно задействовать процедурные типы, тогда придется в программу кое-что добавить, но обработка в зависимости от селектора будет вообще в одну строку...

Если надо - скажи, покажу КАК это сделать. smile.gif
-=АнЮтА=-
rolleyes.gif Конечно хочу...Буду рада поучиться...
volvo
Ну, тогда смотри... Вот что нужно добавить (естественно, после описания типа Rec):
{ Это будет вызываться в случае Селектор = 1 }
procedure PrintFirst(const R: Rec); Far;
begin
write(' as = ', R.as);
end;
{ Это будет вызываться в случае Селектор = 2 }
procedure PrintSecond(const R: Rec); Far;
begin
write(' bs = ', R.bs, ' cs = ', R.cs);
end;

{ Вот он - процедурный тип }
type
Proc = procedure(const R: Rec);
const
SelectProc: array[1 .. 2] of proc = (
PrintFirst, PrintSecond
);

procedure PrintRec(const R: Rec);
begin
with R do begin
write(' a = ', a:2:2, ' b = ', b);
SelectProc[c]( R );
end;
writeln;
end;

и с учетом вышесказанного вот такой кусок:
      for i:=1 to filesize(f) do begin
read (f,r);
if r.c = n then begin
with r do begin
write(' a=',a:2:2);
write(' b=',b);
case c of
1: write(' as=',as);
2: begin write(' bs=',bs);write(' cs=',cs);end;
end;
writeln;
end;
end;
end;

плавно превращается вот в это:
  for i:=1 to filesize(f) do begin
read (f,r);
if r.c = n then PrintRec( r );
end;
А теперь скажи, что будет проще отлаживать, и где легче разобраться?
-=АнЮтА=-
good.gif Я вот подумала,что мой способ тоже неплох, хотя бы тем что короток rolleyes.gif
Но все равно спасибо, попробую поиграться и таким способом))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.