Kurzusok
/
Julia
Julia
/
Feladatok
/
Pénzváltás
Pénzváltás

Pénzváltás

Tanulófeladat

Bevezetés

A Julia egy általános célú nyelv, amellyel a legtöbb programozási feladat megoldható. A gyakorlatban azonban a fő felhasználási területek jellemzően a mérnöki tudományok és a természettudományok. A gyors, sokoldalú, kifinomult numerikus számítások a nyelv tervezésének középpontjában állnak.

Egész számok

Az egész szám egy „kerek” szám, amelynek nincs tizedespontja.

Az Alapok fogalomban láttuk, hogy egy egész szám érték hozzárendelhető egy változóhoz anélkül, hogy megadnánk a típusát.

Az olvashatóság érdekében aláhúzásjelekkel tagolhatod a számjegyeket. A fordító figyelmen kívül hagyja őket.

julia> x = 3
3

julia> typeof(x)
Int64

julia> large_number = 1_234_567_890
1234567890

Lebegőpontos számok

Nem meglepő, hogy a lebegőpontos számoknak van tizedespontjuk, és a pont után törtrészük következik.

julia> f = 3.45
3.45

julia> typeof(f)
Float64

Természetesen a tudományos jelölés is támogatott.

julia> avogadro = 6.02e23
6.02e23

A maximális és a minimális érték viszont meglepő lehet:

julia> typemax(Float64)
Inf

julia> typemin(Float64)
-Inf

A végtelen is érvényes érték!

Aritmetikai operátorok

Ahogy az Alapok fogalomban már szó volt róla, az aritmetikai operátorok többnyire ugyanúgy működnek, mint a gyerekeknek tanított hagyományos aritmetika. Vedd észre, hogy a hatványozásra a ^ szolgál, nem a ** (utóbbi más nyelvekben gyakori).

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)

Néhány Julia-specifikus részletről azonban érdemes beszélni.

Szorzás

julia> x = 4.2
4.2

julia> 2 * x
8.4

julia> 2x
8.4

julia> 2.4x
10.08

Ez meglepő lehet.

A * mindig használható infix operátorként, ahogy a legtöbb más programozási nyelvben is.

A Julia nyelvet azonban olyan emberek tervezték, akik szerint a kódnak a lehető legjobban hasonlítania kell a matematikai egyenletekre.

Mivel a változóneveknek betűvel kell kezdődniük, ha a név elé számot (egészt vagy lebegőpontost) írunk, azt a nyelv implicit szorzásnak tekinti.

Ha például egy gömb felszínét szeretnénk kiszámítani, a 4 * pi * r * r helyett ezt is írhatjuk:

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

julia> surface(3)
113.09733552923255

Bár a π beépített állandó, egyben egy (görög) betű is. A parsernek ezért még mindig kell egy explicit *, hogy elválassza a π-t a r-től.

Osztás

A / infix operátorként mindig lebegőpontos eredményt ad, még egész számok bemenet esetén is.

Egész osztásra több lehetőség is van.

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

A div() függvény egész osztásra való, az eredményt nulla felé csonkítja: pozitív számoknál lefelé, negatívoknál felfelé.

Szinonimaként használhatjuk a ÷ infix operátort, amivel megint csak a matematikai jellegét erősítjük. Ha olyan szerkesztőt használsz, amely ismeri a Julia nyelvet, írd be a \div szöveget, majd nyomd meg a <Tab> billentyűt.

A // operátor túlmutat e fogalom keretein. Egyelőre elég annyi, hogy a // eredménye egy „racionális” szám, amit a legtöbben törtnek neveznek.

A numerikus típusok átalakítása

Ez gyakran automatikusan is megtörténik:

julia> x = 2 + 3.5
5.5

julia> typeof(x)
Float64

Egy Int64-et adtunk egy Float64-hez, és Float64 eredményt kaptunk.

Valójában az egész szám az összeadás előtt észrevétlenül Float64-gé alakult át.

A lebegőpontosból egész számmá történő átalakítás óhatatlanul bonyolultabb. Mi legyen a tizedespont utáni résszel?

  • A round() függvény a legközelebbi egész számra kerekít, a döntetleneket, például a 4,5-öt, a legközelebbi páros egész számra kerekítve.
  • A floor() lefelé, a ceil() felfelé, a trunc() nulla felé kerekít.
  • Ha közvetlenül próbálod átalakítani, például az Int32()-vel, az InexactError hibával elszáll.

Alapértelmezés szerint azonban ezek a függvények nem az általad várt egész típust adják vissza. A kívánt kimeneti típus viszont megadható.

julia> round(4.5)
4.0

julia> ceil(Int, 4.3)
5

A tizedespont utáni megadott számú számjegyre kerekítés is lehetséges a digits kulcsszóval.

julia> round(π, digits=10)
3.1415926536

Nullával való osztás

Biztosan csak hibát dob ilyenkor? Valójában a helyzet nem ilyen egyszerű.

