Задача с записями и файлами

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Задача с записями и файлами

Сообщение jmtorr » 23.04.2012 19:11:02

Привет, народ. Помогите с программой.

Есть задача, ее надо решить с помощью записей: На основе записной книжки, содержащей сведения: фамилия, год рождения, адрес (город; улица; номер дома; квартира), место работы (учебы) напечатать список лиц, работающих (учащихся) в КГТУ.

Я ее решаю так: сначала пишу одну программу, которая по запросу заполняет типизированный файл, а потом пишу вторую, которая работает с файлом, считывает и проверяет данные на принадлежность к КГТУ.

Не компилится, выдает ошибку. Даже несколько. Что делать – не знаю, в школе паскаль учил дополнительно, но с записями не работал, дальше строк и многомерных массивов не проходил.

Вроде все сделал по руководствам, но все равно неправильно, BP и FPC выдают разные ошибки.

Программа ввода
Код: Выделить всё
type

data = record
surname:string;
year: integer;
city:string;
street:string;
numhouse:integer;
flat:integer;
work:string;
end;

var f:file;
n,i:integer;

begin
write('Сколько записей нужно ввести? ');
readln(n);
assign(f,'zapis.dat');
append(f);
{тут FPC требует либо тип файла text, либо заменить на rewrite, BP с ним солидарен, хотя мне нужен именно такой ход действий, т.е., чтоб вайлом до посинения можно было загонять данные и все были довольны. Как это переписать?}
for i:=1 to n do
with data do
{BP тут зачем-то хочет скобочку “(”, FPC спотыкается дальше}
  begin
  write('Введите фамилию ');
  readln(data.surname);
{здесь, и на дальнейших “data.переменная” говорит “Variable Identifer expected”. Что бы это значило и как это исправить? BP до сюда просто не доходит}
{если убрать “with data do” то BP ставит курсор после data и перед точкой, т.е. “data_.surname” и там просит злосчастную скобочку, FPC пофигу, он по-прежнему хочет свой “Variable identifer”. Есть мнение, что я просто как-то не так обозначил типизированный файл, но все делал по инструкции и перепроверял}
  write('Введите год рождения ');
  readln(data.year);
  write('Введите город ');
  readln(data.city);
  write('Введите улицу ');
  readln(data.street);
  write('Введите номер дома ');
  readln(data.numhouse);
  write('Введите номер квартиры ');
  readln(data.flat);
  write('Введите место работы/учебы ');
  readln(data.work);
  Blockwrite(f,data,8240);
  end;
close(f);
end.


Программа вывода
Код: Выделить всё
type

data = record
surname:string;
year: integer;
city:string;
street:string;
numhouse:integer;
flat:integer;
work:string;
end;


var f:file;

begin
assign(f,'zapis');
reset(f);

while not EOF(f) do
  begin
  Blockread(f,data,8240);
{FPC тут спотыкается, ждет любимый “Variable Identifer”, т.е., как я понимаю, он не может тупо считать пачку переменных, объединенных одной общей записью. Если может, как это сделать?}
{BP тупо опять просит скобку}
  if (data.work='КГТУ') or (data.work='кгту') or (data.work='Кгту') then
   begin
   writeln(con,'Фамилия: ',data.surname);
{Здесь и далее ему не нравится con, т.е. вывод на консоль, говорит, что не знает такой переменной. Сделал так, чтоб не путался с файлом, на всякий случай, от излишней паранойности. В принципе, она ничего не меняет, если ее убрать, то FPC больше ни на что не жалуется}
   writeln(con,' Год рождения: ',data.year);
   writeln(con,' Город: ',data.city);
   writeln(con,' Улица: ',data.street);
   writeln(con,' Номер дома: ',data.numhouse);
   writeln(con,' Номер квартиры: ',data.flat);
   writeln(con,' Место работы/учебы: ',data.work);
   writeln(con);
   writeln(con);
   end;
  end;

close(f);
readln;
end.


Как я понял, я как-то неправильно описываю переменные в записях. Что я делаю не так? Вроде все по инструкциям.

P.S. Я только проблему описывал полчаса где-то. После всего головняка вообще охото тупо решить задачу строками и проверять последние 4 символа.
jmtorr
незнакомец
 
Сообщения: 2
Зарегистрирован: 23.04.2012 18:06:13

Re: Задача с записями и файлами

Сообщение Ism » 23.04.2012 19:55:25

Выложи проект и надейся
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Задача с записями и файлами

Сообщение Mr.Smart » 23.04.2012 20:55:16

Код: Выделить всё
type

data = packed record
surname:shortstring;
year: integer;
city:shortstring;
street:shortstring;
numhouse:integer;
flat:integer;
work:shortstring;
end;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Задача с записями и файлами

Сообщение Oleg_D » 23.04.2012 22:20:28

with data do ... <-- data - это тип данных, а не переменная!
Попробуйте так:
Код: Выделить всё
type

TData = record
surname:shortstring;
year: integer;
city:shortstring;
street:shortstring;
numhouse:integer;
flat:integer;
work:shortstring;
end;

var F: file of TData
    Data : TData

ну и т.д.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Задача с записями и файлами

Сообщение jmtorr » 24.04.2012 14:17:51

если кому надо, то вот решенная

Код: Выделить всё
type

tdata = record
surname:shortstring;
year: integer;
city:shortstring;
street:shortstring;
numhouse:integer;
flat:integer;
work:shortstring;
end;

var f:file of tdata;
n,i:integer;
data:tdata;

begin
write('Сколько записей нужно ввести? ');
readln(n);
assign(f,'zapis.dat'); {$I-}
reset(f);              {$S+}
if ioresult<>0 then rewrite(f);
for i:=1 to n do
  begin
  write('Введите фамилию ');
  readln(data.surname);
  write(' Введите год рождения ');
  readln(data.year);
  write(' Введите город ');
  readln(data.city);
  write(' Введите улицу ');
  readln(data.street);
  write(' Введите номер дома ');
  readln(data.numhouse);
  write(' Введите номер квартиры ');
  readln(data.flat);
  write(' Введите место работы/учебы ');
  readln(data.work);
  writeln;
  write(f,data);
  end;
close(f);
end.


Код: Выделить всё
type

tdata = record
surname:shortstring;
year: integer;
city:shortstring;
street:shortstring;
numhouse:integer;
flat:integer;
work:shortstring;
end;


var f:file of tdata;
data:tdata;
i:integer;

begin
assign(f,'zapis.dat');  {$I-}
reset(f);               {$S+}
if ioresult<>0 then writeln('Нет файла')
else begin
for i:=0 to filesize(f) do
  begin
  seek(f,i);
  read(f,data);
  if (data.work='КГТУ') or (data.work='кгту') or (data.work='Кгту') then
   begin
   writeln('Фамилия: ',data.surname);
   writeln(' Год рождения: ',data.year);
   writeln(' Город: ',data.city);
   writeln(' Улица: ',data.street);
   writeln(' Номер дома: ',data.numhouse);
   writeln(' Номер квартиры: ',data.flat);
   writeln(' Место работы/учебы: ',data.work);
   writeln;
   writeln;
   end;
  end;

close(f);
end;
readln;
end.
jmtorr
незнакомец
 
Сообщения: 2
Зарегистрирован: 23.04.2012 18:06:13


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru