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 criar uma calculadora de formas que reúne todos os conceitos de interfaces deste capítulo. Você criará um sistema no qual 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. Crie também uma função chamada DescribeShape que aceite qualquer Shape e retorne uma string formatada mostrando tanto sua área quanto seu perímetro.
  • shapes.go: Crie duas estruturas que implementem a interface Shape:
    • Um Rectangle com os campos Width e Height
    • Um Circle com um campo Radius
    Cada estrutura deve implementar os métodos Area() e Perimeter(), além de um método String() (implementando fmt.Stringer) que retorne uma descrição legível da forma.
  • main.go: Leia os dados das formas da entrada, crie as formas apropriadas e use sua função DescribeShape para exibir informações sobre cada uma delas. Imprima também cada forma diretamente para demonstrar a interface Stringer.

As seguintes entradas serão fornecidas:

  • Linha 1: largura do Rectangle (float)
  • Linha 2: altura do Rectangle (float)
  • Linha 3: raio do Circle (float)

Para os cálculos, use 3.14159 como o valor de pi. O perímetro do Circle é 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, dadas as entradas 4, 3 e 5, sua saída deverá 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()) e, em seguida, sua descrição usando DescribeShape. Processe o rectangle primeiro e depois o circle.

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

Pratique por conta própria: Compilador de Go online