Объявить класс РАЙОН ГОРОДА, имеющий название, площадь, численность населения и позволяющий переименовывать район, а также изменять численность его населения и вычислять плотность населения.
Объявить класс ГОРОД, представляющий собой набор районов и позволяющий вычислить среднюю площадь и среднюю численность населения районов города, а также самый плотно населенный район. Продемонстрировать работу всех методов.*/
Answers & Comments
// PascalABC.NET 3.4.2, сборка 1790 от 15.09.2018
// Внимание! Если программа не работает, обновите версию!
type
РайонГорода = class
private
Naim: string;
S: real;
Kol: integer;
procedure SetNaim(NewName: string);
begin
if NewName.Length > 0 then Naim := NewName
end;
procedure SetKol(NewKol: integer);
begin
if NewKol > 0 then Kol := NewKol
end;
public
property Название: string read Naim write SetNaim;
property Площадь: real read S;
property ЧисленностьНаселения: integer read Kol write SetKol;
constructor(НаимРайона: string; Площадь: real; Население: integer);
begin
Naim := НаимРайона;
S := Площадь;
Kol := Население
end;
function ПлотностьНаселения := Round(Kol / S, 2);
procedure ЗадатьИмя(НаимРайона: string);
begin
SetNaim(НаимРайона)
end;
procedure ЗадатьЧисленность(Население: integer);
begin
SetKol(Население)
end;
end;
Город = class
private
City: string;
Districts: List<РайонГорода>;
public
constructor(Город: string);
begin
Districts := new List<РайонГорода>;
City := Город
end;
property НаселенныйПункт: string read City;
procedure ДобавитьРайон(Район: string; Площадь: real; Проживает: integer);
begin
var R := new РайонГорода(Район, Площадь, Проживает);
Districts.Add(R)
end;
function СредняяПлощадь := Districts.Select(d -> d.Площадь).Average;
function СредняяЧисленность :=
Districts.Select(d -> d.ЧисленностьНаселения).Average;
function ГустонаселенныйРайон :=
Districts.Select(d -> (d.Название, d.ПлотностьНаселения)).MaxBy(r -> r[1]);
procedure ИзменитьНаименованиеРайона(s1, s2: string);
begin
var i := Districts.FindIndex(d -> d.Название = s1);
if i >= 0 then Districts[i].ЗадатьИмя(s2)
end;
procedure ИзменитьЧисленностьРайона(s: string; n: integer);
begin
var i := Districts.FindIndex(d -> d.Название = s);
if i >= 0 then Districts[i].ЗадатьЧисленность(n)
end;
procedure Вывод;
begin
Println('Сведения по городу', City);
foreach var d in Districts do
Println(d.Название, d.Площадь, d.ЧисленностьНаселения);
Println('-' * 60)
end;
end;
begin
var GG := new Город('Просто город');
GG.ДобавитьРайон('Ворошиловский', 30, 218439);
GG.ДобавитьРайон('Железнодорошный', 69, 104339);
GG.ДобавитьРайон('Кировский', 18.6, 63499);
GG.ДобавитьРайон('Ленинский', 13, 821730);
GG.Вывод;
GG.ИзменитьНаименованиеРайона('Железнодорошный', 'Железнодорожный');
GG.ИзменитьЧисленностьРайона('Ленинский', 82173);
GG.Вывод;
Println('Средняя площадь', GG.СредняяПлощадь);
Println('СредняяЧисленность', GG.СредняяЧисленность);
var (Район, Плотность) := GG.ГустонаселенныйРайон;
Println('Наиболее густонаселен', Район, Плотность)
end.