Консультация № 177809
11.04.2010, 12:32
45.00 руб.
0 16 1
Здравствуйте, помогите пожалуйста написать программу: пусть дан массив, содержащий сведения о продаваемых квартирах. сведения могут содержать следующую информацию: общая площадь, жилая площадь, площадь кухни, наличие лоджии, этаж, общее количество этажей в доме, адрес, стоимость квартиры и т.п. сформулируйте несколько критериев, по которым можно отбирать ту или иную квартиру для покупки и основываясь на этих критериях, введите сведения о ней.

Обсуждение

давно
Академик
320937
2216
11.04.2010, 15:55
общий
Невалёный Виталий Владимирович:
У Вас "нестыковка". С одной стороны, все сведения обо всех квартирах хранятся в массиве, с другой стороны, в программу надо
ввести сведения о ней
Может быть, надо ввести критерии и вывести список подходящих квартир? Или еще что-то?
Неизвестный
11.04.2010, 16:37
общий
надо ввести критерии и вывести список подходящих квартир
Неизвестный
12.04.2010, 22:31
общий
Как, по Вашему мнению, должна выглядеть (работать) программа? Вопрос не пустой: задача несожная, но тратить время ПОТОМ на переделывание не очень хочется
Неизвестный
12.04.2010, 22:41
общий
Как заполнять массив?
Что значит "ввести критерий"? Выбрать из нескольких заранее сформулированных или набрать из нескольких полей - это все потребует соврешенно различной реализации. В первом случае достаточно будет выбрать "1", "2" ..., во втором надо создать систему флагов (бит в запросе) и анализировать их. Или можно использовать запись - запрос...
Что требуется?
Неизвестный
13.04.2010, 23:35
общий
нухно использовать тип запись с выбором
Неизвестный
13.04.2010, 23:36
общий
мне не суть важно каким способом, помогите пожалуйста
Неизвестный
14.04.2010, 07:45
общий
Вы обратились по адресу - пишу. Решил, что информация должна храниться в типизированном файле...
Неизвестный
14.04.2010, 07:47
общий
Да, Вы, случайно, не на ABC..duratski работаете?
Неизвестный
14.04.2010, 13:59
общий
Нужен совет:
Я решил создать такие поля для описания квартиры и запроса:
Код:
uses CRT;
CONST
base_FileName = '177809.dat';
addres_len = 30; {Длина строки адреса}
TYPE
TOneRoom = record
space_main, space_living, space_kitchen: Real;
loggia: Boolean;
level, levels: Byte; {этаж, количество этажей}
addres: String[addres_len];
cost : Real;
end;

CONST
qf_space_main : Word = $0001;
qf_space_living : Word = $0002;
qf_space_kitchen: Word = $0004;
qf_level : Word = $0008; {Задан этаж}
qf_levels : Word = $0010;
qf_cost : Word = $0011;

TYPE
TQuery = record
query_fileds: Longint; {биты определяют, какие поля
в требовании определены}
{В следующих полях 0 означает - не лимитируется}
space_main_min, space_main_max: Real;
space_living_min, space_living_main_max: Real;
space_kitchen_min, space_kitchen_max: Real;
level_min, level_max, levels_min, level_max: Byte;
cost_min, cost_max: Real;
loggia: Boolen; {либо требуется, либо нет}
end;

Этого будет достаточно, или нужно чем-то дополнить? Напишите - легче будет работать
Неизвестный
14.04.2010, 19:18
общий
я думаю этого достаточно, может еще добавить наличие или отсутствие телефона интернета
Неизвестный
14.04.2010, 20:45
общий
да на pascal ABC
Неизвестный
14.04.2010, 21:33
общий
Понял, переделываю...
Неизвестный
15.04.2010, 13:20
общий
Посмотри промежуточный результат (приступаю к проведению поиска). Все так?
Код:
CONST
base_FileName = '177809.dat';
street_len = 15; {Длина строки адреса}
TYPE
TAddres = record
Street: String[street_len];
house: Integer;
room : Integer;
end;

TOneRoom = record
space_main, space_living, space_kitchen: Real;
loggia : Boolean;
tel : Boolean;
Internet: Boolean;
level, levels: Integer; {этаж, количество этажей}
addres: TAddres;
cost : Real;
end;

