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

Tarifas de freelancer

Exercício de aprendizagem

Introdução

Números

O Swift oferece duas categorias principais de números: inteiros e números de ponto flutuante.

  • Inteiros representam números inteiros sem parte fracionária, como 0, 1, -1, 42 e -273.
  • Números de ponto flutuante representam números com uma parte fracionária, como 0.0, 3.14 e -1.36969e-10.

Você pode inserir sublinhados em literais numéricos para melhorar a legibilidade: 1_000_000 é idêntico a 1000000. Literais de ponto flutuante podem ser escritos em notação decimal ou exponencial.

Na maioria dos casos, você usa Int para inteiros e Double para números de ponto 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 oferece operadores aritméticos padrão para cálculos numéricos:

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

O Swift é type-safe e não permite misturar tipos numéricos diferentes em operações aritméticas. Você não pode somar ou multiplicar um Int e um Double diretamente; é preciso converter um dos tipos para que ele corresponda ao outro primeiro.

Divisão

O operador / realiza a divisão. Quando os dois operandos são 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 ponto flutuante diferente de zero por zero resulta em inf ou -inf. Dividir 0.0 por 0.0 produz nan (Not a Number). Em contraste, dividir um inteiro por zero causa 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 após a divisão de dois inteiros:

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

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

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

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

Arredondamento de Números de Ponto Flutuante

Você pode arredondar um número de ponto flutuante usando o método rounded(). Por padrão, rounded() arredonda para o inteiro mais próximo. Você também pode fornecer 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 você declara uma constante ou variável numérica sem anotação de tipo, o Swift infere o tipo dela:

  • Números inteiros têm Int como padrão.
  • Números com ponto decimal têm Double como padrão.
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 realizar operações entre valores de tipos diferentes, converta um dos valores usando 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, você vai escrever código para ajudar um freelancer a se comunicar com um gerente de projetos. Sua tarefa é fornecer alguns utilitários para calcular rapidamente os valores diários e mensais, opcionalmente com um desconto informado.

Primeiro, estabelecemos algumas regras entre o freelancer e o gerente de projetos:

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

Às vezes, o freelancer se oferece para aplicar um desconto sobre o valor diário (por exemplo, para os clientes mais fiéis ou para clientes sem fins lucrativos).

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

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

Implemente uma função chamada dailyRateFrom para calcular o valor diário a partir de um 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 retornado deve ser um Double.

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

Implemente uma função monthlyRateFrom para calcular o valor mensal com desconto. Ela recebe dois parâmetros: um valor por hora e o desconto em porcentagem.

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

O valor mensal retornado deve ser arredondado para cima (usando o teto) para o número inteiro mais próximo.

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

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

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

O número de dias retornado deve ser arredondado para baixo (usando o piso) para o próximo número inteiro.

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

Tudo pronto para começar Tarifas de freelancer?

Crie sua conta no Exercism para aprender e dominar Swift com 35 conceitos116 exercícios e mentoria humana de verdade, tudo de graça.