Track
/
Julia
Julia
/
Esercizi
/
Cambio valuta
Cambio valuta

Cambio valuta

Esercizio di apprendimento

Introduzione

Julia è un linguaggio di uso generale che può essere usato per la maggior parte dei compiti di programmazione. In pratica, però, i casi d'uso principali tendono a essere nell'ingegneria e nella scienza. Calcoli numerici veloci, versatili e sofisticati sono al centro della sua progettazione.

Numeri interi

Un numero intero è un numero «tondo», senza punto decimale.

Nel concetto Basi, abbiamo visto che un valore intero può essere assegnato a una variabile senza specificare un tipo.

Per leggibilità, si possono usare i trattini bassi come separatore delle cifre. Il compilatore li ignora.

julia> x = 3
3

julia> typeof(x)
Int64

julia> large_number = 1_234_567_890
1234567890

Numeri in virgola mobile

Non sorprenderà che i numeri in virgola mobile abbiano un punto decimale e una parte frazionaria dopo il punto.

julia> f = 3.45
3.45

julia> typeof(f)
Float64

Naturalmente, la notazione scientifica è supportata.

julia> avogadro = 6.02e23
6.02e23

I valori massimo e minimo potrebbero sorprendere:

julia> typemax(Float64)
Inf

julia> typemin(Float64)
-Inf

L'infinito è un valore valido!

Operatori aritmetici

Come discusso nel concetto Basi, gli operatori aritmetici funzionano per lo più come l'aritmetica standard, quella insegnata ai bambini. Tieni presente che l'elevamento a potenza usa ^, non ** (entrambi sono comuni in altri linguaggi).

2 + 3  # 5 (addition)
2 - 3  # -1 (subtraction)
2 * 3  # 6 (multiplication)
8 / 2  # 4.0 (division)
8 % 3  # 2 (remainder)
2 ^ 3  # 8 (exponentiation)

Tuttavia, vale la pena discutere alcuni dettagli specifici di Julia.

Moltiplicazione

julia> x = 4.2
4.2

julia> 2 * x
8.4

julia> 2x
8.4

julia> 2.4x
10.08

Questo potrebbe sorprendere.

È sempre possibile usare * come operatore infisso, come nella maggior parte degli altri linguaggi di programmazione.

Tuttavia, Julia è stata progettata da persone convinte che il codice debba assomigliare il più possibile a equazioni matematiche.

Poiché i nomi delle variabili devono iniziare con una lettera, anteporre un numero (intero o in virgola mobile) al nome viene trattato come moltiplicazione implicita.

Per esempio, se vogliamo l'area della superficie di una sfera, invece di 4 * pi * r * r potremmo fare così:

julia> surface(r) = 4π * r^2
surface (generic function with 1 method)

julia> surface(3)
113.09733552923255

Sebbene π sia una costante integrata nel linguaggio, è anche una lettera (greca). Il parser ha quindi comunque bisogno di un * esplicito per separare π da r.

Divisione

Usare / come operatore infisso dà sempre un risultato in virgola mobile, anche per input interi.

Per la divisione intera ci sono più opzioni.

julia> 10 / 3  # floating-point division
3.3333333333333335

julia> div(10, 3)  # integer division
3

julia> 10 ÷ 3  # synonym for div()
3

julia> 10 // 3  # rational number (fraction)
10//3

La funzione div() serve per la divisione intera, con il risultato troncato verso lo zero: verso il basso per i numeri positivi, verso l'alto per quelli negativi.

Come sinonimo possiamo usare l'operatore infisso ÷, sempre con l'obiettivo di rendere il tutto più matematico. Se stai usando un editor che conosce Julia, digita \div e poi premi il tasto <Tab>.

L'operatore // va oltre lo scopo di questo concetto. Per ora ci basta dire che il risultato di // è un numero «razionale», che la maggior parte delle persone chiama frazione.

Conversione dei tipi numerici

Spesso questo può avvenire automaticamente:

julia> x = 2 + 3.5
5.5

julia> typeof(x)
Float64

Abbiamo sommato un Int64 a un Float64 e ottenuto un risultato Float64.

In realtà, l'intero è stato convertito silenziosamente in Float64 prima di eseguire la somma.

Le conversioni da virgola mobile a intero sono inevitabilmente più complicate. Cosa vuoi fare con la parte dopo il punto decimale?

  • La funzione round() converte al numero intero più vicino; nei casi di parità come 4.5, arrotonda al numero intero pari più vicino.
  • floor() arrotonda verso il basso, ceil() verso l'alto, trunc() verso lo zero.
  • Tentare un cast diretto, per esempio con Int32(), fallisce con un InexactError.

Tuttavia, per impostazione predefinita queste funzioni non restituiscono il tipo intero che forse avresti voluto. È possibile specificare il tipo di output desiderato.

