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

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

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

> Задача с записями и файлами, не проходите мимо, подробно расписанная задача, заглядение просто
jmtorr
сообщение 23.04.2012 18:02
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 1)
jmtorr
сообщение 24.04.2012 13:18
Сообщение #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

 



- Текстовая версия 1.07.2025 11:04
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"