Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 10.03.2018
Сообщений: 2

Задача: построить систему классов для описания плоских геометрических фигур

07.03.2020, 13:04. Показов 6978. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Построить систему классов для описания плоских геометрических фигур: круга,квадрата,прямоугольника. Предусмотреть методы для создания объектов, расчета их площади и периметра.
Сценарий использования:
1. Пользователь выбирает из списка геометрическую фигуру
2. В текстовом поле задает её геометрические параметры. Для круга - это радиус, для квадрата - длина стороны, прямоугольник-2 стороны
3. Нажимает кнопку "рассчитать"
4. Видит на экране значение площади и периметра.

Работает всё кроме прямоугольника, не могу ввести данные во второй инпут для вычислений.


HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<HTML>
<title>фигуры</title>
<body>
 
<?php
abstract class Figure{
    
    protected $area;
    protected $perimetr;
    
    abstract protected function calculatorArea();
    abstract protected function calculatorPerimetr();
    
        function __construct()
    {
        $this->calculatorArea();
        $this->calculatorPerimetr();
    }
    
public function GetOut()
    {
     return "Площадь=$this->area<br>Периметр =$this->perimetr";
    }
}
 
 class Circle extends Figure
 { 
 protected $radius;
 
    function __construct($number)
    {
        $this->radius = $number;
        parent::__construct();
    }
 
     public function calculatorArea() 
     {$this->area=pi()*$this->radius**2;}
     public function calculatorPerimetr() 
     {$this->perimetr=2*pi()*$this->radius;}
     
       }
 class Square extends Figure
 {
    protected $storona;
    
    function __construct($number)
    {
        $this->storona = $number;
        parent::__construct();
    }
    
     public function calculatorArea() 
     {$this->area=$this->storona**2;}
     public function calculatorPerimetr() 
     {$this->perimetr=$this->storona*4;}
     
 }
 
 class Rectangle extends Figure
 {
    protected $storonaA;
    protected $storonaB;
    
    function __construct($number)
    {
        $this->storonaA = $number;
        parent::__construct();
    }
    
    
     public function calculatorArea() 
     {$this->area=$this->storonaA*$this->storonaB;}
     public function calculatorPerimetr() 
     {$this->perimetr=($this->storonaA+$this->storonaB)*2;}
     
 }
?> 
 
<form method="POST" name="main">
<p>Выберите фигуру:</p>
 
<select name="figure" value="<?=$_POST[figure];if(isset($_POST['square']))?>">
 
    <option <? echo (isset($_POST['figure']))&&(($_POST['figure']) =='square') ? 'selected' : " "; ?> value="square"> квадрат </option> 
    <option <? echo (isset($_POST['figure']))&&(($_POST['figure']) =='circle') ? 'selected' : " "; ?> value="circle"> круг </option>
    <option <? echo (isset($_POST['figure']))&&(($_POST['figure']) =='rectangle') ? 'selected' : " "; ?> value="rectangle" name="rectangle"> прямоугольник </option>
</select>
 
<br><p>Введите число:</p>
<input type="number" name="number" value="<?=$_POST['number'];?>">
 
<?php
 
if (($_POST['figure']) =='rectangle')
{ 
echo " <input type ='number' name='numb' value='<?=$_POST[numb];?>' <br> ";
}
?> 
<button> Расчитать </button>
</form> 
 
<?php
 
 if (isset($_POST['number'])){
 if ($_POST['number']>0){
 switch ($_POST['figure']) 
 {
    case 'square':
    echo "<h2>Квадрат</h2>";
      $figure=new Square($_POST['number']);
        break;
    case 'circle':
    echo "<h2>Круг</h2>";
         $figure=new Circle($_POST['number']);
        break;
    case 'rectangle':
    echo "<h2>Прямоугольник</h2>";
         $figure=new Rectangle($_POST['number']);
 break;} 
 echo $figure->GetOut();}
 else {echo "Некорректный ввод данных";}
 }
 
?> 
 
</body>
</HTML>
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.03.2020, 13:04
Ответы с готовыми решениями:

Построить систему классов для описания плоских геометрических фигур
Ребята смотрите дана така задача: Построить систему классов для описания плоских геометрических фигур: круга, квадрата, прямоугольника....

Построить систему классов для описания плоских геометрических фигур
Построить систему классов для описания плоских геометрических фигур: круга, квадрата, прямоугольника. Предусмотреть методы для создания...