TQuery = record
{В следующих полях 0 означает - не лимитируется
если не 0, то соответствующая минимальная и/или максимальная величина
Смысл полей очевиден}
space_main_min, space_main_max: Real;
space_living_min, space_living_main_max: Real;
space_kitchen_min, space_kitchen_max: Real;
level_min, level_max, levels_min, levels_max: Byte;
cost_min, cost_max: Real;
loggia: Boolean; {либо требуется, либо нет}
end;

procedure PrintOne(r: TOneRoom);
{Печать информации об одной квартире}
begin
WriteLn('Улица:',r.addres.Street:street_len,
'. Дом: ', r.addres.house:4,
'. Квартира: ',r.addres.room:4);
WriteLn('Площадь общая: ',r.space_main:8:2,
', жилая: ',r.space_living:8:2,
', кухня : ',r.space_kitchen:8:2);
WriteLn('Этаж: ',r.level:4, ', этажей: ',r.levels:4);
Write('Лоджия: ');
if r.loggia then Write('есть') else Write('нет');
Write(', тел: '); if r.tel then Write('есть') else Write('нет');
Write(', Интернет: '); if r.Internet then WriteLn('есть') else WriteLn('нет');
Write(' стоимость: ');WriteLn(r.cost: 12:2)
end;

function PrintAll(aFileName: String): int64;
{Вывод всей информации. Возвращает число записей в файле}
var
f: File of TOneRoom;
r: TOneRoom;
count: int64;
begin
if NOT FileExists(aFileName) then begin
WriteLn('Не могу открыть файл базы данных ', aFileName);
PrintAll := -1;
Exit;
end
else
begin
Assign(f, aFileName);
Reset(f);
if FileSize(f) = 0 then
begin
WriteLn('Файл ',aFileName,' пуст');
PrintAll := 0;
Exit
end;
count := 0;
While not eof(f) do
begin
inc(count); Write(count:3,') ');
Read(f, r);
PrintOne(r);
WriteLn;
end;
end;
Close(f);
PrintAll := count
end;

function PutRoom(aFileName: String): Integer;
{Сохраняет в файле (не в массиве!!) информацию о квартирах
возвращает количество информационных записей
если не ввести ни одной - то можно узнать, сколько имеется
в базе данных}
function Info(var t: TOneRoom): Boolean;
{Ввод информации об одной квартире. TRUE, если поля заполнены
и тогда нужно запоминать в файл}
var s: String;
begin
repeat
WriteLn('Ввод информации об одной квартире:');
Write('Введите улицу (если просто нажмете ENTER - ввод завершится): ');
ReadLn(s);
result := s <> '';
if NOT result then Exit; {Немедленный выход из подпрограммы}
// полагаю, что отрицательные числа вводить не будет
// а потому проверку эту пропускаю
t.addres.Street := Copy(s, 1, street_len); {Может ввести больше}
repeat
Write('Введите номер дома (целое число): '); ReadLn(s)
until tryStrToInt(s, t.addres.house);
repeat
Write('Введите номер квартиры (целое число): '); ReadLn(s)
until tryStrToInt(s, t.addres.room);
repeat
Write('Введите площадь кухни (вещественное число): '); ReadLn(s);
until tryStrToFloat(s, t.space_kitchen);
repeat
Write('Введите жилую площадь площадь : '); ReadLn(s);
until tryStrToFloat(s, t.space_living);
repeat
repeat
Write('Введите общую площадь: '); ReadLn(s);
until tryStrToFloat(s, t.space_main);
until (t.space_main > t.space_living + t.space_kitchen);
// Общая площадь не должна быть меньше или равна сумме
repeat
Write('Количество этажей в доме: '); ReadLn(s)
until tryStrToInt(s, t.levels);
repeat
repeat
Write('Введите этаж, на котором расположена квартира: '); ReadLn(s);
until tryStrToInt(s, t.level)
until (t.level <= t.levels);
Write('Имеется ли лоджия? Если "Да" - просто нажмите ENTER, иначе - любые символы и ENTER');
ReadLn(s);
t.loggia := s = '';
Write('Проведен ли телефон? Если "Да" - просто нажмите ENTER, иначе - любые символы и ENTER');
ReadLn(s);
t.tel := s = '';
Write('Подключен ли Интернет? Если "Да" - просто нажмите ENTER, иначе - любые символы и ENTER');
ReadLn(s);
t.Internet := s = '';
repeat
Write('Введите стоимость квартиры: '); ReadLn(s);
until tryStrToFloat(s, t.cost);
WriteLn;
WriteLn('Вы ввели:');
PrintOne(t);
Write('Если информация правильная, нажмите ENTER, иначе - любые символы и ENTER'); ReadLn(s);
result := s = '';
WriteLn;
until result;
end;