julia> round(4.5)
4.0

julia> ceil(Int, 4.3)
5

È anche possibile arrotondare a un numero specificato di cifre dopo il punto decimale usando la parola chiave digits.

julia> round(π, digits=10)
3.1415926536

Divisione per zero

Di sicuro questo genera semplicemente un errore? In realtà la situazione non è così semplice.

La divisione intera con ÷ o // produce un errore, come ti aspetteresti.

La divisione in virgola mobile con / adotta quello che si potrebbe considerare un approccio ingegneristico, piuttosto che un approccio informatico standard:

julia> 2 / 0
Inf

julia> 0 / 0
NaN

Come discusso in una sezione precedente, l'infinito è un numero in virgola mobile valido in Julia, rappresentato da Inf.

Quando anche il numeratore è zero, il risultato è matematicamente indefinito. Julia lo tratta allora come «non un numero», rappresentato da NaN.

Istruzioni

Il tuo amico Chandler ha in programma di visitare paesi esotici in giro per il mondo. Purtroppo, Chandler non è bravo in matematica. Teme molto di essere truffato dagli uffici di cambio durante il viaggio, e vuole che tu gli crei un calcolatore di valute. Ecco le specifiche che ha in mente per l'app:

1. Stima il valore dopo il cambio

Crea la funzione exchange_money(), che prende 2 parametri:

  1. budget : la somma di denaro che hai intenzione di cambiare.
  2. exchange_rate : la quantità di valuta nazionale equivalente a una unità di valuta estera.

Questa funzione deve restituire il valore della valuta scambiata.

Nota: se la tua valuta è in USD e vuoi cambiare USD in EUR con un tasso di cambio di 1.20, allora 1.20 USD == 1 EUR.

julia> exchange_money(127.5, 1.2)
106.25

2. Calcola quanto denaro resta dopo un cambio

Crea la funzione get_change(), che prende 2 parametri:

  1. budget : la somma di denaro prima del cambio.
  2. exchanging_value : la somma di denaro che viene presa dal budget per essere cambiata.

Questa funzione deve restituire la somma di denaro che rimane dal budget.

julia> get_change(127.5, 120)
7.5

3. Calcola il valore delle banconote

Crea la funzione get_value_of_bills(), che prende 2 parametri:

  1. denomination : il valore di una singola banconota.
  2. number_of_bills : il numero totale di banconote.

Questo chiosco di cambio tratta solo contanti in determinati tagli. Il totale che ricevi deve essere divisibile per il valore di una «banconota» o unità, il che può lasciare una frazione o un resto. La funzione deve restituire solo il valore totale delle banconote (escludendo le frazioni) che il chiosco ti darebbe indietro. Purtroppo, il chiosco si tiene il resto come bonus aggiuntivo.

julia> get_value_of_bills(5, 128)
640

4. Calcola il numero di banconote

Crea la funzione get_number_of_bills(), che prende amount e denomination.

Questa funzione deve restituire il numero di banconote che puoi ricevere entro l'amount dato. In altre parole: quante banconote intere entrano nella somma iniziale? Ricorda: puoi ricevere solo banconote intere, non frazioni di banconota, quindi ricordati di dividere di conseguenza. In pratica, stai arrotondando per difetto alla banconota intera più vicina.

julia> get_number_of_bills(127.5, 5)
25

5. Calcola quanto avanza dopo il cambio in banconote

Crea la funzione get_leftover_of_bills(), che prende amount e denomination.

Questa funzione deve restituire l'importo avanzato che non può essere restituito a partire dall'amount iniziale, data la denominazione delle banconote. È molto importante sapere esattamente quanto si tiene il chiosco.

julia> get_leftover_of_bills(127.5, 20)
7.5

6. Calcola il valore dopo il cambio

Crea la funzione exchangeable_value(), che prende budget, exchange_rate, spread e denomination.

Il parametro spread è la percentuale trattenuta come commissione di cambio, scritta come numero intero. Va convertita in decimale dividendola per 100. Se 1.00 EUR == 1.20 USD e lo spread è 10, il tasso di cambio totale sarà in realtà: 1.00 EUR == 1.32 USD, perché il 10% di 1.20 è 0.12, e questa commissione aggiuntiva si somma al cambio.

Questa funzione deve restituire il valore massimo della nuova valuta dopo aver calcolato il tasso di cambio più lo spread. Ricorda che la denominazione della valuta è un numero intero e non può essere suddivisa.

Nota: il valore restituito deve essere di tipo intero.

julia> exchangeable_value(127.25, 1.20, 10, 20)
80

julia> exchangeable_value(127.25, 1.20, 10, 5)
95
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Julia Exercism

Vuoi iniziare Cambio valuta?

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