Консультация № 178560
22.05.2010, 16:20
45.00 руб.
0 25 1
Добрый день,уважаемые эксперты!!!!
Помогите пожалуйста сделать задачу на тему:"типизированные файлы"
файл с инструкцией, что необходимо сделать: https://rfpro.ru/upload/2462
https://rfpro.ru/upload/2461 -это индивидуальное задание(оно рабочее) на основе которого нужно сделать задание по файлам

будет запускаться на pascal abc
Прошу,пожалуйста помогите!
С уважением!



Обсуждение

давно
Академик
320937
2216
23.05.2010, 00:28
общий
angel.nero:
Добрый вечер! Не смог скачать ни один из файлов.
Неизвестный
23.05.2010, 02:29
общий
lamed:
Добрый вечер!Вот обновил ссылки через сайт,теперь в одном архиве и инструкция и задание на основе которого нужно сделать(файл .pas)
https://rfpro.ru/upload/2464 (если через сайт -пароль 0000) или http://depositfiles.com/files/846w3rs04,если не получится могу прям в мини форум написать
давно
Академик
320937
2216
23.05.2010, 08:16
общий
angel.nero:
Доброе утро! Увы, не получается. Если не затруднит - в мини-форум.
Неизвестный
23.05.2010, 11:24
общий
lamed:
Добрый день!Странно,а через депозит тоже не качается????
вот инструкция,которую нам дали в универе:
Задание по теме «Типизированные файлы»
по курсу «Компьютерные науки»

1 Введение
Необходимо реализовать хранение базы данных (структура и содержание хра-
нимой информации в базе уточняются для каждого индивидуального задания
отдельно) в типизированном файле, а также её обработку.
2 Структура данных
Для хранения информации необходимо использовать типизированные файлы,
элементами которых являются записи (record).
Пример (описание типа файла):
type
TStudent = record { информация о студенте }
SName: string; { имя }
NCourse, NGroup: Integer; { курс , группа }
AMarks: array [1 .. 5] of Integer; { оценки в сессии }
end;
TStudents = file of TStudent; { файл сведений }

3 Основные операции
При запуске программы необходимо открыть существующий на диске файл
данных на чтение/запись. Если файл открыть не удалось, необходимо открыть
его с созданием. Например, в системе Turbo Pascal 5.5 данные действия можно
выполнить при помощи следующих операторов:
{$I??}
Assign(F, ’students.bin’);
Reset(F);
if IOResult <> 0 then
Rewrite(F);

По окончании работы программы необходимо закрыть файл:
Close(F);
После открытия файла необходимо организовать цикл с выводом на экран
меню, предлагающее пользователю следующие действия:
Просмотр информации: вывод на экран или в заданный текстовый файл
данных в виде таблицы. Данные должны быть упорядочены по одному из
трёх возможных признаков (например, по фамилии, по номеру курса или
по среднему баллу).
Пример (вывод данных в виде таблицы):
????????????????????????????????????????????????????????????????????????????????????
| Имя | Курс | Группа | Оценки |
????????????????????????????????????????????????????????????????????????????????????
| Иванов | 1 | 2 | 5 5 4 3 4 |
| Петров | 2 | 3 | 4 4 3 4 5 |
| Сидоров | 1 | 4 | 3 3 4 3 4 |
????????????????????????????????????????????????????????????????????????????????????

Добавление новой записи: добавление новой строки к таблице.
Удаление существующей записи: удаление записи с заданным номером
(например) или с заданным значением определённого поля (по фамилии
и т. п.)
Выход: Выход из цикла обработки команд меню и завершение программы
(с закрытием файла).
4 Детали реализации
4.1 Реализация упорядоченного вывода данных из файла
Для вывода данных из файла, упорядоченных по любому из трёх признаков,
необходимо использовать три индексных массива, хранящих позиции (FilePos)
внутри файла. Все три массива должны строиться одновременно. Перестройка
индексных массивов должна производиться в следующие моменты:
 после открытия файла в начале работы программы;
 после каждого изменения (добавления/удаления информации) содержи-
мого файла.
Внимание: во все остальные моменты перестройка индексных фай-
лов производиться не должна.

4.2 Реализация построения индексных массивов
Для каждого из массивов необходимо вызывать процедуру сортировки,
внутри которой вначале необходимо проинициализировать массив значения-
ми f0; 1; : : :g.
Процедуре сортировки необходимо передавать следующие параметры:
 формируемый массив индексов;
 критерий сортировки: функцию, принимающую в качестве параметров
две записи и возвращающую значение типа Boolean.
Функция-критерий сортировки (функция сравнения) должна возвращать
значение True в случае, если первая запись-параметр является «больше» вто-
рой. В программе необходимо описать три таких функции.
Пример (функции сравнения):
Для упорядоченности базы данных студентов можно описать три функции:
 первая будет возвращать True, если в первой записи, передаваемой ей в ка-
честве параметра, фамилия будет больше, чем во второй;
 вторая функция будет возвращать True, если в первой записи, передавае-
мой ей в качестве параметра, номер курса будет больше, чем во второй;
 и т. д. 
Внутри процедуры сортировки вызов функции-параметра будет заменять
использование операции «>», применяемой при сортировке обычных чисел.
Для построения всех трёх индексных массивов сразу необходимо описать
процедуру, вызывающую процедуру сортировки три раза—с разными масси-
вами и функциями сравнения в качестве параметров.
4.3 Реализация добавления новой записи
Вновь добавляемая запись должна дописываться в конец файла. После этого
необходима перестройка индексных массивов.
4.4 Реализация удаления записи
На место удаляемой записи необходимо переписать содержимое последней за-
писи файла. После этого необходимо перейти на последнюю запись и вызвать
стандартную процедуру Turbo Pascal Truncate, удаляющую содержимое файла
от текущей позиции до конца.
После выполнение данной процедуры необходима перестройка индексных
массивов.

