Trilhas
/
Go
Go
/
Exercícios
/
Gross Store
Gross Store

Gross Store

Exercício de aprendizagem

Introdução

Em Go, map é um tipo de dados embutido que mapeia chaves para valores. Em outras linguagens de programação, você pode conhecer o conceito de map como dicionário, tabela hash, armazenamento de chave/valor ou array associativo.

Sintaticamente, map tem esta forma:

map[KeyType]ElementType

Também é importante saber que cada chave é única, ou seja, atribuir a mesma chave duas vezes vai sobrescrever o valor da chave correspondente.

Para criar um map, você pode 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 você pode 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 você tentar recuperar o valor de uma chave que não existe no map, ele vai retornar o valor zero do tipo do valor. Isso pode confundir você, principalmente se o valor padrão do seu ElementType (por exemplo, 0 para um int) for um valor válido. Para verificar se uma chave existe no seu map, você pode usar

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

Instruções

Uma pessoa amiga sua tem uma loja de atacado antiga chamada Gross Store. O nome vem da quantidade dos itens que a loja vende: tudo é medido em unidade de grosa. Seu amigo pediu que você implementasse um sistema de ponto de venda (PDV) para a loja dele. Primeiro, você quer construir um protótipo dele. No seu protótipo, seu sistema vai apenas registrar a quantidade. Seu amigo te deu uma lista de medidas para ajudar você:

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

1. Armazene a unidade de medida no seu programa

Para usar a medida, você precisa armazenar a medida no seu programa.

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

2. Crie uma nova conta de cliente

Você precisa implementar uma função que cria uma nova conta (vazia) para o cliente.

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

3. Adicione um item à conta do cliente

Para implementar isso, você vai precisar:

  • Retornar false se a unit informada não estiver no mapa units.
  • Caso contrário, adicione o item à bill do cliente, indexado pelo nome do item, e então retorne true.
  • Se o item já estiver presente na conta, aumente a quantidade dele pelo valor correspondente à unit informada.
bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)

Repare que o valor retornado é do tipo bool.

4. Remova um item da conta do cliente

Para implementar isso, você vai precisar:

  • Retornar false se o item informado não estiver na conta
  • Retornar false se a unit informada não estiver no mapa units.
  • Retornar false se a nova quantidade ficar menor que 0.
  • Se a nova quantidade for 0, remova o item completamente da bill e retorne true.
  • Caso contrário, reduza a quantidade do item e retorne true.
bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)

Repare que o valor retornado é do tipo bool.

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

Para implementar isso, você vai precisar:

  • Retornar 0 e false se o item não estiver na conta.
  • Caso contrário, retorne a quantidade do item 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

Repare que os valores retornados são dos tipos int e bool.

Editar via GitHub O link abre em uma nova janela ou aba
Go Exercism

Tudo pronto para começar Gross Store?

Crie sua conta no Exercism para aprender e dominar Go com 34 conceitos165 exercícios e mentoria humana de verdade, tudo de graça.