Διαδρομές
/
Crystal
Crystal
/
Ασκήσεις
/
Λίστα γλωσσών
Λίστα γλωσσών

Λίστα γλωσσών

Άσκηση εκμάθησης

Εισαγωγή

Ο πίνακας είναι μια δομή δεδομένων που μπορεί να τροποποιηθεί και αποθηκεύει μια συλλογή στοιχείων ενός συγκεκριμένου τύπου. Ένας πίνακας είναι μια δομή δεδομένων με προσπέλαση ανά θέση. Το ότι οι πίνακες μπορούν να τροποποιηθούν σημαίνει ότι αν κληθεί πάνω σε έναν πίνακα μια μέθοδος που τον τροποποιεί, ο πίνακας θα τροποποιηθεί. Δηλαδή δεν δημιουργείται νέος πίνακας, αλλά τροποποιείται ο υπάρχων.

Για να δημιουργήσεις έναν πίνακα, χρησιμοποίησε τη σύνταξη δήλωσης κυριολεκτικού πίνακα ([]) και μέσα της καθόρισε τα στοιχεία του πίνακα χωρισμένα με κόμμα.

[1, 2, 3] # => [1, 2, 3]

Η Crystal συμπεραίνει τον τύπο του πίνακα από τα στοιχεία.

[1, 2, 3].class # => Array(Int32)

Πίνακες με πολλαπλούς τύπους

Ακόμα κι αν αναφέραμε παραπάνω ότι οι πίνακες είναι μια συλλογή στοιχείων ενός συγκεκριμένου τύπου, μπορείς να δημιουργήσεις έναν πίνακα με πολλαπλούς τύπους χρησιμοποιώντας τύπους ένωσης. Αυτό επιτρέπει στον πίνακα να περιέχει στοιχεία οποιουδήποτε από τους τύπους που καθορίζονται στον τύπο ένωσης. Η Crystal συμπεραίνει τον τύπο του πίνακα από τα στοιχεία.

[1, "2", 3.0] # => [1, "2", 3.0]

[1, "2", 3.0].class # => Array(Int32 | Float64 | String)

Πολυδιάστατοι πίνακες

Ένας πολυδιάστατος πίνακας είναι ένας πίνακας από πίνακες. Αυτό σημαίνει ότι κάθε στοιχείο του πίνακα είναι και το ίδιο ένας πίνακας. Αυτό μπορεί να φανεί χρήσιμο όταν θέλεις να αποθηκεύσεις δεδομένα σε μορφή πίνακα με γραμμές και στήλες. Για να ορίσεις έναν πολυδιάστατο πίνακα, μπορείς είτε να γράψεις τον κυριολεκτικό πίνακα από πίνακες είτε να χρησιμοποιήσεις τον κατασκευαστή Array.new.

[[1, 2], [3, 4]]                    # => [[1, 2], [3, 4]]
numbers = Array(Array(Int32)).new() # => []
numbers << [1, 2]                   # => [[1, 2]]

Προσθήκη στοιχείου σε έναν πίνακα

Για να προσθέσεις ένα στοιχείο σε έναν πίνακα, χρησιμοποίησε τον τελεστή << (προσάρτηση).

[1, 2, 3] << 4 # => [1, 2, 3, 4]

Ο τύπος του στοιχείου που θέλεις να προσθέσεις πρέπει να είναι ίδιος με τον τύπο του πίνακα· αν δεν είναι, θα πεταχτεί ένα σφάλμα.

numbers : Array(Int32 | Float64) = [1, 2, 3]
numbers << 4.0
numbers # => [1, 2, 3, 4.0]

numbers << "5" # => Error: no overload matches 'Array(Int32 | Float64)#<<' with type String

Μέγεθος ενός πίνακα

Όπως και με τη String, μπορείς να πάρεις το μέγεθος ενός πίνακα χρησιμοποιώντας τη μέθοδο size.

[1, 2, 3].size # => 3

Κενοί πίνακες

Ο μεταγλωττιστής δεν μπορεί να συμπεράνει τον τύπο του πίνακα όταν δημιουργείς έναν κενό πίνακα. Επομένως, πρέπει να καθορίσεις τον τύπο του πίνακα. Αυτό μπορεί να γίνει καθορίζοντας τον τύπο του πίνακα, χρησιμοποιώντας τη λέξη-κλειδί of, ή χρησιμοποιώντας τη σύνταξη αρχικοποίησης του πίνακα, που είναι Array(T).new.

[] of (Int32 | Float64 | String)    # => []
Array(Int32 | Float64 | String).new # => []

Πρόσβαση στα στοιχεία

Όπως και με τη String, μπορείς να έχεις πρόσβαση σε στοιχεία ενός πίνακα χρησιμοποιώντας τον τελεστή [] (θέση) και δίνοντάς του τη θέση του στοιχείου στο οποίο θέλεις να έχεις πρόσβαση. Αν η θέση είναι εκτός ορίων, θα πεταχτεί ένα IndexError.

[1, 2, 3][0] # => 1

[1, 2, 3][3] # => Index out of bounds (IndexError)

Μπορείς επίσης να έχεις πρόσβαση σε στοιχεία χρησιμοποιώντας ένα διάστημα.

[1, 2, 3][0..1] # => [1, 2]

Δημιουργία πίνακα από ένα διάστημα

Για να δημιουργήσεις έναν πίνακα από ένα διάστημα, χρησιμοποίησε τη μέθοδο to_a. Αυτό μπορεί να φανεί χρήσιμο όταν θέλεις να δημιουργήσεις έναν πίνακα από αριθμούς.

(1..3).to_a # => [1, 2, 3]

Δημιουργία πίνακα από μια συμβολοσειρά

Για να δημιουργήσεις έναν πίνακα από μια συμβολοσειρά, χρησιμοποίησε τη μέθοδο split. Αυτό σου επιτρέπει να χωρίσεις μια συμβολοσειρά σε έναν πίνακα από συμβολοσειρές χρησιμοποιώντας έναν διαχωριστή.

"1,2,3".split(",") # => ["1", "2", "3"]

Μπορείς επίσης να πάρεις έναν πίνακα από χαρακτήρες από μια συμβολοσειρά χρησιμοποιώντας τη μέθοδο chars.

"123".chars # => ['1', '2', '3']

Για να μετατρέψεις έναν πίνακα από Char ή String σε String, μπορείς να χρησιμοποιήσεις τη μέθοδο join, η οποία παίρνει έναν διαχωριστή ως όρισμα.

['1', '2', '3'].join(".") # => "1.2.3"

Διαγραφή στοιχείου από έναν πίνακα

Όταν θέλεις να διαγράψεις ένα στοιχείο από το τέλος ενός πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο pop, η οποία παίρνει ένα προαιρετικό όρισμα που καθορίζει πόσα στοιχεία θα αφαιρεθούν από το τέλος του πίνακα. Η μέθοδος επιστρέφει το στοιχείο που αφαιρέθηκε. Αν ο πίνακας είναι κενός, θα πεταχτεί ένα IndexError.

numbers = [1, 2, 3]
numbers.pop # => 3
numbers     # => [1, 2]

empty_numbers = [] of Int32
empty_numbers.pop # => Index out of bounds (IndexError)

Όταν θέλεις να διαγράψεις από έναν πίνακα το στοιχείο μιας συγκεκριμένης θέσης, μπορείς να χρησιμοποιήσεις τη μέθοδο delete_at, η οποία παίρνει ως όρισμα τη θέση του στοιχείου που θα αφαιρεθεί. Αν ο πίνακας είναι κενός, θα πεταχτεί ένα IndexError.

numbers = [1, 2, 3]
numbers.delete_at(1) # => 2
numbers              # => [1, 3]

empty_numbers = [] of Int32
empty_numbers.delete_at(0) # => Index out of bounds (IndexError)

Τροποποίηση τιμών σε έναν πίνακα

Όταν θέλεις να τροποποιήσεις ένα στοιχείο μιας συγκεκριμένης θέσης σε έναν πίνακα, μπορείς να χρησιμοποιήσεις τον τελεστή []= (ανάθεση σε θέση), ο οποίος παίρνει ως ορίσματα τη θέση του στοιχείου που θα τροποποιηθεί και τη νέα τιμή. Αν η θέση είναι εκτός ορίων, θα πεταχτεί ένα IndexError.

numbers = [1, 2, 3]
numbers[1] = 4
numbers # => [1, 4, 3]

numbers[3] = 5 # => Index out of bounds (IndexError)

Οδηγίες

Σε αυτή την άσκηση θα χρειαστεί να υλοποιήσεις κάποιες μεθόδους για να χειριστείς έναν πίνακα γλωσσών προγραμματισμού.

1. Όρισε μια μέθοδο που να επιστρέφει έναν κενό πίνακα γλωσσών

Όρισε τη μέθοδο LanguageList.list που δεν παίρνει ορίσματα και επιστρέφει έναν κενό πίνακα του τύπου Array(String).

LanguageList.list()
# => []

2. Όρισε μια μέθοδο που να προσθέτει μια γλώσσα στον πίνακα

Όρισε τη μέθοδο LanguageList.add που παίρνει 2 ορίσματα (έναν πίνακα γλωσσών και μια συμβολοσειρά που περιέχει μια γλώσσα). Η μέθοδος θα πρέπει να επιστρέφει τον πίνακα με τη νέα γλώσσα προστιθέμενη στο τέλος του πίνακα.

language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]

3. Όρισε μια μέθοδο που να αφαιρεί μια γλώσσα από τον πίνακα

Όρισε τη μέθοδο LanguageList.remove που παίρνει 1 όρισμα (έναν πίνακα γλωσσών). Η μέθοδος θα πρέπει να επιστρέφει τον πίνακα χωρίς το τελευταίο στοιχείο. Υπέθεσε ότι ο πίνακας θα έχει πάντα τουλάχιστον ένα στοιχείο.

language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
language_list = LanguageList.remove(language_list)
# => ["Crystal"]

4. Όρισε μια μέθοδο που να επιστρέφει το ν-οστό στοιχείο του πίνακα

Όρισε τη συνάρτηση LanguageList.at που παίρνει 2 ορίσματα (έναν πίνακα γλωσσών και μια θέση). Η μέθοδος θα πρέπει να επιστρέφει τη γλώσσα στη θέση ν του πίνακα. Υπέθεσε ότι στη θέση αυτή θα υπάρχει πάντα μια γλώσσα.

language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
LanguageList.at(language_list, 1)
# => "Ruby"

5. Όρισε μια μέθοδο που να αναλύει μια συμβολοσειρά γλωσσών

Όρισε τη μέθοδο LanguageList.parse που παίρνει 1 όρισμα (μια συμβολοσειρά που περιέχει γλώσσες χωρισμένες με κόμμα). Η μέθοδος θα πρέπει να επιστρέφει έναν πίνακα γλωσσών.

LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Crystal Exercism

Έτοιμος να ξεκινήσεις την άσκηση Λίστα γλωσσών;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.