Percursos
/
Crystal
Crystal
/
Exercícios
/
Computador de Navegação
Computador de Navegação

Computador de Navegação

Exercício de aprendizagem

Introdução

O Crystal tem vários tipos de números diferentes para fins diversos. Por exemplo, alguns tipos são mais rápidos, mas têm um intervalo de valores possíveis mais pequeno do que outros. Outros têm um intervalo de valores possíveis mais extenso, mas são mais lentos.

No Crystal, existem tipos de inteiros com sinal e sem sinal. Os tipos de inteiros com sinal podem ser positivos ou negativos. Os tipos de inteiros sem sinal só podem ser positivos.

Tipos de inteiros com sinal

Estes são os tipos de inteiros com sinal no Crystal:

Tipo Tamanho (bits) Intervalo
Int8 8 -128 a 127
Int16 16 -32_768 a 32_767
Int32 32 -2_147_483_648 a 2_147_483_647
Int64 64 -9_223_372_036_854_775_808 a 9_223_372_036_854_775_807
Int128 128 -170_141_183_460_469_231_731_687_303_715_884_105_728 a 170_141_183_460_469_231_731_687_303_715_884_105_727

Os tipos mais pequenos usam menos memória e são mais rápidos do que os maiores, mas têm um intervalo de valores possíveis mais pequeno.

Quando sabes que os valores vão estar dentro de um determinado intervalo, o melhor é usar o tipo mais pequeno possível, para poupar memória e melhorar o desempenho.

O tipo de inteiro predefinido é o Int32. Para declarares um inteiro com um tipo específico, podes usar o nome do tipo como sufixo, acrescentando <number>_I <bit>.

1_i8.class
# => Int8

Podes usar o método to_i<bit> para converter entre diferentes tipos de inteiros. O método to_i converte para o tipo de inteiro predefinido, o Int32.

1_i8.to_i16.class
# => Int16

2_i16.to_i.class
# => Int32

Tipos de inteiros sem sinal

Estes são os tipos de inteiros sem sinal no Crystal:

UInt8, UInt16, UInt32, UInt64, UInt128

A única diferença entre inteiros com sinal e sem sinal é que os inteiros sem sinal só podem ser positivos. Para declarares um inteiro sem sinal com um tipo específico, podes usar o nome do tipo como sufixo, acrescentando <number>_u<bit>. Podes usar o método to_u<bit> para converter entre diferentes tipos de inteiros sem sinal. O método to_u converte para o tipo de inteiro sem sinal predefinido, o UInt32.

1_u8.to_u16.class
# => UInt16

Tipos de vírgula flutuante

Estes são os tipos de vírgula flutuante no Crystal:

Tipo Tamanho (bits) Intervalo
Float32 32 1.2E-38 a 3.4E+38
Float64 64 2.3E-308 a 1.7E+308

Existem dois tipos de vírgula flutuante diferentes, um é mais preciso do que o outro.

O tipo de vírgula flutuante predefinido é o Float64.

Podes usar o método to_f<bit> para converter entre diferentes tipos de vírgula flutuante. O método to_f converte para o tipo de vírgula flutuante predefinido, o Float64.

Instruções

A ESA (Exercism Space Agency) está a planear a toda a velocidade uma nova missão a Phobos, uma lua de Marte. O objetivo da missão é aterrar uma sonda na superfície de Phobos e enviar de volta dados sobre a superfície. A ESA pediu a tua ajuda para construir o computador de navegação da sonda. O computador de navegação tem memória limitada, por isso precisamos de manter o uso de memória o mais baixo possível. Por isso, precisamos de usar os tipos de dados adequados.

1. Constantes de navegação

O computador de navegação precisa de saber a distância entre alguns objetos no espaço para fazer os cálculos corretos. A distância é medida em km.

Define as seguintes constantes:

  • NEPTUNE_DISTANCE com o valor 4_400_000_000, que deve ser guardado como um Int64
  • MARS_DISTANCE com o valor 227_940_000, que deve ser guardado como um Int32
  • ATMOSPHERE_DISTANCE com o valor 10_000, que deve ser guardado como um Int16

2. Análise correta da área

O computador de navegação precisa de saber a área de alguns objetos no espaço para fazer os cálculos corretos. Uma área NÃO pode ser negativa. Os engenheiros planearam o programa para gerar um erro de overflow quando a área fosse negativa. No entanto, os engenheiros esqueceram-se de mudar o inteiro com sinal para um inteiro sem sinal.

Por isso, os engenheiros gostariam de um programa que converta um inteiro com sinal num inteiro sem sinal.

Implementa o método Navigation#correct_area_analysis, que recebe uma measurement como argumento e devolve a área como um inteiro sem sinal de 32 bits.

Note

A área fornecida caberá sempre num inteiro sem sinal de 32 bits.

measurement = 52554
measurement.class
# => Int32

Navigation.new.correct_area_analysis(measurement)
# => 52554

Navigation.new.correct_area_analysis(measurement).class
# => UInt32

3. Calcular a velocidade

O computador de navegação precisa de saber a velocidade da sonda. A velocidade é medida em m/s.

Para calcular a velocidade, precisamos de saber a distância percorrida e o tempo que demorou a percorrê-la. Depois, pega na distância e divide-a pelo tempo.

A velocidade pode não ser exata e nunca será um número considerável. Por isso, podemos usar um Float32.

Implementa o método Navigation#calculate_velocity, que recebe distance e time como argumentos e devolve a velocidade como um Float de 32 bits.

distance = 52554
time = 2.5

Navigation.new.calculate_velocity(distance, time)
# => 21021.6

Navigation.new.calculate_velocity(distance, time).class
# => Float32
Editar via GitHub A ligação abre numa nova janela ou separador
Crystal Exercism

Estás pronto para começar Computador de Navegação?

Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.