Помощь - Поиск - Пользователи - Календарь
Полная версия: Записи с вариантами
Форум «Всё о Паскале» > 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(c);
          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
Но все равно спасибо, попробую поиграться и таким способом))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.