Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача с записями и файлами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
jmtorr
Привет, народ. Помогите с программой.

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

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

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

Вроде все сделал по руководствам, но все равно неправильно, 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
если кому надо, то вот решенная

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.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.