Percursos
/
Swift
Swift
/
Exercícios
/
Tarifas de freelancer
Tarifas de freelancer

Tarifas de freelancer

Exercício de aprendizagem

Introdução

Números

O Swift disponibiliza duas categorias principais de números: os números inteiros e os números de vírgula flutuante.

Podes inserir sublinhados nos literais numéricos para os tornar mais legíveis: 1_000_000 é idêntico a 1000000. Os literais de vírgula flutuante podem ser escritos em notação decimal ou exponencial.

Na maioria dos casos, usas Int para os números inteiros e Double para os números de vírgula flutuante:

let speed: Int = 42                           // Explicit Int
let pi: Double = 3.14                         // Explicit Double
let giga: Double = 1_000_000_000              // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34  // Double in scientific notation

Operadores aritméticos

O Swift disponibiliza operadores aritméticos padrão para cálculos numéricos:

Operador Descrição Exemplo
+ Adição 4 + 6 dá 10
- Subtração 15 - 10 dá 5
* Multiplicação 2 * 3 dá 6
Caution

O Swift tem segurança de tipos e não permite misturar tipos numéricos diferentes nas operações aritméticas. Não podes somar ou multiplicar diretamente um Int e um Double; primeiro tens de converter um dos tipos para corresponder ao outro.

Divisão

O operador / efetua a divisão. Quando ambos os operandos são números inteiros, a divisão inteira trunca qualquer resto fracionário:

5.0 / 2.0 // 2.5 (Double division)
5 / 2     // 2 (integer division truncates the remainder)

Dividir um número de vírgula flutuante diferente de zero por zero dá inf ou -inf. Dividir 0.0 por 0.0 produz nan (não é um número). Em contrapartida, dividir um número inteiro por zero provoca um erro de compilação ou de execução:

print(5.0 / 0.0)  // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0)  // Prints nan

// The following line will not compile:
// print(5 / 0) // Error: Division by zero

Operador de resto

O operador de resto (%) calcula o resto que sobra depois de dividir dois números inteiros:

5 % 2  // 1
-5 % 2 // -1

// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
Note

No Swift, o % é um verdadeiro operador de resto, e não um operador de módulo. O resultado tem sempre o sinal do primeiro operando (o dividendo), independentemente do sinal do segundo operando:

5 % -2  // 1
-5 % 2  // -1

Arredondar números de vírgula flutuante

Podes arredondar um número de vírgula flutuante com o método rounded(). Por omissão, rounded() arredonda para o número inteiro mais próximo. Também podes indicar uma regra de arredondamento específica, como .up ou .down:

let x = 3.14
let y = x.rounded()      // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up)   // 4.0

Inferência de tipos

Quando declaras uma constante ou variável numérica sem anotação de tipo, o Swift infere o tipo:

  • Os números inteiros são, por omissão, do tipo Int.
  • Os números com parte decimal são, por omissão, do tipo Double.
let x = 42         // Inferred as Int
let y = 42.0       // Inferred as Double
let z: Double = 42 // Explicitly typed as Double

Conversão de tipos

Para efetuar operações entre valores de tipos diferentes, converte um dos valores com inicializadores de tipo como Double(_:) ou Int(_:):

let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0

let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)

Instruções

Neste exercício, vais escrever código para ajudar um freelancer a comunicar com um gestor de projeto. A tua tarefa é fornecer alguns utilitários para calcular rapidamente os valores diários e mensais, opcionalmente com um determinado desconto.

Começamos por estabelecer algumas regras entre o freelancer e o gestor de projeto:

  • O valor diário é 8 vezes o valor por hora.
  • Um mês tem 22 dias faturáveis.

Por vezes, o freelancer oferece aplicar um desconto no seu valor diário (por exemplo, para os clientes mais leais ou para clientes sem fins lucrativos).

Os descontos são modelados como números fracionários que representam percentagens, por exemplo, 25.0 (25%).

1. Calcula o valor diário a partir do valor por hora

Implementa uma função chamada dailyRateFrom para calcular o valor diário, recebendo o valor por hora como parâmetro. O contrato define que um dia tem 8 horas faturáveis.

dailyRateFrom(hourlyRate: 60)
// Returns 480.0

O valor diário devolvido deve ser um Double.

2. Calcula o valor mensal a partir do valor por hora e de um desconto

Implementa uma função monthlyRateFrom para calcular o valor mensal com desconto. Recebe dois parâmetros: o valor por hora e o desconto em percentagem.

monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129

O valor mensal devolvido deve ser arredondado por excesso (para cima) ao número inteiro mais próximo.

3. Calcula o número de dias úteis completos a partir de um orçamento, do valor por hora e de um desconto

Implementa uma função workdaysIn que recebe um orçamento, um valor por hora e um desconto, e calcula quantos dias úteis completos isso cobre.

workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0

O número de dias devolvido deve ser arredondado por defeito (para baixo) ao número inteiro seguinte.

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

Estás pronto para começar Tarifas de freelancer?

Inscreve-te no Exercism para aprenderes e dominares Swift com 35 conceitos116 exercícios, e mentoria humana real, tudo grátis.