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

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

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

 
 Ответить  Открыть новую тему 
> Задача с записями и файлами, не проходите мимо, подробно расписанная задача, заглядение просто
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

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


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

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

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

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

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





Группа: Пользователи
Сообщений: 2
Пол: Мужской

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


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

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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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