4.5 Реализация вывода данных
Для единообразного вывода данных на экран либо в текстовый файл необходи-
мо воспользоваться следующей особенностью системы Turbo Pascal: если свя-
зать текстовый файл с пустой строкой при помощи процедуры Assign и затем
открыть его на запись (при помощи Rewrite), то вывод данных в такой файл
приведёт к их распечатке на экране.
для упорядочения выводимых данных необходимо использовать один из
трёх индексных массивов. Перед началом процедуры вывода перестраивать ин-
дексные массивы недопустимо.
Неизвестный
23.05.2010, 11:31
общий
lamed:
И сама прога(код),на основе которого нужно сделать задание по файлам:

const
nm = 3;

type
oneinfo = record
name: string[20];
nomerd: real;
nomerkv:integer;
floor:integer;//этаж
end;
tkey = (kname, knomerd, knomerkv, kfloor);
base = array [1..nm] of oneinfo;

var
b: base;
a: base;
y, m, k, n: integer;
nb: integer;
key: tkey;
ssmax: oneinfo ;
StreetName: string[20];

procedure enter(var n: integer; var a: base);
//Процедура ввода
var
i, nomerd, nomerkv: integer;
name: string;

begin
writeln('Ввод базы данных');
writeln('№', 1);
write('Название улицы ');
readln(a[1].name);
n := 1;
while (n<=nm) and (a[n].name <> '*') do
begin
write('номер дома ');
readln(a[n].nomerd);

write('этаж ');
readln(a[n].floor);

write('номер квартиры ');
readln(a[n].nomerkv);
writeln;

n := n + 1;
if n<=nm then
begin
writeln('Название улицы ');
readln(a[n].name);
end
else
begin
writeln('Ввод закончен, мест больше нет');
readln;
end;
end;
n := n - 1;
end;

procedure print(const z: oneinfo);
var
i: integer;
begin
write(z.name);
for i := length(z.name) + 1 to 20 do
write(' ');
with z do
writeln('Название - ', z.name, ';', 'номер дома - ', z.nomerd, ';','Этаж - ',
z.floor, ';', 'номер квартиры - ', z.nomerkv);
end;

procedure print1(n: integer; const a: base);
//Процедура вывода всех записей
var
i: integer;
begin
for i := 1 to n do
print(a[i]);
end;

procedure samax(n: integer; a: base; var k: integer; var smax: oneinfo);
//процедура, определяет запись с наибольшим номером квартиры
var
i: integer;
begin
smax := a[1];
for i := 2 to n do
if a[i].nomerkv > smax.nomerkv then
begin
smax := a[i];
end;
end;

procedure StreetFilter(
const a: base;
na: integer;
var b: base;
var nb: integer;
const StreetName: string[20]);
var
i: integer;
begin
nb:= 0;
for i:= 1 to na do
if a[i].name = StreetName then
begin
inc(nb);
b[nb] := a[i];
end;
end;

function firstfloor(const a: base; n: integer): integer;
// функцию, определяющую количество жителей первого этажа
var
i: integer;
k: integer;
begin
k := 0;
for i := 1 to n do
if a[i].floor =1 then
inc(k);
FirstFloor:=k;
end;

procedure sort(var a: base; n: integer; key: tkey);
//Процедура сортироки массива записей по каждому полю
var
i, j: integer;
t: boolean;
x: oneinfo;
begin
for i := n downto 2 do
for j := 1 to i - 1 do
begin
case key of
kname : t := a[j].name > a[j + 1].name;
knomerd : t := a[j].nomerd > a[j + 1].nomerd;
knomerkv: t := a[j].nomerkv > a[j + 1].nomerkv;
kfloor : t:=a[j].floor>a[j+1].floor;
end;
if t then
begin
x := a[j];
a[j] := a[j + 1];
a[j + 1] := x;
end;
end;
end;

begin //основная программа
enter(n, a);
writeln('Информация об адресах:');
print1(n, a);

write('Наша улица ');
readln(StreetName);
StreetFilter(a, n, b, nb, StreetName);

writeln;
writeln('По улице ', StreetName);
print1(nb,b);



writeln;
writeln('Наибольший номер квартиры');
writeln;
samax(n, a, k, ssmax);
print(ssmax);
writeln('----------------------------------------------------------');
writeln;
writeln('Cортировка массива записей по каждому полю записей');
writeln;
for key := kname to kfloor do
begin
sort(a, n, key);
write('Сортировка по - ');
case key of
kname : writeln('kname');
knomerd : writeln('knomerd');
knomerkv: writeln('knomerkv');
kfloor : writeln('kfloor');
end;
print1(n, a);
end;
writeln;
writeln('Количество жителей первого этажа = ', firstfloor(a, n));
end.

Т.е. преподаватель сказал что на основе задания по записям,нужно сделать задание по файлам прочитав инструкцию к выполнению
давно
Академик
320937
2216
23.05.2010, 11:56
общий
angel.nero:
Скачал, разбираюсь. С Deposit-ом "не дружит" сеть.
Неизвестный
24.05.2010, 18:36
общий
Boriss:
Прошу ,пожалуйста помогите!
Неизвестный
24.05.2010, 18:37
общий
lamed:
Прошу ,пожалуйста помогите!
давно
Академик
320937
2216
24.05.2010, 19:00
общий
angel.nero:
Добрый вечер! Смогу заняться в среду вечером. У самого сессия начинается 26 мая :)
Неизвестный
25.05.2010, 08:48
общий
lamed:
Доброе утро!
Буду с нетерпением ждать!
давно
Академик
320937
2216
26.05.2010, 08:11
общий
angel.nero:
Добрый день! Требуются уточнения. Что означает фраза
И сама прога(код),на основе которого нужно сделать задание по файлам:

(* Я ее помню, мы ее разбирали в личной почте. *). Она никакого отношения к файлам не имеет. Или из нее требуется взять только структуру записи и задание?
Неизвестный
26.05.2010, 18:33
общий
lamed:
Добрый день!
Структура и задание,совершенно верно
давно
Академик
320937
2216
26.05.2010, 19:22
общий
angel.nero:
Добрый вечер! Задание понятно! Сколько реально "терпит"? (* Зачетная неделя идет. *)
Неизвестный
26.05.2010, 19:41
общий
lamed:
завтра надо сдать.... к 5 часам
давно
Академик
320937
2216
26.05.2010, 19:48
общий
angel.nero:
Будет завтра в 16-00.
Неизвестный
26.05.2010, 19:58
общий
lamed:
ок!Буду ждать!Огромнейшее спасибо!
Неизвестный
27.05.2010, 03:04
общий
lamed:
Доброй ночи!
Некоторое уточнение по файлам: В инструкции сказано: "структура и содержание хра-
нимой информации в базе уточняются для каждого индивидуального задания
отдельно) в типизированном файле, а также её обработку" ,а индивидуальное задание- это задание по записям,которое мы с вами разбирали по личной почте,с улицами!

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

