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

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

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

 
 Ответить  Открыть новую тему 
> Записи с вариантами, Обращение к вариантному полю.
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Вопрос такой- каким еще способом можно осуществить вывод на экран записей с определенным признаком (с тем вариантным полем, которое нас интересует).
Ну, в принципе, способ - то один: обратиться к полю-селектору, и в соответствии с его значением сделать то или иное действие. А вот обертка у этого действия может быть самой разной. Если тебе надо как можно проще - то просто не делаешь обертку совсем, что у тебя и написано - делается все напрямую.

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

Если надо - скажи, покажу КАК это сделать. smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

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

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


rolleyes.gif Конечно хочу...Буду рада поучиться...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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


Пионер
**

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

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


good.gif Я вот подумала,что мой способ тоже неплох, хотя бы тем что короток rolleyes.gif
Но все равно спасибо, попробую поиграться и таким способом))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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