Есть задача, ее надо решить с помощью записей: На основе записной книжки, содержащей сведения: фамилия, год рождения, адрес (город; улица; номер дома; квартира), место работы (учебы) напечатать список лиц, работающих (учащихся) в КГТУ.
Я ее решаю так: сначала пишу одну программу, которая по запросу заполняет типизированный файл, а потом пишу вторую, которая работает с файлом, считывает и проверяет данные на принадлежность к КГТУ.
Не компилится, выдает ошибку. Даже несколько. Что делать – не знаю, в школе паскаль учил дополнительно, но с записями не работал, дальше строк и многомерных массивов не проходил.
Вроде все сделал по руководствам, но все равно неправильно, 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 символа.