Menu
Coddy logo textTech

Повторение: Калькулятор фигур

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 33 из 107.

challenge icon

Задание

Легко

Давайте создадим калькулятор фигур, который объединит все концепции интерфейсов из этой главы. Вы создадите систему, в которой различные геометрические фигуры могут обрабатываться единообразно через общий интерфейс, демонстрируя мощь полиморфизма в Go.

Вы распределите свой код по трем файлам:

  • shape.go: Определите интерфейс Shape с двумя методами: Area() float64 и Perimeter() float64. Также создайте функцию с именем DescribeShape, которая принимает любой Shape и возвращает отформатированную строку, показывающую как его площадь, так и периметр.
  • shapes.go: Создайте две структуры, реализующие интерфейс Shape:
    • Rectangle с полями Width и Height
    • Circle с полем Radius
    Каждая структура должна реализовывать методы Area() и Perimeter(), а также метод String() (реализующий интерфейс fmt.Stringer), который возвращает читаемое описание фигуры.
  • main.go: Считайте данные о фигурах из входного потока, создайте соответствующие фигуры и используйте функцию DescribeShape для отображения информации о каждой из них. Также выведите каждую фигуру напрямую, чтобы продемонстрировать работу интерфейса Stringer.

Будут предоставлены следующие входные данные:

  • Строка 1: Ширина прямоугольника (float)
  • Строка 2: Высота прямоугольника (float)
  • Строка 3: Радиус круга (float)

Для вычислений используйте 3.14159 в качестве значения числа пи. Периметр круга вычисляется как 2 * pi * radius.

Ваши методы String() должны возвращать:

  • Rectangle: Rectangle(Width x Height)
  • Circle: Circle(Radius: R)

Ваша функция DescribeShape должна возвращать:

Area: [area], Perimeter: [perimeter]

Форматируйте все значения с плавающей точкой с двумя знаками после запятой, используя %.2f.

Например, для входных данных 4, 3 и 5 ваш вывод должен быть следующим:

Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42

Сначала выведите саму фигуру (используя её метод String()), а затем её описание из DescribeShape. Сначала обработайте прямоугольник, затем круг.

Попробуйте сами

package main

import (
	"fmt"
)

func main() {
	// Считать входные значения
	var width, height, radius float64
	fmt.Scanln(&width)
	fmt.Scanln(&height)
	fmt.Scanln(&radius)

	// TODO: Создать Rectangle с заданными width и height

	// TODO: Создать Circle с заданным radius

	// TODO: Вывести rectangle (использует метод String())
	// TODO: Вывести описание rectangle, используя DescribeShape()

	// TODO: Вывести circle (использует метод String())
	// TODO: Вывести описание circle, используя DescribeShape()
}

Все уроки раздела Объектно-ориентированное программирование