Η Julia είναι μια γλώσσα προγραμματισμού γενικού σκοπού που μπορεί να χρησιμοποιηθεί για τις περισσότερες εργασίες προγραμματισμού. Στην πράξη, ωστόσο, οι κύριες περιπτώσεις χρήσης της τείνουν να βρίσκονται στη μηχανική και στις επιστήμες. Οι γρήγοροι, ευέλικτοι και εκλεπτυσμένοι αριθμητικοί υπολογισμοί βρίσκονται στο επίκεντρο του σχεδιασμού της.
Ένας ακέραιος είναι ένας "στρογγυλός" αριθμός χωρίς υποδιαστολή.
Στην έννοια Τα βασικά, είδαμε ότι μια ακέραια τιμή μπορεί να ανατεθεί σε μια μεταβλητή χωρίς να προσδιορίσουμε τον τύπο της.
Για λόγους αναγνωσιμότητας, μπορούν να χρησιμοποιηθούν κάτω παύλες ως διαχωριστικό ψηφίων. Ο μεταγλωττιστής τις αγνοεί.
julia> x = 3
3
julia> typeof(x)
Int64
julia> large_number = 1_234_567_890
1234567890
Δεν αποτελεί έκπληξη ότι οι αριθμοί κινητής υποδιαστολής έχουν υποδιαστολή και ένα κλασματικό μέρος μετά από αυτήν.
julia> f = 3.45
3.45
julia> typeof(f)
Float64
Φυσικά, ο επιστημονικός συμβολισμός υποστηρίζεται.
julia> avogadro = 6.02e23
6.02e23
Οι μέγιστες και οι ελάχιστες τιμές μπορεί να σου προκαλέσουν έκπληξη:
julia> typemax(Float64)
Inf
julia> typemin(Float64)
-Inf
Το άπειρο είναι μια έγκυρη τιμή!
Όπως συζητήθηκε στην έννοια Τα βασικά, οι αριθμητικοί τελεστές λειτουργούν ως επί το πλείστον όπως στα μαθηματικά που μαθαίνουν τα παιδιά στο σχολείο.
Σημείωσε ότι η ύψωση σε δύναμη χρησιμοποιεί ^, όχι ** (και τα δύο είναι κοινά σε άλλες γλώσσες).
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)
Ωστόσο, αξίζει να συζητήσουμε μερικές λεπτομέρειες που αφορούν ειδικά τη Julia.
julia> x = 4.2
4.2
julia> 2 * x
8.4
julia> 2x
8.4
julia> 2.4x
10.08
Αυτό μπορεί να σου φανεί περίεργο.
Είναι πάντα δυνατό να χρησιμοποιήσεις το * ως ενθηματικό τελεστή, όπως στις περισσότερες άλλες γλώσσες.
Ωστόσο, η Julia σχεδιάστηκε από ανθρώπους που πιστεύουν ότι ο κώδικας πρέπει να μοιάζει όσο το δυνατόν περισσότερο με μαθηματικές εξισώσεις.
Επειδή τα ονόματα των μεταβλητών πρέπει να ξεκινούν με γράμμα, η τοποθέτηση ενός αριθμού (ακέραιου ή κινητής υποδιαστολής) μπροστά από το όνομα αντιμετωπίζεται ως σιωπηρός πολλαπλασιασμός.
Για παράδειγμα, αν θέλουμε το εμβαδόν της επιφάνειας μιας σφαίρας, αντί για 4 * pi * r * r θα μπορούσαμε να κάνουμε αυτό:
julia> surface(r) = 4π * r^2
surface (generic function with 1 method)
julia> surface(3)
113.09733552923255
Αν και το π είναι μια ενσωματωμένη σταθερά, είναι επίσης ένα (ελληνικό) γράμμα.
Ο συντακτικός αναλυτής χρειάζεται επομένως ένα ρητό * για να ξεχωρίσει το π από το r.
Η χρήση του / ως ενθηματικού τελεστή δίνει πάντα αποτέλεσμα κινητής υποδιαστολής, ακόμη και για ακέραιες εισόδους.
Για την ακέραια διαίρεση, υπάρχουν περισσότερες επιλογές.
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
Η συνάρτηση div() προορίζεται για ακέραια διαίρεση, με το αποτέλεσμα να κόβεται προς το μηδέν: προς τα κάτω για θετικούς αριθμούς, προς τα πάνω για αρνητικούς.
Ως συνώνυμο, μπορούμε να χρησιμοποιήσουμε τον ενθηματικό τελεστή ÷, πάλι με στόχο να δείχνει πιο μαθηματικό.
Αν χρησιμοποιείς έναν editor που γνωρίζει τη Julia, πληκτρολόγησέ το ως \div και μετά πάτησε το πλήκτρο <Tab>.
Ο τελεστής // ξεφεύγει από το πεδίο αυτής της έννοιας.
Για την ώρα, αρκεί να πούμε ότι το αποτέλεσμα του // είναι ένας "ρήτος" αριθμός, αυτό που οι περισσότεροι αποκαλούν κλάσμα.
Αυτό μπορεί συχνά να γίνει αυτόματα:
julia> x = 2 + 3.5
5.5
julia> typeof(x)
Float64
Προσθέσαμε ένα Int64 σε ένα Float64 και πήραμε αποτέλεσμα Float64.
Στην πραγματικότητα, ο ακέραιος μετατράπηκε σιωπηρά σε Float64 πριν γίνει η πρόσθεση.
Οι μετατροπές από κινητής υποδιαστολής σε ακέραιο είναι αναπόφευκτα πιο περίπλοκες. Τι θέλεις να κάνεις με ό,τι βρίσκεται μετά την υποδιαστολή;
round() μετατρέπει στον πλησιέστερο ακέραιο αριθμό, με τις περιπτώσεις ακριβώς στη μέση, όπως το 4.5, να στρογγυλοποιούνται στον πλησιέστερο άρτιο ακέραιο.floor() στρογγυλοποιεί προς τα κάτω, η ceil() προς τα πάνω, η trunc() προς το μηδέν.Int32(), θα αποτύχει με ένα InexactError.Ωστόσο, από προεπιλογή αυτές οι συναρτήσεις δεν επιστρέφουν τον ακέραιο τύπο που μπορεί να ήθελες. Ο επιθυμητός τύπος εξόδου μπορεί να προσδιοριστεί.
julia> round(4.5)
4.0
julia> ceil(Int, 4.3)
5
Η στρογγυλοποίηση σε συγκεκριμένο αριθμό ψηφίων μετά την υποδιαστολή είναι επίσης δυνατή με τη λέξη-κλειδί digits.
julia> round(π, digits=10)
3.1415926536
Σίγουρα αυτό απλώς πετάει ένα σφάλμα; Στην πραγματικότητα, η κατάσταση δεν είναι τόσο απλή.
Η ακέραια διαίρεση με ÷ ή // θα προκαλέσει σφάλμα, όπως ίσως περιμένεις.
Η διαίρεση κινητής υποδιαστολής με / ακολουθεί μια προσέγγιση που θα μπορούσε να θεωρηθεί μηχανική, παρά μια τυπική προσέγγιση επιστήμης των υπολογιστών:
julia> 2 / 0
Inf
julia> 0 / 0
NaN
Όπως συζητήθηκε σε προηγούμενη ενότητα, το άπειρο είναι ένας έγκυρος αριθμός κινητής υποδιαστολής στη Julia και αναπαρίσταται με Inf.
Όταν ο αριθμητής είναι επίσης μηδέν, το αποτέλεσμα είναι μαθηματικά απροσδιόριστο.
Η Julia τότε το αντιμετωπίζει ως "μη αριθμό", που αναπαρίσταται με NaN.
Ο φίλος σου ο Chandler σχεδιάζει να επισκεφτεί εξωτικές χώρες σε όλο τον κόσμο. Δυστυχώς, ο Chandler δεν τα πάει καλά με τα μαθηματικά. Ανησυχεί αρκετά μήπως τον εξαπατήσουν τα ανταλλακτήρια συναλλάγματος στο ταξίδι του, και θέλει να του φτιάξεις έναν υπολογιστή συναλλάγματος. Αυτές είναι οι προδιαγραφές του για την εφαρμογή:
Δημιούργησε τη συνάρτηση exchange_money(), που δέχεται 2 παραμέτρους:
budget : Το ποσό των χρημάτων που σκοπεύεις να ανταλλάξεις.exchange_rate : Το ποσό του εγχώριου νομίσματος που αντιστοιχεί σε μία μονάδα ξένου νομίσματος.Αυτή η συνάρτηση πρέπει να επιστρέφει την αξία του νομίσματος που ανταλλάχθηκε.
Σημείωση: Αν το νόμισμά σου είναι το USD και θέλεις να ανταλλάξεις USD με EUR με ισοτιμία 1.20, τότε 1.20 USD == 1 EUR.
julia> exchange_money(127.5, 1.2)
106.25
Δημιούργησε τη συνάρτηση get_change(), που δέχεται 2 παραμέτρους:
budget : Το ποσό των χρημάτων πριν από την ανταλλαγή.exchanging_value : Το ποσό των χρημάτων που αφαιρείται από τον προϋπολογισμό για να ανταλλαχθεί.Αυτή η συνάρτηση πρέπει να επιστρέφει το ποσό των χρημάτων που περισσεύει από τον προϋπολογισμό.
julia> get_change(127.5, 120)
7.5
Δημιούργησε τη συνάρτηση get_value_of_bills(), που δέχεται 2 παραμέτρους:
denomination : Η αξία ενός μεμονωμένου χαρτονομίσματος.number_of_bills : Ο συνολικός αριθμός των χαρτονομισμάτων.Αυτό το ανταλλακτήριο συναλλάσσεται μόνο με μετρητά σε συγκεκριμένες αξίες. Το συνολικό ποσό που λαμβάνεις πρέπει να διαιρείται με την αξία ενός "χαρτονομίσματος" ή μονάδας, κάτι που μπορεί να αφήσει ένα κλάσμα ή ένα υπόλοιπο. Η συνάρτησή σου πρέπει να επιστρέφει μόνο τη συνολική αξία των χαρτονομισμάτων (χωρίς τα κλασματικά ποσά) που θα σου έδινε το ανταλλακτήριο. Δυστυχώς, το ανταλλακτήριο κρατάει το υπόλοιπο/τα ρέστα ως επιπλέον μπόνους.
julia> get_value_of_bills(5, 128)
640
Δημιούργησε τη συνάρτηση get_number_of_bills(), που δέχεται amount και denomination.
Αυτή η συνάρτηση πρέπει να επιστρέφει τον αριθμό των χαρτονομισμάτων που μπορείς να λάβεις μέσα στο δεδομένο ποσό. Με άλλα λόγια: πόσα ολόκληρα χαρτονομίσματα χωράνε στο αρχικό ποσό; Θυμήσου: μπορείς να λάβεις μόνο ολόκληρα χαρτονομίσματα, όχι κλάσματα χαρτονομισμάτων, οπότε θυμήσου να διαιρέσεις αναλόγως. Στην πράξη, στρογγυλοποιείς προς τα κάτω στο πλησιέστερο ολόκληρο χαρτονόμισμα/αξία.
julia> get_number_of_bills(127.5, 5)
25
Δημιούργησε τη συνάρτηση get_leftover_of_bills(), που δέχεται amount και denomination.
Αυτή η συνάρτηση πρέπει να επιστρέφει το ποσό που περισσεύει και δεν μπορεί να επιστραφεί από το αρχικό σου ποσό, δεδομένης της αξίας των χαρτονομισμάτων. Είναι πολύ σημαντικό να ξέρεις ακριβώς πόσα κρατάει το ανταλλακτήριο.
julia> get_leftover_of_bills(127.5, 20)
7.5
Δημιούργησε τη συνάρτηση exchangeable_value(), που δέχεται budget, exchange_rate, spread και denomination.
Η παράμετρος spread είναι το ποσοστό που κρατείται ως προμήθεια ανταλλαγής, γραμμένο ως ακέραιος αριθμός.
Πρέπει να μετατραπεί σε δεκαδικό διαιρώντας το με το 100.
Αν 1.00 EUR == 1.20 USD και το spread είναι 10, η συνολική ισοτιμία θα είναι στην πραγματικότητα: 1.00 EUR == 1.32 USD, επειδή το 10% του 1.20 είναι 0.12, και αυτή η επιπλέον προμήθεια προστίθεται στην ανταλλαγή.
Αυτή η συνάρτηση πρέπει να επιστρέφει τη μέγιστη αξία του νέου νομίσματος αφού υπολογίσεις την ισοτιμία συν το spread. Θυμήσου ότι η αξία του νομίσματος είναι ακέραιος αριθμός και δεν μπορεί να υποδιαιρεθεί.
Σημείωση: Η τιμή που επιστρέφεται πρέπει να είναι ακέραιου τύπου.
julia> exchangeable_value(127.25, 1.20, 10, 20)
80
julia> exchangeable_value(127.25, 1.20, 10, 5)
95
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Julia με 35 έννοιες128 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.