[code]{Определите запись для хранения информации об адресе проживания: название улицы, номер дома, номер квартиры, этаж.
Напишите
– процедуру вывода одной записи print,
– процедуру вывода массива записей print1,
– процедуру ввода массива записей enter,
– процедуру, определяющую запись с наибольшим номером квартиры среди всех адресов населённого пункта (соответствующая запись должна быть выходным параметром процедуры),
– процедуру формирования по заданному массиву записей нового массива, содержащего адреса с названием заданной улицы,
– функцию, определяющую количество жителей первого этажа,
– процедуру сортировки массива записей по каждому полю записи.
Напишите клиентскую программу, содержащую вызов всех процедур и функций
}

type
street = record
name: string[20];
nomerd: integer;
nomerkv:integer;
floor:integer;
end;
type
streets = array [1..100000] of street;
tkey = (kname, knomerd, knomerkv, kfloor);

procedure Print(k: integer; const a: streets; n:integer);
begin
if k<=n then
with a[k] do
begin
Writeln('| ', name:20, ' 32| ', nomerd:6, ' | ', nomerkv:3, ' |', floor:3, ' |');
end
else
writeln('Такой записи нет');
end;

procedure Print1(const a: streets; n: integer);
begin
for var i := 1 to n do
Print(i, a, n)
end;

procedure Enter(var a: streets; var n: integer);
var i:integer;
begin
write('Сколько улиц: ');
readln(n);

for i := 1 to n do
begin
write('Название улицы: ');
readln(a[i].name);
write('Номер дома: ');
readln(a[i].nomerd);
write('Номер квартиры: ');
readln(a[i].nomerkv);
write('Этаж :');
readln(a[i].floor);
end;
end;


