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 os seus clientes sobre os preços de determinados projetos. Vais escrever algumas funções utilitárias para calcular rapidamente os custos para os clientes.

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

Um cliente contacta o freelancer para perguntar pelos seus preços. O freelancer explica que trabalha 8 horas por dia. No entanto, o freelancer só conhece o valor por hora do projeto. Ajuda o freelancer a estimar um valor diário com base no valor por hora.

Implementa a função dailyRateFrom(hourlyRate:), que recebe o argumento hourlyRate, que contém o valor por hora do freelancer.
A função deve devolver o valor diário com base no valor por hora.

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

Por vezes, um cliente está interessado em contratar o freelancer por um período mais longo. O freelancer está disposto a dar um desconto ao cliente, mas só se o cliente o contratar por, pelo menos, um mês. No total, há 22 dias úteis. Ajuda o freelancer a calcular o valor mensal a partir do valor por hora e da percentagem de desconto aplicada ao valor base que está disposto a conceder, arredondado ao número inteiro mais próximo.

Implementa a função monthlyRateFrom(hourlyRate:withDiscount:), que recebe os argumentos hourlyRate, que contém o valor por hora do freelancer, e withDiscount, que contém o desconto que o freelancer está disposto a dar ao cliente. A função deve devolver o valor mensal arredondado ao número inteiro mais próximo.

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

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

Noutro dia, um gestor de projeto propõe ao freelancer trabalhar num projeto com um orçamento fixo. Dado o orçamento fixo e o valor por hora do freelancer, ajuda-o a calcular o número de dias que trabalharia até o orçamento se esgotar. Tem em conta que, neste cenário, o freelancer está sempre disposto a dar o desconto, independentemente do número de dias contratados. O resultado tem de ser arredondado por defeito ao número inteiro mais próximo.

Implementa a função workdaysIn(budget:hourlyRate:withDiscount:), que recebe os argumentos:

  • budget, que contém o orçamento do projeto.
  • hourlyRate, que contém o valor por hora do freelancer.
  • withDiscount, que contém o desconto que o freelancer está disposto a dar ao cliente.

A função deve devolver o número de dias úteis que o freelancer vai trabalhar no projeto, arredondado por defeito.

workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
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.