A ÷ vagy // operátorral végzett egész osztás hibát eredményez, ahogy az várható is.

A / operátorral végzett lebegőpontos osztás inkább mérnöki megközelítést követ, mint a szokásos számítástechnikai szemléletet:

julia> 2 / 0
Inf

julia> 0 / 0
NaN

Ahogy egy korábbi szakaszban szó volt róla, a végtelen a Julia nyelvben érvényes lebegőpontos szám, amelyet az Inf jelöl.

Ha a számláló is nulla, az eredmény matematikailag nem definiált. Ilyenkor a Julia „nem számként” kezeli, amelyet a NaN jelöl.

Utasítások

A barátod, Chandler egzotikus országokat szeretne bejárni a világ minden táján. Sajnos Chandler nem túl jó matekból. Eléggé aggódik, hogy az utazása során átverik a pénzváltóknál, ezért szeretné, ha készítenél neki egy valutakalkulátort. Íme, milyen elvárásai vannak az alkalmazással szemben:

1. Becsüld meg a váltás utáni értéket

Hozd létre az exchange_money() függvényt, amely 2 paramétert vár:

  1. budget : A pénzösszeg, amit be szeretnél váltani.
  2. exchange_rate : A hazai valuta azon mennyisége, amely egy egység külföldi valutával egyenlő.

A függvénynek a beváltott valuta értékét kell visszaadnia.

Megjegyzés: Ha a valutád USD, és USD-t szeretnél EUR-ra váltani 1.20-as árfolyamon, akkor 1.20 USD == 1 EUR.

julia> exchange_money(127.5, 1.2)
106.25

2. Számítsd ki a váltás után megmaradó valutát

Hozd létre a get_change() függvényt, amely 2 paramétert vár:

  1. budget : A váltás előtti pénzmennyiség.
  2. exchanging_value : A keretből a váltáshoz elvett pénzmennyiség.

A függvénynek a keretből megmaradó pénzmennyiséget kell visszaadnia.

julia> get_change(127.5, 120)
7.5

3. Számítsd ki a bankjegyek értékét

Hozd létre a get_value_of_bills() függvényt, amely 2 paramétert vár:

  1. denomination : Egyetlen bankjegy értéke.
  2. number_of_bills : A bankjegyek teljes száma.

Ez a pénzváltó csak bizonyos egységekben lévő készpénzzel foglalkozik. A kapott összegnek oszthatónak kell lennie egy „bankjegy" vagy egység értékével, ami után törtrész vagy maradék maradhat. A függvényednek csak a bankjegyek összértékét kell visszaadnia (a törtrészeket kizárva), amit a pénzváltó visszaadna. Sajnos a maradékot/visszajárót a pénzváltó megtarthatja bónuszként.

julia> get_value_of_bills(5, 128)
640

4. Számítsd ki a bankjegyek számát

Hozd létre a get_number_of_bills() függvényt amount és denomination paraméterekkel.

A függvénynek azt a valutabankjegy-számot kell visszaadnia, amit a megadott amount összegből kaphatsz. Más szóval: hány egész bankjegy fér bele a kiinduló összegbe? Ne feledd, csak egész bankjegyeket kaphatsz, nem a bankjegyek törtrészeit, ezért ennek megfelelően ossz. Valójában lefelé kerekítesz a legközelebbi egész bankjegyre/címletre.

julia> get_number_of_bills(127.5, 5)
25

5. Számítsd ki a bankjegyekre váltás után megmaradó összeget

Hozd létre a get_leftover_of_bills() függvényt amount és denomination paraméterekkel.

A függvénynek azt a megmaradó összeget kell visszaadnia, amit a kiinduló amount összegből a bankjegyek címlete miatt nem lehet visszaadni. Nagyon fontos pontosan tudni, mennyit tarthat meg a pénzváltó.

julia> get_leftover_of_bills(127.5, 20)
7.5

6. Számítsd ki a váltás utáni értéket

Hozd létre az exchangeable_value() függvényt budget, exchange_rate, spread és denomination paraméterekkel.

A spread paraméter a váltási díjként levont százalék, egész számként megadva. Tizedes törtté kell alakítani úgy, hogy elosztod 100-zal. Ha 1.00 EUR == 1.20 USD, és a spread 10, akkor a teljes árfolyam valójában ennyi lesz: 1.00 EUR == 1.32 USD, mert az 1.20 10%-a 0.12, és ez a további díj hozzáadódik a váltáshoz.

A függvénynek az új valuta maximális értékét kell visszaadnia az árfolyam és a spread kiszámítása után. Ne feledd, hogy a valuta címlete egész szám, és nem osztható tovább.

Megjegyzés: A visszaadott érték egész szám típusú legyen.

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

julia> exchangeable_value(127.25, 1.20, 10, 5)
95
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Julia Exercism

Készen állsz elkezdeni a(z) Pénzváltás feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.