Track
/
Swift
Swift
/
Esercizi
/
Tariffe da freelance
Tariffe da freelance

Tariffe da freelance

Esercizio di apprendimento

Introduzione

Numeri

Swift fornisce due categorie principali di numeri: i numeri interi e i numeri in virgola mobile.

  • I numeri interi rappresentano numeri privi di parte frazionaria, come 0, 1, -1, 42 e -273.
  • I numeri in virgola mobile rappresentano numeri con una parte frazionaria, come 0.0, 3.14 e -1.36969e-10.

Puoi inserire dei trattini bassi nei letterali numerici per migliorarne la leggibilità: 1_000_000 è identico a 1000000. I letterali in virgola mobile si possono scrivere in notazione decimale o esponenziale.

Nella maggior parte dei casi, usi Int per i numeri interi e Double per i numeri in virgola mobile:

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

Operatori aritmetici

Swift fornisce i operatori aritmetici standard per i calcoli numerici:

Operatore Descrizione Esempio
+ Addizione 4 + 6 vale 10
- Sottrazione 15 - 10 vale 5
* Moltiplicazione 2 * 3 vale 6
Caution

Swift è type-safe e non permette di mescolare tipi numerici diversi nelle operazioni aritmetiche. Non puoi sommare o moltiplicare direttamente un Int e un Double: devi prima convertire un tipo per farlo corrispondere all'altro.

Divisione

L'operatore / esegue la divisione. Quando entrambi gli operandi sono numeri interi, la divisione intera tronca l'eventuale parte frazionaria:

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

Dividere un numero in virgola mobile diverso da zero per zero dà come risultato inf o -inf. Dividere 0.0 per 0.0 produce nan (Not a Number). Al contrario, dividere un numero intero per zero causa un errore in fase di compilazione o di esecuzione:

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

Operatore resto

L'operatore resto (%) calcola il resto che rimane dopo aver diviso due numeri interi:

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

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

In Swift, % è un vero operatore di resto, non un operatore modulo. Il risultato prende sempre il segno del primo operando (il dividendo), indipendentemente dal segno del secondo operando:

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

Arrotondare i numeri in virgola mobile

Puoi arrotondare un numero in virgola mobile usando il metodo rounded(). Per impostazione predefinita, rounded() arrotonda all'intero più vicino. Puoi anche specificare una regola di arrotondamento, come .up o .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

Inferenza di tipo

Quando dichiari una costante o una variabile numerica senza annotazione di tipo, Swift ne deduce il tipo:

  • I numeri interi sono di tipo Int per impostazione predefinita.
  • I numeri con un punto decimale sono di tipo Double per impostazione predefinita.
let x = 42         // Inferred as Int
let y = 42.0       // Inferred as Double
let z: Double = 42 // Explicitly typed as Double

Conversione di tipo

Per eseguire operazioni tra valori di tipi diversi, converti un valore usando gli inizializzatori di tipo come Double(_:) o 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)

Istruzioni

In questo esercizio scriverai del codice per aiutare un freelancer a comunicare con i propri clienti i prezzi di alcuni progetti. Scriverai alcune funzioni ausiliarie per calcolare rapidamente i costi per i clienti.

1. Calcola la tariffa giornaliera a partire da una tariffa oraria

Un cliente contatta il freelancer per chiedere informazioni sulle sue tariffe. Il freelancer spiega che lavora 8 ore al giorno. Tuttavia, il freelancer conosce solo la propria tariffa oraria per il progetto. Aiutalo a stimare una tariffa giornaliera a partire da una tariffa oraria.

Implementa la funzione dailyRateFrom(hourlyRate:), che prende l'argomento hourlyRate, che contiene la tariffa oraria del freelancer.
La funzione dovrebbe restituire la tariffa giornaliera calcolata in base alla tariffa oraria.

dailyRateFrom(hourlyRate: 60)
// Returns 480.0

La tariffa giornaliera restituita dovrebbe essere un Double.

2. Calcola la tariffa mensile, a partire da una tariffa oraria e da uno sconto

A volte un cliente è interessato ad assumere il freelancer per un periodo più lungo. Il freelancer è disposto a concedere uno sconto al cliente, ma solo se il cliente lo assume per almeno un mese. In totale ci sono 22 giorni lavorativi. Aiuta il freelancer a calcolare la tariffa mensile, a partire dalla sua tariffa oraria e dalla percentuale di sconto applicata alla tariffa fissa che è disposto a concedere, arrotondando al numero intero più vicino.

Implementa la funzione monthlyRateFrom(hourlyRate:withDiscount:), che prende gli argomenti hourlyRate, che contiene la tariffa oraria del freelancer, e withDiscount, che contiene lo sconto che il freelancer è disposto a concedere al cliente. La funzione dovrebbe restituire la tariffa mensile arrotondata al numero intero più vicino.

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

3. Calcola il numero di giorni lavorativi a partire da un budget, una tariffa oraria e uno sconto

Un altro giorno, un project manager propone al freelancer di lavorare a un progetto con un budget fisso. Dato il budget fisso e la tariffa oraria del freelancer, aiutalo a calcolare il numero di giorni che lavorerebbe fino a esaurire il budget. Tieni presente che in questo scenario il freelancer è sempre disposto a concedere lo sconto, indipendentemente dal numero di giorni. Il risultato deve essere arrotondato per difetto al numero intero più vicino.

Implementa la funzione workdaysIn(budget:hourlyRate:withDiscount:), che prende gli argomenti:

  • budget, che contiene il budget per il progetto.
  • hourlyRate, che contiene la tariffa oraria del freelancer.
  • withDiscount, che contiene lo sconto che il freelancer è disposto a concedere al cliente.

La funzione dovrebbe restituire il numero di giorni lavorativi che il freelancer lavorerà al progetto, arrotondato per difetto.

workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Swift Exercism

Vuoi iniziare Tariffe da freelance?

Iscriviti a Exercism per imparare e padroneggiare Swift con 35 concetti116 esercizi e il mentoring di persone reali, tutto gratis.