{procedure samax(n: integer; a: streets; var k: integer; var smax: street);
//процедура, определяет запись с наибольшим номером квартиры
var
i: integer;
begin
smax := a[1];
for i := 2 to n do
if a[i].nomerkv > smax.nomerkv then
begin
smax := a[i];
end;
end; { samax }
function samax(const a: streets;n:integer;smax:street ):street;
var i:integer;
begin
smax:=a[1];
for i:=2 to n do
if a[i].nomerkv>smax.nomerkv then
begin
smax:=a[i];
end;
samax:=smax;
end;


procedure StreetFilter(const a: streets;var b: streets;na: integer;var nb: integer);
var str:string;
begin
writeln('Введите улицу');
readln(str);
nb:= 0;
for var i:= 1 to na do
if a[i].name = str then
begin
inc(nb);
b[nb] := a[i];
end;

writeln('улицы с наименованием ', str);
print1(b, nb);
end;

function firstfloor(const a: streets; n: integer): integer;
// функцию, определяющую количество жителей первого этажа
var k,i:integer;
begin
if n>0 then
begin
k := 0;
for i := 1 to n do
if a[i].floor =1 then
k:=k+1;
firstfloor:=k;
end
else
writeln('нет жильцов')
end;

procedure sort(var a: streets; n: integer; key: tkey);
//Процедура сортироки массива записей по каждому полю
var
i, j: integer;
t: boolean;
x: street;
begin
for i := n downto 2 do
for j := 1 to i - 1 do
begin
case key of
kname : t := a[j].name > a[j + 1].name;
knomerd : t := a[j].nomerd > a[j + 1].nomerd;
knomerkv: t := a[j].nomerkv > a[j + 1].nomerkv;
kfloor : t:=a[j].floor>a[j+1].floor;
end;
if t then
begin
x := a[j];
a[j] := a[j + 1];
a[j + 1] := x;
end;
end;
end;


var
a,b: streets;
n, l, nb, kk: integer;
c: char;
smax,d:street;
key: tkey;


begin
repeat
writeln('Для выполнения действия введите его числовой код');
writeln('[1] Вывод записи по номеру');
writeln('[2] Вывод всей базы данных');
writeln('[3] Ввод базы данных');
writeln('[4] Формирование базы адресов с заданной улицей');
writeln('[5] Вывод жителей первого этажа');
writeln('[6] Вывод наибольшего номера квартиры');
writeln('[7] сортировка по полям');
readln(kk);

case kk of
1:
begin
writeln('Введите номер элемента в записе');
readln(l);
print(l, a, n);

end;
2:
print1(a, n);
3:
enter(a, n);
4:
StreetFilter(a, b, n, nb);
5:
writeln('количество жителей 1-го этажа:',firstfloor(a,n));
6:
begin
d := samax(a,n,smax);
with d do
begin
Writeln(name, ' ', nomerd, ' ', nomerkv, ' ',floor);
end;
end;

7:
for key := kname to kfloor do
begin
sort(a, n, key);
write('Сортировка по - ');
case key of
kname : writeln('kname');
knomerd : writeln('knomerd');
knomerkv: writeln('knomerkv');
kfloor : writeln('kfloor');
end;
print1(a,n);
end;

end;
write('Продолжать работу с базой? [y/n]:');
readln(c);
until c = 'n'
end.



[code]
давно
Академик
320937
2216
27.05.2010, 09:13
общий
angel.nero:
Добрый день! Постановка в методичке противоречит постановке в решенной задаче. Делаю, что понял. После консультации с преподавателем распишете все подробно, включая меню.
Неизвестный
27.05.2010, 10:11
общий
lamed:
Добрый день!Ок!
давно
Академик
320937
2216
27.05.2010, 14:58
общий
angel.nero:
Добрый день! Конечно, это далековато от желания преподавателя, так как сортировка внутри файла, а не индексацией через массив.
Осталось по-прежнему неясным ТЗ. Проще всего Вам показать это, уточнить сценарий работы у преподавателя и выложить меню в мини-форум. Очень важно выяснить, что делать с фильтрацией. В версии с массивами мы создавали массив B. Здесь предположительно создан файл, а можно просто организовать печать. Проверял на ABC, но, возможно недостаточно. Программа "сырая".
Код:
uses
crt;
const
nm = 100;

type
oneinfo = record
name: string[20];
nomerd: real;
nomerkv:integer;
floor:integer;//этаж
end;
tkey = (kname, knomerd, knomerkv, kfloor);
base = file of oneinfo;

var
b: base; // массив, фильтрованный по названию улицы
a: base;
y, m, k, n: integer;
nb: integer; // число записей в массиве b
key: tkey;
ssmax: oneinfo ;
StreetName: string[20];

procedure enter(var n: integer; var f: base);
//Процедура ввода
var
i, nomerd, nomerkv: integer;
name: string;
rec: oneinfo;

begin
seek(f, filesize(f)); // GoTop()
writeln('Ввод базы данных');
writeln('№', 1);
write('Название улицы ');
readln(rec.name);
while (rec.name <> '*') do
begin
write('номер дома ');
readln(rec.nomerd);

write('этаж ');
readln(rec.floor);

write('номер квартиры ');
readln(rec.nomerkv);
writeln;
write(f, rec);

writeln('Название улицы ');
readln(rec.name);
end;
writeln('Ввод закончен, мест больше нет');
readln;
end;

procedure print(const z: oneinfo);
var
i: integer;
begin
write(z.name);
for i := length(z.name) + 1 to 20 do
write(' ');
with z do
writeln('Название - ', z.name, ';', 'номер дома - ', z.nomerd, ';','Этаж - ',
z.floor, ';', 'номер квартиры - ', z.nomerkv);
end;

procedure print1(var f: base);
//Процедура вывода всех записей
var
i: integer;
rec: oneinfo;
begin
seek(a,0); // GoTop()
while not eof(f) do
begin
read(f, rec);
print(rec);
end;
end;

procedure samax(var f: base; var k: integer; var smax: oneinfo);
//процедура, определяет запись с наибольшим номером квартиры
var
i: integer;
rec: oneinfo;
begin
smax.nomerkv := -MaxInt-1;
seek(f,0); // GoTop();
while not eof(f) do
begin
read(f,rec);
if rec.nomerkv > smax.nomerkv then
smax := rec;
end;
end; { samax }

procedure StreetFilter(
var a: base;
var b: base;
const StreetName: string[20]);
var
i: integer;
rec: oneinfo;
begin
seek(a,0); // a.GoTop();
while not eof(a) do
begin
read(a,rec);
if rec.name = StreetName then
write(b,rec);
end;
end; { StreetFilter }

function firstfloor(var f: base): integer;
// функцию, определяющую количество жителей первого этажа
/// Функция FirstFloor отвечает на вопрос: "Сколько?"
/// В ответ она должна возвращать результат
/// Печатать что-то типа "нет жильцов" - прерогатива той процедуры или
/// главной программы, которой это действие поручена
/// На мой взгляд, FirstFloor не должна уметь печатать
var
k: integer;
rec: oneinfo;
begin
k := 0;
seek(f,0); // GoTop()
while not eof(f) do
begin
read(f,rec);
if rec.floor =1 then
inc(k);
end;
FirstFloor:=k;
end; { FirstFloor }

(*
procedure sort(var a: base; n: integer; key: tkey);
//Процедура сортироки массива записей по каждому полю
var
i, j: integer;
t: boolean;
x: oneinfo;
begin
for i := n downto 2 do
for j := 1 to i - 1 do
begin
case key of
kname : t := a[j].name > a[j + 1].name;
knomerd : t := a[j].nomerd > a[j + 1].nomerd;
knomerkv: t := a[j].nomerkv > a[j + 1].nomerkv;
kfloor : t:=a[j].floor>a[j+1].floor;
end;
if t then
begin
x := a[j];
a[j] := a[j + 1];
a[j + 1] := x;
end;
end;
end; // sort
*)

procedure sort(var f: base; key: tkey);
//// procedure sort(fName: TFileName; SortExpr: TFunc); ////
var
// f: TTable;
i,j,n : integer;
// curr: integer;
rec1, rec2: oneinfo;
t: boolean;
begin
// open(fname, f);
n:= filesize(f);
seek(f,0);
for i:= 0 to n-2 do
for j:= n-1 downto i+1 do begin
seek(f,j-1);
read(f,rec1);
read(f,rec2);

case key of
kname : t := rec1.name > rec2.name;
knomerd : t := rec1.nomerd > rec2.nomerd;
knomerkv: t := rec1.nomerkv > rec2.nomerkv;
kfloor : t := rec1.floor > rec2.floor;
end;

if t then begin
////**** if SortExpr(rec2,rec1) then begin ****////
seek(f,j-1);
write(f,rec2);
write(f,rec1);
end;
end;
// close(f);
end; { sort }

begin //основная программа
Clrscr;
assign(a, 'data.dat');
assign(b, 'filtered.dat');

if FileExists('data.dat') then
reset(a)
else
rewrite(a);

rewrite(b);

enter(n, a);
writeln('Информация об адресах:');
print1(a);
///
write('Наша улица ');
readln(StreetName);
StreetFilter(a, b, StreetName);
(****************)
writeln;
writeln('По улице ', StreetName);
print1(b);
(****************)

///
writeln;
writeln('Наибольший номер квартиры');
writeln;
samax(a, k, ssmax);
print(ssmax);
writeln('----------------------------------------------------------');
writeln;
writeln('Cортировка массива записей по каждому полю записей');
writeln;
for key := kname to kfloor do
begin
sort(a, key);
write('Сортировка по - ');
case key of
kname : writeln('kname');
knomerd : writeln('knomerd');
knomerkv: writeln('knomerkv');
kfloor : writeln('kfloor');
end; { case }
print1(a);
end;
writeln;
writeln('Количество жителей первого этажа = ', firstfloor(a));
close(a);
close(b);
end.

Неизвестный
27.05.2010, 23:31
общий
lamed:
Доброй ночи!
нужно сделать примерно так:(пример,только для другого примера по записям,инструкция остается таже для задания по файлам ) вот для записей,для неё прога по файлам,которая должна у нас получиться:
Код:
{Определите запись для хранения информации о книге в библиотеке: название, количество страниц, год издания.
Опишите процедуру вывода одной записи (Print).
Сформируйте массив записей с информацией о всех книгах некоторой библиотеки.
Опишите процедуру вывода массива записей.
Напишите процедуру, определяющую книгу с наибольшим количеством страниц среди всех книг библиотеки. Соответствующая этой книге запись должна быть выходным параметром процедуры.
Напишите функцию, определяющую среднее количество страниц в книге среди всех книг библиотеки.
По заданному массиву записей сформируйте массив, содержащий книги, изданные позднее заданного года.
}

const ARRAY_SIZE = 100;
type
Books = record
NameBook: string[20];
PageCount: integer;
YearEdition: integer;
end;
var
PersonFile: file of Books;
NewFile: file of Books;
NewFile1: file of Books;
Book: Books;
a: integer;
procedure Fill;
var
i: integer;
BookCount: integer;
begin
write('Введите кол-во книг: ');
readln(BookCount);
assign(PersonFile, 'PersonFile.txt');
Rewrite(PersonFile);
for i := 1 to BookCount do
begin
with Book do
begin
write('Введите имя книги: ');
readln(NameBook);
write('Введите кол-во страниц: ');
readln(PageCount);
write('Введите дату выпуска: ');
readln(YearEdition);
end;
write(PersonFile, Book);
end;
close(PersonFile);
writeln;
end;
procedure Print;
var
i: integer;
book: books;
begin
write('Введите номер книги: ');
readln(i);
assign(PersonFile, 'PersonFile.txt');
reset(PersonFile);
seek(PersonFile, i-1);
read(PersonFile, book);
with Book do
begin
writeln('Имя книги: ',NameBook);
writeln('Кол-во страниц: ',PageCount);
writeln('Дата выпуска: ',YearEdition);
writeln;
end;
close(PersonFile);
end;
procedure FullPrint;
var
i: integer;
Book: books;
begin
assign(PersonFile, 'PersonFile.txt');
reset(PersonFile);
for i := FileSize(PersonFile)-1 downto 0 do
begin
seek(PersonFile, i);
read(PersonFile, Book);
with Book do
begin
writeln('Имя книги: ',NameBook);
writeln('Кол-во страниц: ',PageCount);
writeln('Дата выпуска: ',YearEdition);
end;
end;
close(PersonFile);
writeln;
end;
procedure MaxPage;
var
i: integer;
Book: books;
BookMaxPage: books;
MaxPage: integer;
begin
i := 0;
MaxPage := 0;
assign(PersonFile, 'PersonFile.txt');
reset(PersonFile);
for i := FileSize(PersonFile)-1 downto 0 do
begin
seek(PersonFile, i);
read(PersonFile, Book);
if Book.PageCount > MaxPage then
begin
with book do
begin
BookMaxPage.NameBook := NameBook;
BookMaxPage.PageCount := PageCount;
BookMaxPage.YearEdition := YearEdition;
end;
MaxPage := Book.PageCount;
end;
end;
with BookMaxPage do
begin
writeln('Книга с максимальным кол-вом страниц: ');
writeln('Имя книги: ', NameBook);
writeln('Кол-во страниц: ', PageCount);
writeln('Дата выпуска: ', YearEdition);
end;
close(PersonFile);
writeln;
end;
function AverageValue: real;
var
i: integer;
a: integer;
book: books;
begin
assign(PersonFile, 'PersonFile.txt');
reset(PersonFile);
for i := FileSize(PersonFile)-1 downto 0 do
begin
seek(PersonFile, i);
read(PersonFile, book);
a := a + Book.PageCount;
end;
result := a / FileSize(PersonFile);
end;
procedure BooksNewFile;
var
year: integer;
i: integer;
book: books;
begin
write('Введите год: ');
readln(year);
assign(PersonFile, 'PersonFile.txt');
reset(PersonFile);
assign(NewFile, 'NewFile.txt');
rewrite(NewFile);
for i := FileSize(PersonFile)-1 downto 0 do
begin
seek(PersonFile, i);
read(PersonFile, book);
if book.YearEdition > year then
write(NewFile, book);
end;
end;
procedure PrintNewFile;
var
i: integer;
Book: books;
begin
assign(NewFile, 'NewFile.txt');
reset(NewFile);
for i := FileSize(NewFile)-1 downto 0 do
begin
seek(NewFile, i);
read(NewFile, Book);
with Book do
begin
writeln('Имя книги: ',NameBook);
writeln('Кол-во страниц: ',PageCount);
writeln('Дата выпуска: ',YearEdition);
end;
end;
close(NewFile);
writeln;
end;
procedure Del;
var
a: integer;
book: books;
name: string;
page: integer;
year: integer;
begin
write('Введите номер записи которую нужно удалить: ');
readln(a);
assign(PersonFile, 'PersonFile.txt');
reset(PersonFile);
seek(PersonFile, FileSize(PersonFile)-1);
read(PersonFile, Book);
with Book do
begin
name:=NameBook;
Page:=PageCount;
year:=YearEdition;
end;
seek(PersonFile, a);
with Book do
begin
NameBook:=name;
PageCount:=page;
YearEdition:=year;
end;
read(PersonFile,book);
seek(Personfile,FileSize(PersonFile)-1);
Truncate(PersonFile);
end;
begin
writeln('1. Добавить запись');
writeln('2. Вывести на печать 1 запись');
writeln('3. Вывести на печать все записи');
writeln('4. Найти книгу с максимальным кол-вом страниц');
writeln('5. Среднее кол-во страниц');
writeln('6. Удалить запись');
writeln('0. Выход');
write('Введите номер пункта: ');
readln(a);
while a <> 0 do
begin
if a = 1 then
Fill;
if a = 2 then
Print;
if a = 3 then
FullPrint;
if a = 4 then
MaxPage;
if a = 5 then
begin
writeln('Среднее кол-во страниц: ',AverageValue);
writeln;
BooksNewFile;
PrintNewFile;
end;
if a = 6 then
Del;
write('Введите пункт: ');
readln(a);
end;
end.
давно
Академик
320937
2216
28.05.2010, 13:33
общий
angel.nero:
Добрый день!
1. Ваш последний образец не соответствует методичке, приложенной в вопросе 178560. Это другая задача (проще, но другая). По-моему, ее следует оформить отдельным вопросом, иначе получится, скажем, в рассылке, что вопрос об одном, а ответ - совсем о другом.
2. Вы ничего не ответили на вопрос о фильтре. Значит, остается вариант из программы в мини-форуме.
давно
Академик
320937
2216
02.06.2010, 10:22
общий
angel.nero:
Добрый день! На данный момент это выглядит так. Остались: удаление, печать одной записи, фильтр по улице, комментарии
Код:
uses
Crt;
const
MAX_RECORDS = 500; // максимальное число записей в файле
type
TIndex = record
arr: array[0..MAX_RECORDS-1] of integer;
size: integer;
end;

TOneinfo = record
name: string[20];
House: real;
Flat:integer;
floor:integer;//этаж
end;
tkey = (kname, kHouse, kFlat, kfloor);
TBase = file of TOneinfo;
TGreater = function(rec1, rec: TOneInfo): boolean;

function gtName(const rec1, rec2: TOneInfo): boolean;
begin
gtName := rec1.Name > rec2.Name;
end; { gtName }

function gtHouse(const rec1, rec2: TOneInfo): boolean;
begin
gtHouse := rec1.House > rec2.House;
end; { gtHouse }

function gtFlat(const rec1, rec2: TOneInfo): boolean;
begin
gtFlat := rec1.Flat > rec2.Flat;
end; { gtFlat }

function gtFloor(const rec1, rec2: TOneInfo): boolean;
begin
gtFloor := rec1.floor > rec2.floor;
end; { gtFloor }

procedure CreateIdx(const f: TBase; var idx: TIndex);
// Создание индексного массива
var
rec: TOneInfo;
i : integer;
begin
idx.size := FileSize(f);
for i:= 1 to idx.size do
idx.arr[i] := i-1;
end; { CreateIdx }

procedure Sort(const f: TBase; var idx: TIndex; const gt: TGreater);
var
i,j,n : integer;
tmp: integer;
rec1, rec2: TOneinfo;
begin

n:= filesize(f);
seek(f,0);
for i:= 1 to idx.size-1 do
for j:= idx.size downto i+1 do begin
seek(f, idx.arr[j]-1);
read(f, rec1);
read(f, rec2);

if gt(rec1, rec2) then begin
tmp := idx.arr[j];
idx.arr[j] := idx.arr[j-1];
idx.arr[j-1] := tmp;
end;
end;
end; { Sort }

procedure CreateIdxAll(
const f: TBase; var idx1, idx2, idx3: TIndex; const gt1, gt2, gt3: TGreater);
begin
CreateIdx(f, idx1);
Sort(f, idx1, gt1);

CreateIdx(f, idx2);
Sort(f, idx2, gt2);

CreateIdx(f, idx3);
Sort(f, idx3, gt3);
end; { CreateIdxAll }

procedure AddRec(var f: TBase);
//Процедура ввода
var
i, House, Flat: integer;
name: string;
rec: TOneinfo;

begin
writeln('Ввод базы данных');

write('Название улицы ');
readln(rec.name);

write('номер дома ');
readln(rec.House);

write('этаж ');
readln(rec.floor);

write('номер квартиры ');
readln(rec.Flat);

seek(f, filesize(f));
write(f, rec);

readln;
end; { AddRec }

procedure PrintRec(const rec:TOneinfo);
var
i: integer;
begin
with rec do
writeln('Название - ', name, ';', 'номер дома - ', House, ';','Этаж - ',
floor, ';', 'номер квартиры - ', Flat);
end; { Print }

procedure PrintFile(const f: TBase; const idx: TIndex);
//Процедура вывода всех записей
var
i: integer;
rec: TOneinfo;
begin
for i:= 1 to idx.size do begin
seek(f, idx.arr[i]);
read(f, rec);
PrintRec(rec);
end;
readln;
end; { PrintAll }

procedure PrintAll(const f: TBase; const idx1, idx2, idx3: TIndex);
begin
clrscr;
writeln('Сортировка по номеру дома');
PrintFile(f, idx1);
writeln('Сортировка по номеру квартиры');
PrintFile(f, idx2);
writeln('Сортировка по номеру этажа');
PrintFile(f, idx3);
end; { PrintAll }

function MaxFlat(const f: TBase): TOneInfo;
//процедура, определяет запись с наибольшим номером квартиры
var
i: integer;
rec, max: TOneinfo;
begin
max.Flat := -MaxInt-1;
seek(f,0);
while not eof(f) do
begin
read(f,rec);
if rec.Flat > max.Flat then
max := rec;
end;
MaxFlat := rec;
end; { MaxFlat }

function FirstFloor(const f: TBase): integer;
// функцию, определяющую количество жителей первого этажа
var
k: integer;
rec: TOneinfo;
begin
k := 0;
seek(f,0);
while not eof(f) do
begin
read(f,rec);
if rec.floor =1 then
inc(k);
end;
FirstFloor:=k;
end; { FirstFloor }

procedure DelRec(var f: TBase; const RecNo: integer);
begin
end; { DelRec }

procedure menu;
begin
writeln('1. Добавить запись');
writeln('2. Вывести на печать одну запись');
writeln('3. Вывести на печать все записи');
writeln('4. Наибольший номер квартиры');
writeln('5. Количество жителей первого этажа');
writeln('6. Удалить запись');
writeln('0. Выход');
end; { menu }

var
choice : integer; // выбор пункта
f : TBase;
rec : TOneInfo;
idx1, idx2, idx3 : TIndex; // массив индексов
recno : integer;
fName : string;

y, m, k, n: integer;
key: tkey;
StreetName: string[20];

var
ii: integer;

begin { main }
ClrScr;
fName := 'city.dat';
assign(f, fName);
if not FileExists(fname) then
begin
rewrite(f);
close(f);
end;

reset(f);

CreateIdxAll(f, idx1, idx2, idx3, gtHouse, gtFlat, gtFloor);

choice := 1;
while choice <> 0 do
begin
clrscr;
menu;
write('Выбор ');
readln(choice);
case choice of
1: begin
AddRec(f);
CreateIdxAll(f, idx1, idx2, idx3, gtHouse, gtFlat, gtFloor);
end;
2: begin
writeln('sorry, under construction');
// PrintRec(rec);
readln;
end;
3: PrintAll(f, idx1, idx2, idx3);
4: begin
writeln('Наибольший номер квартиры ', MaxFlat(f).Flat);
readln;
end;
5: begin
writeln('Количество жителей первого этажа ', FirstFloor(f));
readln;
end;
6: begin
DelRec(f, RecNo);
CreateIdxAll(f, idx1, idx2, idx3, gtHouse, gtFlat, gtFloor);
end;
0: writeln('Работа завершена')
else
writeln('Пункты 0..6');
end;
end;
close(f);
end.

Неизвестный
02.06.2010, 18:14
общий
lamed:
Привет. Продлить? Или может, выложишь в качестве ответа? А то начальники ругаются...
давно
Академик
320937
2216
03.06.2010, 09:09
общий
это ответ
Здравствуйте, angel.nero! Приношу извинения за задержку. Проверено на ABC.
Возможные улучшения:
1. Быстрая сортировка
2. В данной программе в случае операций удаления/добавления индексные массивы пересоздаются, можно, просто добавлять или удалять соответствующую запись.
3. Выгодней создать структуру, которая содержит как индексный массив, так и функцию сравнения
4. Можно ввести массив указателей на индексные массивы, тогда можно менять их число
...
Если потребуются дополнения или уточнения, пишите в мини-форум
Код:
uses
Crt;
const
MAX_RECORDS = 500; // максимальное число записей в файле
type
TIndex = record
arr: array[0..MAX_RECORDS-1] of integer;
size: integer;
end;

TOneinfo = record
name: string[20];
House: real;
Flat:integer;
floor:integer;//этаж
end;
tkey = (kname, kHouse, kFlat, kfloor);
TBase = file of TOneinfo;
TGreater = function(rec1, rec: TOneInfo): boolean;

function find(
const f:TBase;
const recno: integer;
var FoundRec: TOneInfo): integer;
// если запись существует
// возвращает recno или -1, если запись не существует
// foundrec присваивается значение найденной записи
// иначе возвращает -1
//
var
fSize: integer;
begin
fSize := FileSize(f);
if (fSize=0) or (recno < 0) or (recno >=fSize) then
find := -1
else begin
seek(f, recno);
read(f, FoundRec);
find := recno;
end;
end; { find }

function gtName(const rec1, rec2: TOneInfo): boolean;
// истина, если название улицы первой записи лексикографически следует
// за названием улицы второй записи
begin
gtName := rec1.Name > rec2.Name;
end; { gtName }

function gtHouse(rec1, rec2: TOneInfo): boolean;
// истина, если номер дома первой записи больше номера дома второй записи
begin
gtHouse := rec1.House > rec2.House;
end; { gtHouse }

function gtFlat(const rec1, rec2: TOneInfo): boolean;
// истина, если номер квартиры первой записи больше номера квартиры второй записи
begin
gtFlat := rec1.Flat > rec2.Flat;
end; { gtFlat }

function gtFloor(const rec1, rec2: TOneInfo): boolean;
// истина, если номер этажа первой записи больше номера этажа второй записи
begin
gtFloor := rec1.floor > rec2.floor;
end; { gtFloor }

procedure CreateIdx(const f: TBase; var idx: TIndex);
// Создание индексного массива
var
rec: TOneInfo;
i : integer;
begin
idx.size := FileSize(f);
for i:= 1 to idx.size do
idx.arr[i] := i-1;
end; { CreateIdx }

procedure Sort(const f: TBase; var idx: TIndex; const gt: TGreater);
// Сортировка индексного массива
// Метод "пузырька" как самый простой для восприятия
var
i,j,n : integer;
tmp: integer;
rec1, rec2: TOneinfo;
begin

n:= filesize(f);
seek(f,0);
for i:= 1 to idx.size-1 do
for j:= idx.size downto i+1 do begin
seek(f, idx.arr[j]-1);
read(f, rec1);
read(f, rec2);

if gt(rec1, rec2) then begin
tmp := idx.arr[j];
idx.arr[j] := idx.arr[j-1];
idx.arr[j-1] := tmp;
end;
end;
end; { Sort }

procedure CreateIdxAll(
const f: TBase; var idx1, idx2, idx3: TIndex; const gt1, gt2, gt3: TGreater);
// Создание и сортировка всех индексных файлов
begin
CreateIdx(f, idx1);
Sort(f, idx1, gt1);

CreateIdx(f, idx2);
Sort(f, idx2, gt2);

CreateIdx(f, idx3);
Sort(f, idx3, gt3);
end; { CreateIdxAll }

procedure AddRec(var f: TBase);
// Ввод новой записи и добавление в файл
var
i, House, Flat: integer;
name: string;
rec: TOneinfo;

begin
writeln('Ввод базы данных');

write('Название улицы ');
readln(rec.name);

write('номер дома ');
readln(rec.House);

write('этаж ');
readln(rec.floor);

write('номер квартиры ');
readln(rec.Flat);

seek(f, filesize(f));
write(f, rec);

readln;
end; { AddRec }

procedure PrintRec(const rec:TOneinfo);
// Печать одной записи
var
i: integer;
begin
with rec do
writeln('ул.', name, ',', House, ',кв.', flat, ',', floor, '-й этаж');
end; { Print }

procedure PrintFile(const f: TBase; const idx: TIndex);
//Процедура вывода всех записей
var
i: integer;
rec: TOneinfo;
begin
for i:= 1 to idx.size do begin
seek(f, idx.arr[i]);
read(f, rec);
PrintRec(rec);
end;
readln;
end; { PrintAll }

procedure PrintAll(const f: TBase; const idx1, idx2, idx3: TIndex);
// Печать всех записей файла, сортировка по трем условиям
begin
clrscr;
writeln('Сортировка по номеру дома');
PrintFile(f, idx1);
writeln('Сортировка по номеру квартиры');
PrintFile(f, idx2);
writeln('Сортировка по номеру этажа');
PrintFile(f, idx3);
end; { PrintAll }

function MaxFlat(const f: TBase): TOneInfo;
//процедура, определяет запись с наибольшим номером квартиры
var
i: integer;
rec, max: TOneinfo;
begin
max.Flat := -MaxInt-1;
seek(f,0);
while not eof(f) do
begin
read(f,rec);
if rec.Flat > max.Flat then
max := rec;
end;
MaxFlat := rec;
end; { MaxFlat }

function FirstFloor(const f: TBase): integer;
// функцию, определяющую количество жителей первого этажа
var
k: integer;
rec: TOneinfo;
begin
k := 0;
seek(f,0);
while not eof(f) do
begin
read(f,rec);
if rec.floor =1 then
inc(k);
end;
FirstFloor:=k;
end; { FirstFloor }

procedure DelRec(var f: TBase; const RecNo: integer);
// Удаление записи
var
rec, tmp: TOneInfo;
fSize : integer;
begin
fSize := FileSize(f);
if (recno >= 0) and (recno < fSize) then begin
seek(f, FileSize(f)-1);
read(f, rec);
seek(f, recno);
write(f, rec);
seek(f, fSize-1);
Truncate(f);
writeln('Запись удалена');
end
else
writeln('Неверный номер. Удаление невозможно');
end; { DelRec }

procedure menu;
begin
writeln('1. Добавить запись');
writeln('2. Вывести на печать одну запись');
writeln('3. Вывести на печать все записи');
writeln('4. Наибольший номер квартиры');
writeln('5. Количество жителей первого этажа');
writeln('6. Удалить запись');
writeln('0. Выход');
end; { menu }

var
choice : integer; // выбор пункта
f : TBase;
rec : TOneInfo;
idx1, idx2, idx3 : TIndex; // массив индексов
recno : integer;
fName : string;

// y, m, k, n: integer;
// key: tkey;
// StreetName: string[20];

var
ii: integer;

begin { main }
ClrScr;
fName := 'city.dat';
assign(f, fName);
if not FileExists(fname) then
begin
rewrite(f);
close(f);
end;

reset(f);

CreateIdxAll(f, idx1, idx2, idx3, gtHouse, gtFlat, gtFloor);

choice := 1;
while choice <> 0 do
begin
clrscr;
menu;
write('Выбор ');
readln(choice);
case choice of
1: begin
AddRec(f);
CreateIdxAll(f, idx1, idx2, idx3, gtHouse, gtFlat, gtFloor);
end;
2: begin
write('Номер печатаемой записи ');
readln(RecNo);
if find(f, recno, rec)>=0 then
PrintRec(rec)
else
writeln('Номер не существует');
readln;
end;
3: PrintAll(f, idx1, idx2, idx3);
4: begin
writeln('Наибольший номер квартиры ', MaxFlat(f).Flat);
readln;
end;
5: begin
writeln('Количество жителей первого этажа ', FirstFloor(f));
readln;
end;
6: begin
write('Номер удаляемой записи ');
readln(RecNo);
DelRec(f, RecNo);
CreateIdxAll(f, idx1, idx2, idx3, gtHouse, gtFlat, gtFloor);
readln;
end;
0: writeln('Работа завершена')
else
writeln('Пункты 0..6');
end;
end;
close(f);
end.


Пример работы
Код:
1. Добавить запись
2. Вывести на печать одну запись
3. Вывести на печать все записи
4. Наибольший номер квартиры
5. Количество жителей первого этажа
6. Удалить запись
0. Выход
Выбор 3
Сортировка по номеру дома
ул.Моховая,1,кв.1,1-й этаж
ул.Речная,1,кв.3,1-й этаж
ул.Сосновая,4,кв.20,5-й этаж
ул.Сосновая,5,кв.1,1-й этаж
Сортировка по номеру квартиры
ул.Сосновая,5,кв.1,1-й этаж
ул.Моховая,1,кв.1,1-й этаж
ул.Речная,1,кв.3,1-й этаж
ул.Сосновая,4,кв.20,5-й этаж
Сортировка по номеру этажа
ул.Сосновая,5,кв.1,1-й этаж
ул.Моховая,1,кв.1,1-й этаж
ул.Речная,1,кв.3,1-й этаж
ул.Сосновая,4,кв.20,5-й этаж
1. Добавить запись
2. Вывести на печать одну запись
3. Вывести на печать все записи
4. Наибольший номер квартиры
5. Количество жителей первого этажа
6. Удалить запись
0. Выход
Выбор 4
Наибольший номер квартиры 1
1. Добавить запись
2. Вывести на печать одну запись
3. Вывести на печать все записи
4. Наибольший номер квартиры
5. Количество жителей первого этажа
6. Удалить запись
0. Выход
Выбор 5
Количество жителей первого этажа 3
1. Добавить запись
2. Вывести на печать одну запись
3. Вывести на печать все записи
4. Наибольший номер квартиры
5. Количество жителей первого этажа
6. Удалить запись
0. Выход
Выбор 1
Ввод базы данных
Название улицы Ленина
номер дома 15
этаж 37
номер квартиры 2
1. Добавить запись
2. Вывести на печать одну запись
3. Вывести на печать все записи
4. Наибольший номер квартиры
5. Количество жителей первого этажа
6. Удалить запись
0. Выход
Выбор 6
Номер удаляемой записи 15
Неверный номер. Удаление невозможно
1. Добавить запись
2. Вывести на печать одну запись
3. Вывести на печать все записи
4. Наибольший номер квартиры
5. Количество жителей первого этажа
6. Удалить запись
0. Выход
Выбор 2
Номер печатаемой записи 2
ул.Сосновая,4,кв.20,5-й этаж
1. Добавить запись
2. Вывести на печать одну запись
3. Вывести на печать все записи
4. Наибольший номер квартиры
5. Количество жителей первого этажа
6. Удалить запись
0. Выход
Выбор 0
Работа завершена


Форма ответа