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

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

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

> Записи с вариантами, Обращение к вариантному полю.
-=АнЮтА=-
сообщение 18.02.2007 13:35
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 55
Пол: Женский
Реальное имя: АнЯ

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


В общем есть такая программка, в типизированный файл заносит определенное количество вариантных записей, при чем вариантные поля у каждой записи могут быть различны. За тем вторая процедура считывает из файла данные по определенному (заданному пользователем) признаку. Обращение идет через поле признака (значение 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 18.02.2007 14:37
Сообщение #2


Гость






Ну, тогда смотри... Вот что нужно добавить (естественно, после описания типа 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;
А теперь скажи, что будет проще отлаживать, и где легче разобраться?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



- Текстовая версия 20.07.2025 18:31
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"