var
f: File of TOneRoom;
r: TOneRoom;
count, c: int64;
s: String;
begin
count := 0;
Assign(f, aFileName);
if FileExists(aFileName) then
begin
Reset(f);
c := (FileSize(f));
if c > 0 then
begin
WriteLn('Файл ', AFileName,' существует. Количество записей в нем: ',c,'. Переписать?');
WriteLn(' Если "ДА" (при этом прежняя информация будет уничтожена),');
WriteLn(' то введите любые символы и нажмите ENTER');
WriteLn(' Иначе (сохранить информацию), просто нажмите ENTER');
ReadLn(s);
if length(s) = 0 then
Reset(f)
else
Rewrite(f);
end
end
else Rewrite(f);
seek(f, FileSize(f));
while Info(r) do begin
Write(f, r);
inc(count)
end;
Close(f);
PutRoom := count;
end;
(*
function FindRoom(aFileName: String): int64;
{возвращает количество квартир в файле базы данных
или -1, если ничего не найдено}
var
f: File of TOneRoom;
//r: TOneRoom;
//p: int64;
//q: TQuery;
count: int64;
function FindTheRoom(From: Longint): LongInt;
{Локальная функция - ищет одну квартиру в базе данных
начиная с записи с данным номером (начинается с нуля).
Контролирует выход за пределы файла
возвращает положение записи в файле данных
или -1, если ничего не найдено}
begin
FindTheRoom := -1;
end;

function aQuery: Boolean;
{формирование запроса. FALSE - если отказался от запроса}
begin
aQuery := FALSE;
end;
begin
count := 0;
if NOT FileExists(aFileName) then begin
WriteLn('Не могу открыть файл базы данных ', aFileName);
FindRoom := -1;
Exit;
end;
FindRoom := count;
Close(f);
end;
*)

procedure Menu;
var s: String;
f: File of TOneRoom;
c: int64;
begin
if FileExists(base_fileName) then
begin
Assign(f, base_fileName);
Reset(f);
c := FileSize(f);
CloseFile(f);
if c > 0 then
begin
WriteLn('Файл ',base_fileName,' существует. Количество записей в нем: ',c,'');
end
else
begin
WriteLn('Файл базы данных пуст. Необходимо ввести информацию');
PutRoom(base_fileName)
end;
end
else
begin
WriteLn('Отсутствует файл базы данных. Необходимо ввести информацию');
PutRoom(base_fileName)
end;

repeat
WriteLn('Меню: (для выбора нажмите клавишу и ENTER)');
WriteLn(' 1 - ввод информации');
WriteLn(' 2 - просмотр имеющейся информации');
WriteLn(' 3 - поиск по критерию');
WriteLn(' Если хотите завершить работу, наберите Exit и нажите ENTER');
ReadLn(s);
s := UpperCase(s);
if s.StartsWith('E') then Exit;
if s.StartsWith('1') then PutRoom(base_fileName)
else
if s.StartsWith('2') then PrintAll(base_fileName);

until s = 'exit';
end;

BEGIN
Menu;
WriteLn('Работа программы завершена');
END.
Неизвестный
15.04.2010, 15:07
общий
да
Неизвестный
15.04.2010, 21:19
общий
это ответ
Здравствуйте, Невалёный Виталий Владимирович.
Уф! Дописал, но тестировал мало. Проверь. Что не так, напиши (но и перешли свой файл данных!)
Еще пару глюков в этом нелюбимом ABC нашел ... (Вам-то деваться некуда, а я, когда встал вопрос, на каком языке программировать на 1 курсе (специальность "Микроэлектроника") по предмету Информатика - взял Visual Studio 2008 - C++
Как-то странно, учиться программировать на одном языке, а работать ... (ворчу)

Но, ессно, если вопросы будут, тоже пиши - поясню

Приложение:
CONST
base_FileName = '177809.dat';
street_len = 15; {Длина строки адреса}
TYPE
TAddres = record
Street: String[street_len];
house: Integer;
room : Integer;
end;

TOneRoom = record
space_main, space_living, space_kitchen: Real;
loggia : Boolean;
tel : Boolean;
Internet: Boolean;
level, levels: Integer; {этаж, количество этажей}
addres: TAddres;
cost : Real;
end;

TQuery = record
{В следующих полях 0 означает - не лимитируется
если не 0, то соответствующая минимальная и/или максимальная величина
Смысл полей очевиден}
space_main_min, space_main_max: Real;
space_living_min, space_living_max: Real;
space_kitchen_min, space_kitchen_max: Real;
level_min, level_max, levels_min, levels_max: Integer;
cost_max: Real; // убрал минимальную стоимость - не подумал сразу, что не нужно (глупо)
loggia: Boolean; {либо требуется, либо нет}
end;

procedure PrintOne(r: TOneRoom);
{Печать информации об одной квартире}
begin
WriteLn('Улица:',r.addres.Street:street_len,
'. Дом: ', r.addres.house:4,
'. Квартира: ',r.addres.room:4);
WriteLn('Площадь общая: ',r.space_main:8:2,
', жилая: ',r.space_living:8:2,
', кухня : ',r.space_kitchen:8:2);
WriteLn('Этаж: ',r.level:4, ', этажей: ',r.levels:4);
Write('Лоджия: ');
if r.loggia then Write('есть') else Write('нет');
Write(', тел: '); if r.tel then Write('есть') else Write('нет');
Write(', Интернет: '); if r.Internet then WriteLn('есть') else WriteLn('нет');
Write(' стоимость: ');WriteLn(r.cost: 12:2)
end;

function PrintAll(aFileName: String): int64;
{Вывод всей информации. Возвращает число записей в файле}
var
f: File of TOneRoom;
r: TOneRoom;
count: int64;
begin
if NOT FileExists(aFileName) then begin
WriteLn('Не могу открыть файл базы данных ', aFileName);
PrintAll := -1;
Exit;
end
else
begin
Assign(f, aFileName);
Reset(f);
if FileSize(f) = 0 then
begin
WriteLn('Файл ',aFileName,' пуст');
PrintAll := 0;
Exit
end;
count := 0;
While not eof(f) do
begin
WriteLn('В файле ',aFileName,' содержится информация о ',FileSize(f),' квартирах');
inc(count); Write(count:3,') ');
Read(f, r);
PrintOne(r);
WriteLn;
end;
end;
Close(f);
PrintAll := count
end;

function GetInfo(aFileName: String; recNo: int64; var r: TOneRoom): Boolean;
// Возвращает информацию о содержимом записи recNo
// Нужна для удаления записей из файла (чтобы удостовериться, что "та")
// Счет с нуля!!!
var f: File of TOneRoom;
begin
result := FALSE;
if NOT FileExists(aFileName) then Exit;
Assign(f, aFileName);
Reset(f);
if (recNo >= 0) or (recNo < FileSize(f)) then
begin
result := TRUE;
Seek(f, recNo);
Read(f, r);
end;
Close(f);
end;

function DeleteRecord(aFileName: String; recNo: int64): Boolean;
// Удаление записи из файла - де, использованная информация
// С большими файлами работа будет очень медленной
// Убыстрить можно, если не создавать временный файл, но чуь побольше
// логики будет
const
TempFileName: String = 'aaaa.aaa';
var f, temp: File of TOneRoom;
r: TOneRoom;
p: int64;
s: String;
begin
result := False;
if NOT FileExists(aFileName) then Exit;
Assign(f, aFileName);
Reset(f);
if (FileSize(f) > 0) and (recNo >= 0) and (recNo < FileSize(f)) then begin
seek(f, recNo);
Read(f, r);
WriteLn('Вы действительно хотите удалить эту информацию:');
PrintOne(r);
WriteLn(' Если действительно хотите удалить, нажмите ENTER');
WriteLn(' Если "НЕТ", но наберите любые символы и нажмите ENTER');
ReadLn(s);
if length(s) > 0 then Exit;
Reset(f);
p := 0;
Assign(temp, tempFileName);
Rewrite(temp);
While not eof(f) do begin
Read(f, r);
if p <> recNo then Write(temp, r);
inc(p)
end;
Close(f);
Close(temp);
Erase(f);
Rename(temp, aFileName);
result := TRUE;
Close(f);
Exit;
end;
Close(f);
end;

function PutRoom(aFileName: String): Integer;
{Сохраняет в файле (не в массиве!!) информацию о квартирах
возвращает количество информационных записей
если не ввести ни одной - то можно узнать, сколько имеется
в базе данных}
function Info(var t: TOneRoom): Boolean;
{Ввод информации об одной квартире. TRUE, если поля заполнены
и тогда нужно запоминать в файл}
var s: String;
begin
repeat
WriteLn('Ввод информации об одной квартире:');
Write('Введите улицу (если просто нажмете ENTER - ввод завершится): ');
ReadLn(s);
result := s <> '';
if NOT result then Exit; {Немедленный выход из подпрограммы}
// полагаю, что отрицательные числа вводить не будет
// а потому проверку эту пропускаю
t.addres.Street := Copy(s, 1, street_len); {Может ввести больше}
repeat
Write('Введите номер дома (целое число): '); ReadLn(s)
until tryStrToInt(s, t.addres.house);
repeat
Write('Введите номер квартиры (целое число): '); ReadLn(s)
until tryStrToInt(s, t.addres.room);
repeat
Write('Введите площадь кухни (вещественное число): '); ReadLn(s);
until tryStrToFloat(s, t.space_kitchen);
repeat
Write('Введите жилую площадь площадь : '); ReadLn(s);
until tryStrToFloat(s, t.space_living);
repeat
repeat
Write('Введите общую площадь: '); ReadLn(s);
until tryStrToFloat(s, t.space_main);
until (t.space_main > t.space_living + t.space_kitchen);
// Общая площадь не должна быть меньше или равна сумме
repeat
Write('Количество этажей в доме: '); ReadLn(s)
until tryStrToInt(s, t.levels);
repeat
repeat
Write('Введите этаж, на котором расположена квартира: '); ReadLn(s);
until tryStrToInt(s, t.level)
until (t.level <= t.levels);
Write('Имеется ли лоджия? Если "Да" - просто нажмите ENTER, иначе - любые символы и ENTER ');
ReadLn(s);
t.loggia := s = '';
Write('Проведен ли телефон? Если "Да" - просто нажмите ENTER, иначе - любые символы и ENTER ');
ReadLn(s);
t.tel := s = '';
Write('Подключен ли Интернет? Если "Да" - просто нажмите ENTER, иначе - любые символы и ENTER ');
ReadLn(s);
t.Internet := s = '';
repeat
Write('Введите стоимость квартиры: '); ReadLn(s);
until tryStrToFloat(s, t.cost);
WriteLn;
WriteLn('Вы ввели:');
PrintOne(t);
Write('Если информация правильная, нажмите ENTER, иначе - любые символы и ENTER '); ReadLn(s);
result := s = '';
WriteLn;
until result;
end;

var
f: File of TOneRoom;
r: TOneRoom;
count, c: int64;
s: String;
begin
count := 0;
Assign(f, aFileName);
if FileExists(aFileName) then
begin
Reset(f);
c := (FileSize(f));
if c > 0 then
begin
WriteLn('Файл ', AFileName,' существует. Количество записей в нем: ',c,'. Переписать?');
WriteLn(' Если "ДА" (при этом прежняя информация будет уничтожена),');
WriteLn(' то введите любые символы и нажмите ENTER');
WriteLn(' Иначе (сохранить информацию), просто нажмите ENTER');
ReadLn(s);
if length(s) = 0 then
Reset(f)
else
Rewrite(f);
end
end
else Rewrite(f);
seek(f, FileSize(f));
while Info(r) do begin
Write(f, r);
inc(count)
end;
Close(f);
PutRoom := count;
end;

function FindRoom(aFileName: String): int64;
{возвращает количество квартир в файле базы данных
или -1, если ничего не найдено}
var
f: File of TOneRoom;
r: TOneRoom;
p : int64;
count: int64;
q: TQuery;

function FindTheRoom(From: Longint): int64;
{Локальная функция - ищет только одну квартиру в базе данных
начиная с записи с данным номером
Использует переменную q
Контролирует выход за пределы файла возвращает положение записи в файле данных
или -1, если ничего не найдено}
var position: int64;
begin
result := -1;
if (From < 0) or (From >= FileSize(f)) then Exit;
seek(f, From);
position := From-1;
while NOT EOF(f) do begin
Read(f, r);
position +=1;
// Сравнение
if (q.space_main_max > 0) and (r.space_main > q.space_main_max) then Continue;
// Continue - все остальное в цикле игнорируется, переходим к следю шагу цикла
// идея проверки проста: если выходит за диапазон, но считываем следующую запись
if (q.space_main_min > 0) and (r.space_main < q.space_kitchen_min) then Continue;
if (q.space_living_max > 0) and (r.space_living > q.space_living_max) then Continue;
if (q.space_living_min > 0) and (r.space_living < q.space_living_min) then Continue;
if (q.space_kitchen_max > 0) and (r.space_kitchen > q.space_kitchen_max) then Continue;
if (q.space_kitchen_min > 0) and (r.space_kitchen < q.space_kitchen_min) then Continue;
if (q.levels_max > 0) and (r.levels > q.levels_max) then Continue;
if (q.levels_min > 0) and (r.levels < q.levels_min) then Continue;
if (q.level_max > 0) and (r.level > q.levels_max) then Continue;
if (q.levels_min > 0) and (r.level < q.level_min) then Continue;
if (q.loggia) and (NOT (r.loggia)) then Continue;
if (q.cost_max > 0) and (r.cost > q.cost_max) then Continue;
// Если сюда попали, значит не был отвергнут запрос
result := position;
Exit; //Немедленный выход из подпрограммы в r - нужная запись
end;
end;

function setQuery: Boolean;
{формирование запроса. FALSE - если отказался от запроса
заполняется переменная q}
// не отслеживаю введение отрицательных чисел. Если нужно, можно ввести
// будет чуть побольше
var s: String;
begin
result := FALSE;

WriteLn('Формирование запроса на поиск квартиры:');
WriteLn('0 (ноль) или отрицательне означает, что данный параметр не важен (может быть любым)');

repeat
Write('Максимальная общая площадь: '); ReadLn(s);
until tryStrToFloat(s, q.space_main_max);
repeat
repeat
Write('Минимальная общая площадь: '); ReadLn(s)
until tryStrToFloat(s, q.space_main_min);
until (q.space_main_min <= q.space_main_max) or (q.space_main_max <= 0) or
(q.space_main_max <= 0);
// минимальная не может быть больше максимальной, если максимальная <> 0

repeat
Write('Максимальная жилая помощь: '); ReadLn(s);
until tryStrToFloat(s, q.space_living_max);
repeat
repeat
Write('Минимальная жилая помощь: '); ReadLn(s);
until tryStrToFloat(s, q.space_living_min);
until (q.space_living_max <= 0) or (q.space_living_min <= q.space_living_max)
or (q.space_living_min <= 0);

repeat
Write('Максимальная площадь кухни: '); ReadLn(s)
until tryStrToFloat(s, q.space_kitchen_max);
repeat
repeat
Write('Минимальная площадь кухни: '); ReadLn(s);
until tryStrToFloat(s, q.space_kitchen_min);
until (q.space_kitchen_max <= 0) or (q.space_kitchen_min <= q.space_kitchen_max) or
(q.space_kitchen_min <= 0);

repeat
Write('Максимальное количество этажей в доме: '); ReadLn(s);
until tryStrToInt(s, q.levels_max);
repeat
repeat
Write('Минимальное количество этажей в доме: '); ReadLn(s);
until tryStrToInt(s, q.levels_min);
until (q.levels_max <= 0) or (q.levels_min <= q.levels_max) or (q.levels_min <= 0);

repeat
repeat
Write('Максимальный этаж: '); ReadLn(s);
until tryStrToInt(s, q.level_max);
until (q.level_max <= 0) or (q.level_max <= q.levels_max);

repeat
repeat
Write('Минимальный этаж: '); ReadLn(s);
until tryStrToInt(s, q.level_min);
until (q.level_min <= 0) or (q.level_max <= 0) or (q.level_min <= q.levels_min) or
(q.level_min <= q.level_max); // либо не важно (0), не меньше

repeat
Write('Максимальная стоимость квартиры: '); ReadLn(s);
until tryStrToFloat(s, q.cost_max);

Write('Нужна лоджия? Если нажмете ENTER, то нужна. Введете символы и ENTER - НЕТ: ');
ReadLn(s);
q.loggia := s = '';

WriteLn('Сформирован следующий запрос:');
Write(' Максимальная общая площадь: ');
if q.space_main_max <= 0 then WriteLn('не важна') else WriteLn(q.space_main_max:8:2);
Write(' Минимальная общая площадь: ');
if q.space_main_min <= 0 then WriteLn('не важна') else WriteLn(q.space_main_min:8:2);

Write(' Максимальная жилая площадь: ');
if q.space_living_max <= 0 then WriteLn('не важна') else WriteLn(q.space_living_max:8:2);
Write(' Минимальная жилая площадь: ');
if q.space_living_min <= 0 then WriteLn('не важна') else WriteLn(q.space_living_min:8:2);

Write(' Максимальная площадь кухни: ');
if q.space_kitchen_max <= 0 then WriteLn('не важна') else WriteLn(q.space_kitchen_max:8:2);
Write(' Минимальная площадь кухни: ');
if q.space_kitchen_min <= 0 then WriteLn('не важна') else WriteLn(q.space_kitchen_min:8:2);

Write(' Максимальное число этаже в доме: ');
if q.levels_max <= 0 then WriteLn('не важно') else WriteLn(q.levels_max);
Write(' Минимальное число этажей в доме: ');
if q.levels_min <= 0 then WriteLn('не важна') else WriteLn(q.levels_min);

Write(' Максимальный этаже: ');
if q.level_max <= 0 then WriteLn('не важно') else WriteLn(q.level_max);
Write(' Минимальный этаж: ');
if q.level_min <= 0 then WriteLn('не важно') else WriteLn(q.level_min);

Write(' Лоджия: ');
if NOT q.loggia then Write('не ');
WriteLn('требуется');

Write(' Максимальная стоимость: ');
if q.cost_max <= 0 then WriteLn('не важна') else WriteLn(q.cost_max:8:2);

Write('Если все правильно, нажмите ENTER. Если нет, то введите любые символы и нажите ENTER');
ReadLn(s);
result := s = '';
end;

begin
count := 0;
if NOT FileExists(aFileName) then begin
WriteLn('Не могу открыть файл базы данных ', aFileName);
FindRoom := -1;
Exit;
end;
Assign(f, aFileName);
Reset(f);
count := 0;
if setQuery then
begin
p := -1;
repeat
p := FindTheRoom(p + 1);
if p > -1 then begin
count +=1;
Write(count:3,') ');
PrintOne(r);
end
until p = -1;
end;
FindRoom := count;
Close(f);
end;


procedure Menu;
const ResolvedChars: Set of char = ['E', '1', '2', '3', 'У'];
var s: String;
f: File of TOneRoom;
c: int64;
begin
if FileExists(base_fileName) then
begin
Assign(f, base_fileName);
Reset(f);
c := FileSize(f);
CloseFile(f);
if c > 0 then
begin
WriteLn('Файл ',base_fileName,' существует. Количество записей в нем: ',c,'');
end
else
begin
WriteLn('Файл базы данных пуст. Необходимо ввести информацию');
PutRoom(base_fileName)
end;
end
else
begin
WriteLn('Отсутствует файл базы данных. Необходимо ввести информацию');
PutRoom(base_fileName)
end;

repeat
WriteLn('Меню: (для выбора нажмите клавишу и ENTER)');
WriteLn(' 1 - ввод информации');
WriteLn(' 2 - просмотр имеющейся информации');
WriteLn(' 3 - поиск по критерию');
WriteLn(' Если хотите завершить работу, наберите Exit и нажите ENTER');
repeat
ReadLn(s); s := UpperCase(s);
until s[1] in ResolvedChars;

if (s[1] = 'E') or (s[1] = 'У') then Exit // если на русской нажал
else
if s[1] = '1' then PutRoom(base_fileName)
else
if s[1] = '2' then PrintAll(base_fileName)
else
if s[1] = '3' then FindRoom(base_fileName);

// Странно, но при использовании case нельзя вызывать подпрограммы ... Глюк
until s = 'EXIT';
end;

BEGIN
Menu;
WriteLn('Работа программы завершена');
END.
5
Неизвестный
15.04.2010, 21:22
общий
Да, если критерий не нужен, можно ввести ноль или отрицательное число. Так решил проблему отрицательных чисел в критерии.
Надо заметить, что в параметрах квартиры отрицательные числа можно ввести - не отслеживаю. Смысла в таком нет - если надо исправить, исправлю
Форма ответа