Πί

Πίνακες σε Common Lisp

6 ασκήσεις

Σχετικά με την έννοια Πίνακες

Στην Common Lisp, όπως και σε άλλες γλώσσες, ένας πίνακας είναι ένα σύνολο στοιχείων στα οποία έχεις πρόσβαση μέσω ακέραιων θέσεων. Οι τύποι των στοιχείων μπορούν να είναι ετερογενείς. Ο πίνακας μπορεί να είναι πολυδιάστατος (όχι απλώς μονοδιάστατος).

Δημιουργία

Το make-array σου επιτρέπει να δημιουργήσεις πίνακες. Έχει πολλές επιλογές, αλλά οι απλούστερες μορφές του σου επιτρέπουν να δημιουργήσεις N-διάστατους πίνακες με όλα τα στοιχεία αρχικοποιημένα σε μία μόνο τιμή ή με τον πίνακα αρχικοποιημένο στις τιμές μιας άλλης ακολουθίας (όπως μιας λίστας). Το πρώτο όρισμά του είναι μια λίστα με το μέγεθος κάθε διάστασης.

(make-array '(4) :initial-element 3)    ; => #(3 3 3 3)
(make-array '(2 2) :initial-element 'x) ; => #2A((X X) (X X))
(make-array '(3 3 3) 
  :initial-contents '(((a b c) (d e f) (g h i)) 
                      ((j k l) (m n o) (p q r)) 
                      ((s t u) (v w x) (y z &))))
                                        ; => #3A(((A B C) (D E F) (G H I))
                                                 ((J K L) (M N O) (P Q R))
                                                 ((S T U) (V W X) (Y Z &)))

(Παρατήρησε πώς οι N-διάστατοι πίνακες εκτυπώνονται με τον αριθμό των διαστάσεων.)

Οι πίνακες μπορούν επίσης να δημιουργηθούν χρησιμοποιώντας την ίδια μορφή με την οποία εκτυπώνονται:

#(x y z)         ; => #(X Y Z)
#2A((1 2) (3 4)) ; => #2A((1 2) (3 4))

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

Για να έχεις πρόσβαση σε στοιχεία ενός διανύσματος, χρησιμοποίησε το aref. Οι θέσεις ξεκινούν από το μηδέν. Ο αριθμός των θέσεων που δίνεις πρέπει να αντιστοιχεί στον βαθμό του πίνακα.

(aref #2A((1 2 3) (3 4 5)) 1 0) ; => 3
(aref #3A(((a b) (c d)) 
          ((e f) (g h)) 
          ((t u) (v w))) 
      2 0 1)                    ; => U
(aref #2A((1) (2)) 0)           ; => ERROR (because not enough indexes provided)

Επίσης, οι θέσεις που δίνεις πρέπει να είναι "εντός ορίων" με βάση τις διαστάσεις που δόθηκαν όταν δημιουργήθηκε ο πίνακας. Αυτό μπορεί να ελεγχθεί με το array-in-bounds-p:

(array-in-bounds-p #2A((1) (2)) 0 0) ; => T
(array-in-bounds-p #2A((1) (2)) 2 0) ; => NIL

Ένα στοιχείο μπορεί επίσης να προσπελαστεί με το row-major-aref, το οποίο δέχεται έναν μόνο ακέραιο που καθορίζει το στοιχείο σε διάταξη κατά γραμμές. (Η θέση κατά γραμμές μπορεί να υπολογιστεί από τις θέσεις μέσω του array-row-major-index.)

(array-row-major-index #2A((1 2 3) (4 5 6)) 1 1 ) ; => 4
(row-major-aref #2A((1 2 3) (4 5 6)) 4)           ; => 5

Κατηγόρημα

Για να προσδιορίσεις αν ένα αντικείμενο είναι πίνακας, μπορείς να χρησιμοποιήσεις το arrayp.

(arrayp #(1 2 3))            ; => T
(arrayp #2((1 2 3) (4 5 6))) ; => T
(arrayp (list 1 2 3))        ; => NIL

Ερωτήματα σχετικά με πίνακες

Διάφορες πληροφορίες για έναν πίνακα μπορούν να ανακτηθούν με τις παρακάτω συναρτήσεις:

  • array-rank για να πάρεις τον αριθμό των διαστάσεων του πίνακα (αναφέρεται ως ο βαθμός του πίνακα).
  • array-dimensions για να πάρεις μια λίστα με τα μεγέθη των διαστάσεων του πίνακα.
  • array-dimension για να πάρεις το μέγεθος μιας από τις διαστάσεις.
  • array-total-size για να πάρεις τον συνολικό αριθμό στοιχείων στον πίνακα.
(let ((array #3A(((0 1) (2 3) (4 5)) 
                 ((6 7) (8 9) (A B)) 
                 ((C D) (E F) (G H))
                 ((I J) (K L) (M N)))))
  (list (array-rank array)
        (array-dimensions array)
        (array-dimension array 1)
        (array-total-size array))) ; => (3 (4 3 2) 2 24)

Όρια στο μέγεθος των πινάκων

Το Πρότυπο της Common Lisp ορίζει κάποια όρια στο μέγιστο μέγεθος των πινάκων. Αυτά τα όρια είναι διαθέσιμα σε κάποιες καθορισμένες σταθερές:

  • array-rank-limit: ο μέγιστος επιτρεπόμενος αριθμός διαστάσεων ενός πίνακα (ορίζεται ότι δεν είναι μικρότερος από 8).
  • array-dimension-limit: το μέγιστο μέγεθος οποιασδήποτε διάστασης (ορίζεται ότι δεν είναι μικρότερο από 1024).
  • array-total-size-limit: ο μέγιστος αριθμός στοιχείων οποιουδήποτε πίνακα (ορίζεται ότι δεν είναι μικρότερος από 1024).
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Πίνακες

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 5 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Πίνακες