Построить систему классов для описания плоских геометрических фигур
Всем привет. Помогите пожалуйста сделать программу, ото совсем не получается и еще скоро курсовая. Построить систему классов для...

1
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
07.03.2020, 23:54
Лучший ответ Сообщение было отмечено Fitokiy как решение

Решение

Fitokiy, Очевидно, что для прямоугольника нужно 2 параметра. Для начала, прежде чем писать наследования давайте просто напишем классы.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Circle
{
    private $radius;
 
    public function __construct($radius)
    {
        $this->radius = $radius;
    }
 
    public function getPerimeter()
    {
        return 2 * pi() * $this->radius;
    }
 
    public function getArea()
    {
        return 2 * pi() * pow($this->radius, 2);
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Rectangle
{
    private $width;
    private $height;
 
    public function __construct(int $width, int $height)
    {
 
        $this->width = $width;
        $this->height = $height;
    }
 
    public function getPerimeter()
    {
        return ($this->width + $this->height) * 2;
    }
    
    public function getArea()
    {
        return $this->width * $this->height;
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Square
{
    private $side;
 
    public function __construct(int $side)
    {
 
        $this->side = $side;
    }
 
    public function getPerimeter()
    {
        return $this->side * 4;
    }
 
    public function getArea()
    {
        return pow($this->side, 2);
    }
}
Как мы видим, конструкторы классов отличаются. У них нет общего конструктора. Единственное, что их объединяет, это методы getPerimeter() и getArea(), которые исходят из условия задачи.

Далее если мы будем использовать такую конструкцию
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if ($_POST['number']>0){
    switch ($_POST['type'])
    {
        case 'square':
            echo "<h2>Квадрат</h2>";
            $figure=new Square($_POST['number']);
            echo $figure->getArea();
            break;
        case 'circle':
            echo "<h2>Круг</h2>";
            $figure=new Circle($_POST['number']);
            echo $figure->getArea();
            break;
        case 'rectangle':
            echo "<h2>Прямоугольник</h2>";
            $figure=new Rectangle($_POST['number']);
            echo $figure->getArea();
            break;
        default : echo "Некорректный ввод данных";
    }
}
То нет никакого смысла их наследовать от единого базового класса, так как мы и так имеем прямой доступ к конкретному объекту. Это имеет смысл, только если мы имеем некий объект, но точно не знаем какого типа. Для того, чтоб оправдать наличие базового класса вынесем логику создания объекта в фабричный метод.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
abstract class Figure
{
    const TYPE_CIRCLE = 'circle';
    const TYPE_SQUARE = 'square';
    const TYPE_RECTANGLE = 'rectangle';
 
    public static function create($type, $param1, $param2 = null): Figure
    {
        switch ($type) {
            case self::TYPE_CIRCLE: return new Circle($param1);
            case self::TYPE_SQUARE: return new Square($param1);
            case self::TYPE_RECTANGLE: return new Rectangle($param1, $param2);
        }
 
        throw new \Exception('Неизвестный тип фигуры');
    }
 
    abstract public function getName(): string;
    abstract public function getPerimeter(): int;
    abstract public function getArea(): int;
}
Мы добавили константы, так как срока типа используется в нескольких местах.

PHP/HTML
1
2
3
4
5
<select name="type">
        <option value="<?= Figure::TYPE_CIRCLE ?>" <?= $_POST['type'] === Figure::TYPE_CIRCLE ? 'selected' : '' ?>>Круг</option>
        <option value="<?= Figure::TYPE_RECTANGLE ?>" <?= $_POST['type'] === Figure::TYPE_RECTANGLE ? 'selected' : '' ?>>Прямоугольник</option>
        <option value="<?= Figure::TYPE_SQUARE ?>" <?= $_POST['type'] === Figure::TYPE_SQUARE ? 'selected' : '' ?>>Квадрат</option>
    </select>
Теперь мы можем сделать так.

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</php
$figure = null;
$error = null;
 
if (!empty($_POST)) {
    try {
        $figure = Figure::create($_POST['type'], $_POST['param1'], $_POST['param2']);
    } catch (Exception $e) {
        $error = $e->getMessage();
    }
}
 
?>
 
<?php if (!empty($error)): ?>
    <p style="color: red"><?= $error ?></p>
<?php endif ?>
 
<?php if (!empty($figure)): ?>
    <p>Фигура: <?= $figure->getName() ?></p>
    <p>Площадь: <?= $figure->getArea() ?></p>
    <p>Периметр: <?= $figure->getPerimeter() ?></p>
<?php endif ?>
 
<form method="post">
    <select name="type">
        <option value="<?= Figure::TYPE_CIRCLE ?>" <?= $_POST['type'] === Figure::TYPE_CIRCLE ? 'selected' : '' ?>>Круг</option>
        <option value="<?= Figure::TYPE_RECTANGLE ?>" <?= $_POST['type'] === Figure::TYPE_RECTANGLE ? 'selected' : '' ?>>Прямоугольник</option>
        <option value="<?= Figure::TYPE_SQUARE ?>" <?= $_POST['type'] === Figure::TYPE_SQUARE ? 'selected' : '' ?>>Квадрат</option>
    </select>
    <label>
        Параметр 1
        <input name="param1" value="<?= $_POST['param1'] ?>">
    </label>
    <label>
        Параметр 2
        <input name="param2" value="<?= $_POST['param2'] ?>">
    </label>
    <input type="submit" value="Рассчитать">
</form>
Далее уже наследуем классы, реализуя все необходимые методы. И добавим еще выброс исключений, для вывода ошибок.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Circle extends Figure
{
    private $radius;
 
    public function __construct($radius)
    {
        if (empty($radius)) {
            throw new \Exception('Не указан радиус круга');
        }
        $this->radius = $radius;
    }
 
    public function getName(): string
    {
        return 'Круг';
    }
 
    public function getPerimeter(): int
    {
        return 2 * pi() * $this->radius;
    }
 
    public function getArea(): int
    {
        return 2 * pi() * pow($this->radius, 2);
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Rectangle extends Figure
{
    private  $width;
    private $height;
 
    public function __construct(int $width, int $height)
    {
        if (empty($width)) {
            throw new \Exception('Не указана ширина прямоугольника');
        }
        if (empty($height)) {
            throw new \Exception('Не указана высота прямоугольника');
        }
        $this->width = $width;
        $this->height = $height;
    }
 
    public function getName(): string
    {
        return 'Прямоугольник';
    }
 
    public function getPerimeter(): int
    {
        return ($this->width + $this->height) * 2;
    }
    
    public function getArea(): int
    {
        return $this->width * $this->height;
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Square extends Figure
{
    private $side;
 
    public function __construct(int $side)
    {
        if (empty($side)) {
            throw new \Exception('Не указана сторона квадрата');
        }
        $this->side = $side;
    }
 
    public function getName(): string
    {
        return 'Квадрат';
    }
 
    public function getPerimeter(): int
    {
        return $this->side * 4;
    }
 
    public function getArea(): int
    {
        return pow($this->side, 2);
    }
}
Добавлено через 48 минут
Также можете добавить всевозможные выбросы исключений, ну к примеру если вдруг введут отрицательные значния.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Square extends Figure
{
    protected $side;
 
    public function __construct(int $side)
    {
        if (empty($side)) {
            throw new \Exception('Не указана сторона квадрата');
        }
        if ($side < 0) {
            throw new \Exception('Сторона квадрата не может быть отрицательной');
        }
        $this->side = $side;
    }
}
Добавлено через 3 минуты
Так как у нас указан тип int внутри конструкторов, то воизбежание ошибок нужно преобразовывать параметры в int. Т.е.

PHP
1
$figure = Figure::create($_POST['type'], (int)$_POST['param1'], (int)$_POST['param2']);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.03.2020, 23:54
Помогаю со студенческими работами здесь

Построить систему классов для описания плоских геометрических фигур
Здравствуйте. Прошу помощи) Вот сама задача Построить систему классов для описания плоских геометрических фигур: круг, квадрат,...

Построить систему классов для описания плоских геометрических фигур
C++ Построить систему классов для описания плоских геометрических фигур: круга, квадрата, прямоугольника. Предусмотреть методы для...

Построить систему классов для описания плоских геометрических фигур
ПОЖАЛУЙСТА ПОМОГИТЕ ИСПРАВИТЬ ПРОГРАММУ НА ПАСКАЛЕ!!!!! Var a of Real; n,ax,ay,axn,ayn,axn1,an2,ayn1,ayn2,cx,cy,i,r:Real; ...

Построить систему классов для описания плоских геометрических фигур на Java
Построить систему классов для описания плоских геометрических фигур: круга, квадрата, прямоугольника. Предусмотреть методы для создания...

Многофайловая система классов для описания плоских геометрических фигур
Помогите пожалуйста составить по данной программе многофайловую систему,а то у меня не получается реализовать корректную работу отдельных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru