Найдите в базе всех жителей, живущих в разных городах по одинаковому адресу. - Pascal
Формулировка задачи:
Есть база данных по жителям красноярского края, содержащая город, улицу,
номер дома и квартиры. Найдите в ней всех жителей, живущих в разных городах по
одинаковому адресу.
Помогите решить задачу.
Решение задачи: «Найдите в базе всех жителей, живущих в разных городах по одинаковому адресу.»
textual
Листинг программы
type
TCitizen = record
city, street, houseNumber: String;
apartamentNumber: Word; //0 - частный дом
end;
var
ar: Array[Byte] Of TCitizen;
used: Set Of Byte;
i, j: Byte;
n: Integer;
flag: Boolean;
begin
repeat
Write('Введите количество жителей в базе (1..256): ');
ReadLn(n);
until ((n > 0) And (n < 257));
for i := 0 to n - 1 do
with ar[i] do
begin
Write('Город? '); ReadLn(city);
Write('Улица? '); ReadLn(street);
Write('Номер дома? '); ReadLn(houseNumber);
Write('Номер квартиры (0 - частный дом)? '); ReadLn(apartamentNumber);
end;
WriteLn;
WriteLn;
used := [];
for i := 0 to n - 2 do
if Not(i in used)
then
begin
j := i + 1;
repeat
flag := ((ar[i].city <> ar[j].city) And (ar[i].street = ar[j].street) And (ar[i].houseNumber = ar[j].houseNumber) And (ar[i].apartamentNumber = ar[j].apartamentNumber) And Not(j in used));
Inc(j);
until ((flag) Or (j >= n));
if (flag)
then
begin
with ar[i] do
Write(street, ', ', houseNumber, '/', apartamentNumber, ': ', i + 1, ' - ', city);
Include(used, i);
with ar[j - 1] do
Write('; ', j, ' - ', city);
Include(used, j - 1);
while (j < n) do
begin
if ((ar[i].city <> ar[j].city) And (ar[i].street = ar[j].street) And (ar[i].houseNumber = ar[j].houseNumber) And (ar[i].apartamentNumber = ar[j].apartamentNumber) And Not (j in used))
then
begin
Write('; ', j + 1, ' - ', ar[j].city);
Include(used, j);
end;
Inc(j);
end;
WriteLn;
end;
end;
end.
Объяснение кода листинга программы
- Определение типа данных
TCitizenкак структуры с полямиcity,street,houseNumberиapartamentNumber. - Объявление переменных
ar- массива структурTCitizenиused- множества байт. - Объявление переменных
i,j- байт,n- целое число иflag- булево значение. - Ввод с клавиатуры значения переменной
nдо тех пор, пока оно не будет в диапазоне от 1 до 256 включительно. - Цикл для заполнения массива
arданными о жителях (город, улица, номер дома, номер квартиры). - Инициализация множества
usedкак пустого. - Цикл для сравнения всех жителей из базы с целью нахождения совпадений по адресам.
- Проверка наличия совпадающих адресов и вывод информации о жителях, обитающих по одинаковым адресам.
- Обновление множества
usedпосле обнаружения совпадений. - Завершение работы программы. В данном коде реализован поиск жителей, проживающих по одинаковым адресам, и вывод информации о совпадениях.