Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 23:41   #1
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию процедуры, записи

Код:
program lab_9;

type
  r = record
    l: string[6];
    n: string[9];
  end;

type
  rec = array [1..100] of r;  

var
  f: text;
  m: rec;

procedure vvod(x: rec; k: integer);
var
  i: integer;
begin
  assign(f, 'dan9.txt');
  reset(f);
  for i := 1 to k do 
    with x[i] do
      readln(f, l, n);  
  close(f);   
end;

procedure vyvod(x: rec; k: integer);
var
  i: integer;
begin
  writeln('Предприятия с телефоном на 155:');
  for i := 1 to k do
    with x[i] do
      if copy(n, 1, 3) = '155' then writeln(l);
  writeln('Предприятия с телефоном на 141:');
  for i := 1 to k do
      with x[i] do
    if copy(n, 1, 3) = '141' then writeln(l);
end;

begin
  vvod(m, 16);  
  vyvod(m, 16);
end.
программа компилируется... но не заполняет record из файла.
пробовал через точку. напр
Код:
readln(f, x.l, x.n);
тогда выбивает ошибку.

стоит заменить на
Код:
    with m[i] do
      readln(f, l, n);
программа работает как надо.

я так понял что в процедуре надо обращаться к записи подругому... или я что-то с типами накосячил?

Последний раз редактировалось unbanned; 11.04.2011 в 17:19.
unbanned вне форума Ответить с цитированием
Старый 11.04.2011, 09:26   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1)
Цитата:
Код:
var
  f: text;
зачем?! Чем Вам типизированный файл не угодил? Он же для этого и был придуман:
Код:
 var f : file of r;
2) если же с текстовым файлом работаете, тогда в каждой строке должно быть
ровно 6 символов, которые пойдут в l и ровно 9 символов — для n
пробелы, точки, табуляция - это всё тоже считаются как символы...

3)
Цитата:
Код:
readln(f, x.l, x.n);
тогда выбивает ошибку.
правильно. X же типа REC, а это МАССИВ.
нужно так:
Код:
readln(f, x[i].l, x[i].n);
ну и не забудьте добавить VAR перед описанием параметра:
Код:
procedure vvod(var x: rec; k: integer);



ну и ещё. Крайне не рекомендую использовать в процедурах/функциях ту адскую смесь из формальных параметров и глобальных переменных, которая имеется в Вашей программе.
Вообще, старайтесь без лишней надобности глобальные переменные НЕ ИСПОЛЬЗОВАТЬ.

Последний раз редактировалось Serge_Bliznykov; 11.04.2011 в 09:33.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.04.2011, 16:30   #3
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Цитата:
Вообще, старайтесь без лишней надобности глобальные переменные НЕ ИСПОЛЬЗОВАТЬ.
что-то я не совсем понял что вы имели ввиду...
ведь, у меня в программе глобальных переменных всего 2
Код:
var
  f: text;
  m: rec;
и в процедурах я к ним не обращаюсь
unbanned вне форума Ответить с цитированием
Старый 11.04.2011, 16:45   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
var
  f: text;
  m: rec;
и в процедурах я к ним не обращаюсь
Вы уверены в этом?

Цитата:
Код:
procedure vvod(x: rec; k: integer);
var
  i: integer;
begin
  assign(f, 'dan9.txt');
  reset(f);
...
кроме того, а почем Вы решили, что в текстовом файле ровно 16 значащих строк?
разумнее было бы читать их в цикле.. и возвращать в переменную, сколько прочитали реально строк?..

ну и ещё:
Цитата:
Код:
for i := 1 to 10 do
почему до 10 ? опечатка?..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.04.2011, 17:16   #5
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

да, до 10 - опечатка... в текстовом файле 16 строк по заданию.
хм... т.е. сделать так:
Код:
begin
  assign(f, 'dan9.txt');
  reset(f);
  vvod(m,16);
  close(f);
  vyvod(m,16);
end;
Код:
procedure vvod(var x: rec; k: integer);
var
  i: integer;
begin
  for i := 1 to k do 
    with x[i] do
      readln(f, l, n);  
end;

Последний раз редактировалось unbanned; 11.04.2011 в 17:23.
unbanned вне форума Ответить с цитированием
Старый 11.04.2011, 19:15   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
хм... т.е. сделать так:
нет, не логично.
лучше выкинуть var f : text; из глобального описания
и добавить описание в процедуру:
Код:
procedure vvod(var x: rec; k: integer);
var
  f : text;
  i : integer;
begin
  assign(f, 'dan9.txt');
  reset(f);
  for i := 1 to k do 
    with x[i] do
      readln(f, l, n);  
  close(f);   
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.04.2011, 19:23   #7
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

спасибо, учту
unbanned вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
закончить выполнение процедуры из тела другой процедуры Alaysor Общие вопросы Delphi 14 23.01.2011 05:26
Строки, записи и файлы, процедуры функции Gray_Mc Фриланс 8 24.11.2010 16:21
Удаление записи из таблицы с помощю процедуры firebird postaveche БД в Delphi 23 08.09.2010 12:28
Процедуры, паскаль. Записи Nubik Помощь студентам 1 28.03.2010 21:27
[PASCAL] записи с вариантами + процедуры die_hard Помощь студентам 4 22.04.2009 16:43