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

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

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

 
 Ответить  Открыть новую тему 
> типизированные файлы
Athen
сообщение 6.05.2007 13:42
Сообщение #1


Новичок
*

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

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


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

Поисковые признаки: абоненты, имеющие задолженность; год установки до 1980 года.


Начала делать так: ток чет ниче не выходит, кроме шапки таблицы unsure.gif dry.gif

Program zadacha2;
Uses crt;
procedure tabl;
begin
writeln('abonentskaya plata za telefon­');
writeln(' ----------------------------------------------------------------- ');
writeln('| FIO | telefon­ | god | kolichestvo | plata za  |');
writeln('| abonenta  | | ystanovki | abonentov | telefon ­ |');
writeln(' ----------------------------------------------------------------- ');
end;
procedure danzap;
type str=record
FIO:string[30];
tel:longint;
god:integer;
kab:integer;
plt:integer;
end;
const name:string='H:\Program Files\TurboPascal7.1\« Ў  ь4\2.dat';
var p:char;t:str; f:text;
begin
Assign(f,name);
Reset(f);
readln(f,t.FIO,p,t.tel,t.god,t.kab,t.plt);
Close(f);
end;
procedure sozd;
var f:file;
begin
Assign(f,'2.dat');
Rewrite(f);
Close(f);
end;
procedure dop;
var f:text; a:string;
begin
Assign(f,'3.dat');
Append(f);
writeln('dopolnite file');
read(a);
Close(f);
end;
procedure zap;
var f:text; a:string;
begin
Assign(f,'2.dat');
Rewrite(f); Reset(f);
writeln('Vvedite dannue');
readln(f,a);
Close(f);
end;
procedure cht;
var f:text; a,b:string;
begin
Assign(f,'2.dat');
Reset(f);
Write(f);
close(f);
end;
Var f:text; a:string;
Begin
Clrscr;
tabl;
danzap;
sozd;
dop;
zap;
cht;
readln;
End.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 6.05.2007 14:05
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


ну, во-первых, по-моему, имеет смысл сделать тип str доступным по все программе, а не только в danzap
далее
Цитата
Для вывода шапки таблицы;

это ты сделала
Цитата
Для вывода данных одной записи;

procedure danzap;
const name:string='H:\Program Files\TurboPascal7.1\« Ў ь4\2.dat';
var p:char;t:str; f: file of str;
begin
Assign(f,name);
Reset(f);
read(f,t);
write(t.FIO,' ',t.tel); {здесь же можешь вывести и остальные поля - просто не стала набирать их}
Close(f);
end;

Но в таком виде она всегда будет выводить первую запись.
На мой взгляд, это бессмысленно. Логичнее открытывать файл, а потом вызывать эту процедуру - можно не один раз.

Цитата
Для создания файла;

Ты сделала.

Цитата
Для дополнения файла новыми записями;

А зачем ты делаешь а строкой?! Файл же типизированный, пишем в него записи. Вот с записями и работай.
Только не забывай перемещать указатель в конец файл с помощью seek - а то запишешь поверх другой записи.

..продолжение следует.
пока разберись с этим


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Athen
сообщение 6.05.2007 17:48
Сообщение #3


Новичок
*

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

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


Спасибо за ответ!
Я кое-что исправила
procedure zap;
var f:text; a:str; p:char;
begin
Assign(f,'2.dat');
Rewrite(f); Reset(f);
p:=' ';
writeln('Vvedite dannue');
read(a.FIO,p,a.tel,p,a.god,p,a.kab,p,a.plt);
Close(f);
end;


procedure danzap;
var p:char;t:str; f:text;
begin
Assign(f,'2.dat');
Reset(f); p:=' ';
read(f,t.FIO,p,t.tel,p,t.god,p,t.kab,p,t.plt);
write(t.FIO,p,t.tel,p,t.god,p,t.kab,p,t.plt);
Close(f);
end;

Пришлось в read перечислить все записи, иначе выдает ошибку.

Но похоже заполнение программа не принимает, потому что выходят стрелки и нули.

насчет seek... написала так: seek(f,filesize(f)). Но пишет, что файловый тип не правильный.

