Percursos
/
Go
Go
/
Exercícios
/
Gross Store
Gross Store

Gross Store

Exercício de aprendizagem

Introdução

Em Go, map é um tipo de dados incorporado que associa chaves a valores. Noutras linguagens de programação, podes estar familiarizado com o conceito de map como um dicionário, uma tabela de hash, um armazenamento de chave/valor ou um array associativo.

Sintaticamente, map tem este aspeto:

map[KeyType]ElementType

É também importante saber que cada chave é única, ou seja, atribuir a mesma chave duas vezes sobrescreve o valor da chave correspondente.

Para criar um map, podes fazer:

  // With map literal
  foo := map[string]int{}

ou

  // or with make function
  foo := make(map[string]int)

Aqui estão algumas operações que podes fazer com um map

  // Add a value in a map with the `=` operator:
  foo["bar"] = 42
  // Here we update the element of `bar`
  foo["bar"] = 73
  // To retrieve a map value, you can use
  baz := foo["bar"]
  // To delete an item from a map, you can use
  delete(foo, "bar")

Se tentares obter o valor de uma chave que não existe no map, este devolve o valor zero do tipo do valor. Isto pode confundir-te, sobretudo se o valor predefinido do teu ElementType (por exemplo, 0 para um int) for um valor válido. Para verificar se uma chave existe no teu map, podes usar

  value, exists := foo["baz"]
  // If the key "baz" does not exist,
  // value: 0; exists: false

Instruções

Um amigo teu tem uma loja grossista antiga chamada Gross Store. O nome vem da quantidade de artigos que a loja vende: é tudo vendido em grosas. O teu amigo pediu-te para implementares um sistema de ponto de venda (POS) para a loja. Primeiro, queres criar um protótipo para ele. No teu protótipo, o sistema só vai registar a quantidade. O teu amigo deu-te uma lista de medidas para te ajudar:

Unidade Valor
quarter_of_a_dozen 3
half_of_a_dozen 6
dozen 12
small_gross 120
gross 144
great_gross 1728

1. Guarda a unidade de medida no teu programa

Para usares a medida, precisas de a guardar no teu programa.

units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)

2. Cria uma nova conta de cliente

Precisas de implementar uma função que cria uma nova conta (vazia) para o cliente.

bill := NewBill()
fmt.Println(bill)
// Output: map[]

3. Adiciona um artigo à conta do cliente

Para implementares isto, vais precisar de:

  • Devolver false se a unit indicada não estiver no mapa units.
  • Caso contrário, adicionar o artigo à bill do cliente, indexado pelo nome do artigo, e devolver true.
  • Se o artigo já existir na conta, aumentar a quantidade no valor correspondente à unit indicada.
bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)

Repara que o valor devolvido é do tipo bool.

4. Remove um artigo da conta do cliente

Para implementares isto, vais precisar de:

  • Devolver false se o artigo indicado não estiver na conta.
  • Devolver false se a unit indicada não estiver no mapa units.
  • Devolver false se a nova quantidade for inferior a 0.
  • Se a nova quantidade for 0, remover completamente o artigo da bill e devolver true.
  • Caso contrário, reduzir a quantidade do artigo e devolver true.
bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)

Repara que o valor devolvido é do tipo bool.

5. Devolve a quantidade de um artigo específico que está na conta do cliente

Para implementares isto, vais precisar de:

  • Devolver 0 e false se o item não estiver na conta.
  • Caso contrário, devolver a quantidade do artigo na bill e true.
bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true

Repara que os valores devolvidos são dos tipos int e bool.

Editar via GitHub A ligação abre numa nova janela ou separador
Go Exercism

Estás pronto para começar Gross Store?

Inscreve-te no Exercism para aprenderes e dominares Go com 34 conceitos165 exercícios, e mentoria humana real, tudo grátis.