Menu
Coddy logo textTech

Recapitulação - Calculadora de Formas

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 33 de 107.

challenge icon

Desafio

Fácil

Vamos construir uma calculadora de formas que reúne todos os conceitos de interface deste capítulo. Você criará um sistema onde diferentes formas geométricas podem ser processadas uniformemente por meio de uma interface compartilhada, demonstrando o poder do polimorfismo em Go.

Você organizará seu código em três arquivos:

  • shape.go: Defina uma interface Shape com dois métodos: Area() float64 e Perimeter() float64. Também crie uma função chamada DescribeShape que aceita qualquer Shape e retorna uma string formatada mostrando tanto sua área quanto seu perímetro.
  • shapes.go: Crie duas structs que implementam a interface Shape:
    • Um Rectangle com os campos Width e Height
    • Um Circle com um campo Radius
    Cada struct deve implementar os métodos Area() e Perimeter(), além de um método String() (implementando fmt.Stringer) que retorna uma descrição legível da forma.
  • main.go: Leia os dados da forma a partir da entrada, crie as formas apropriadas e use sua função DescribeShape para exibir informações sobre cada uma. Também imprima cada forma diretamente para demonstrar a interface Stringer.

As seguintes entradas serão fornecidas:

  • Linha 1: Largura do retângulo (float)
  • Linha 2: Altura do retângulo (float)
  • Linha 3: Raio do círculo (float)

Para os cálculos, use 3.14159 como o valor de pi. O perímetro do círculo é 2 * pi * radius.

Seus métodos String() devem retornar:

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

Sua função DescribeShape deve retornar:

Area: [area], Perimeter: [perimeter]

Formate todos os valores float com duas casas decimais usando %.2f.

Por exemplo, dados 4, 3 e 5, sua saída deve ser:

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

Imprima cada forma primeiro (usando seu método String()), depois sua descrição de DescribeShape. Processe o retângulo primeiro, depois o círculo.

Experimente você mesmo

package main

import (
	"fmt"
)

func main() {
	// Lê os valores de entrada
	var width, height, radius float64
	fmt.Scanln(&width)
	fmt.Scanln(&height)
	fmt.Scanln(&radius)

	// TODO: Create a Rectangle com os valores de width e height fornecidos

	// TODO: Create a Circle com o radius fornecido

	// TODO: Print o rectangle (usa o método String())
	// TODO: Print a descrição do rectangle usando DescribeShape()

	// TODO: Print o circle (usa o método String())
	// TODO: Print a descrição do circle usando DescribeShape()
}

Todas as lições de Programação Orientada a Objetos