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.
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
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!
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.
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.
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.
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?
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.floor() lefelé, a ceil() felfelé, a trunc() nulla felé kerekít.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
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.
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:
Hozd létre az exchange_money() függvényt, amely 2 paramétert vár:
budget : A pénzösszeg, amit be szeretnél váltani.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
Hozd létre a get_change() függvényt, amely 2 paramétert vár:
budget : A váltás előtti pénzmennyiség.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
Hozd létre a get_value_of_bills() függvényt, amely 2 paramétert vár:
denomination : Egyetlen bankjegy értéke.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
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
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
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
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.