Переделала чтение файла:
procedure cht;
var f:text; a,b:str; p:char;
begin
Assign(f,'2.dat');
Reset(f);
p:=' ';
Repeat
Read(f,a.FIO,p,a.tel,p,a.god,p,a.kab,p,a.plt);
write(a.FIO,p,a.tel,p,a.god,p,a.kab,p,a.plt);
until Eof(f);
close(f);
end;

Вроде бы правильно читает
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tan
сообщение 6.05.2007 18:03
Сообщение #4


Профи
****

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

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


f : file of str, если ты работаешь с записями в файле.


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Athen
сообщение 6.05.2007 18:47
Сообщение #5


Новичок
*

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

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


Цитата(Tan @ 6.05.2007 21:03) *

f : file of str, если ты работаешь с записями в файле.


Тогда он в Append(f) пишет, что не правильный формат...
Файл же состоит не только из записей, но и из пробелов
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.05.2007 18:57
Сообщение #6


Гость






Цитата
Тогда он в Append(f) пишет, что не правильный формат...
Проблема не в этом... Проблема здесь - в том, что Append вообще неприменима к типизированному файлу - только к текстовому...

Зачем вообще Append? Все и без него прекрасно реализуется:
Seek(f, FileSize(f));

и следующая операция Write(f, ...) запишет компоненту в конец файла...

Сообщение отредактировано: volvo - 6.05.2007 18:59
 К началу страницы 
+ Ответить 
Tan
сообщение 6.05.2007 18:59
Сообщение #7


Профи
****

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

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


Если задание на типизированные файла, то в твоём случае там должны быть только записи, зачем пробелы ? Ты должен читать всю запись сразу, а не пытаться прочитать её поле определённого типа, то есть нельзя просто не обратившись к записи читать что - то другое (на будущее).

Сообщение отредактировано: Tan - 6.05.2007 19:13


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Athen
сообщение 7.05.2007 14:47
Сообщение #8


Новичок
*

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

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


А теперь выдает ошибку чтения диска...
procedure cht;
var f:file of str; a,b:str; p:char;
begin
Assign(f,'2.dat');
Reset(f);
p:=' ';
Repeat
Read(f,a);
write(f,a);
until Eof(f);
close(f);
end;

А когда начинаешь дополнять запись, то вместо фамилии запришивает номер
уфф.... да уж...

Сообщение отредактировано: Athen - 7.05.2007 14:48
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 7.05.2007 19:09
Сообщение #9


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


Цитата
Read(f,a);
write(f,a);

это что за деятельность? считали запись и сразу пишем ее на место следующей?
а зачем?
так с eof неизвестно что будет твориться...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Athen
сообщение 9.05.2007 9:10
Сообщение #10


Новичок
*

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

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


Я пытаюсь разобраться, даже что-то уже получается, только вот не могу понять чем ему не нравится
read(f,a);
пишет: Error 100: Disk read error.
По книжке хорошей посмотрела, там тоже так же написано: read(f,z); z-тоже запись
странно...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 9.05.2007 14:21
Сообщение #11


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


Возможно, файл не открыт.
Или ты читала-читала, а он закончился.

Если ты про эту процедуру - обрати внимание на мое прошлое замечание.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Athen
сообщение 9.05.2007 18:41
Сообщение #12


Новичок
*

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

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


Цитата(мисс_граффити @ 9.05.2007 17:21) *

Возможно, файл не открыт.
Или ты читала-читала, а он закончился.

Если ты про эту процедуру - обрати внимание на мое прошлое замечание.

Да, я исправила это...
когда я заполняю файл, после последнего ввода, как нажимаю Enter, сразу прога заканчивается и выдает ошибку чтения диска.... никак не могу исправить
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 9.05.2007 19:16
Сообщение #13


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


выложи, как на данный момент выглядит твоя прога. можно прикрепить pas-файл


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Athen
сообщение 9.05.2007 19:53
Сообщение #14


Новичок
*

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

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


Вот: вроде с диском исправила, осталось только поправить косяки с процедурой modif и понять, почему если вводишь не 1 запись, а две, то читает только последнюю!


Прикрепленные файлы
Прикрепленный файл  999попытка.pas ( 4.12 килобайт ) Кол-во скачиваний: 230
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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