Το Στέκι των Πληροφορικών

Γενικό Λύκειο => Μονοδιάστατοι πίνακες => Γ΄ Λυκείου => Εισαγωγή στοιχείων, εμφάνιση και υπολογισμοί => Μήνυμα ξεκίνησε από: humus στις 27 Μαρ 2007, 06:04:56 μμ

Τίτλος: Help ολίσθηση
Αποστολή από: humus στις 27 Μαρ 2007, 06:04:56 μμ
Πως γίνεται η ολίσθηση πίνακα προς τα δεξιά ή αριστερά κατα μ θέσεις?
Τίτλος: Απ: Help ολίσθηση
Αποστολή από: evry στις 27 Μαρ 2007, 11:07:30 μμ

  Εξαρτάται πως ορίζεις την ολίσθηση, εννοείς ότι πάει κυκλικά, δηλαδή το τελευταίο στοιχείο γίνεται πρώτο ή χάνεται?
   Προφανώς θα έχεις μια επανάληψη (για κάθε θέση που μετακινείται) στην οποία θα παίζει κάτι του στυλ
       α[i+1]=a για ολίσθηση δεξιά και   a[i-1] = a για ολίσθηση αριστερά.
Τίτλος: Απ: Help ολίσθηση
Αποστολή από: humus στις 28 Μαρ 2007, 01:23:35 μμ
Sorry, εννοούσα ολίσθηση κυκλικά κατα μ θέσεις χωρίς να χάνονται κελιά του πίνακα.Υποθέτω οτι χρειάζεται καινούργιος πίνακας. Γίνεται χωρίς την χρήση νέου βοηθητικού πίνακα?

Ευχαριστώ εκ των προτέρων.
Τίτλος: Απ: Help ολίσθηση
Αποστολή από: alkisg στις 28 Μαρ 2007, 03:00:46 μμ
Χε χε ωραίο θέμα! Όχι βέβαια για το μάθημα, για κανέναν διαγωνισμό πληροφορικής ίσως!  ;D
Επισυνάπτω μια λύση χωρίς δεύτερο πίνακα.

Την επισυνάπτω σε αρχείο για να κάνω δοκιμές για μια καινούργια δυνατότητα που προσπαθώ να φτιάξω στο φόρουμ, να έχει προεπισκόπηση επισυναπτόμενων αρχείων κώδικα.
Τίτλος: Απ: Help ολίσθηση
Αποστολή από: humus στις 29 Μαρ 2007, 10:50:59 πμ
Σε ευχαριστώ πολύ.Ήταν πολύ χρήσιμη η βοήθειά σου.
Τίτλος: Απ: Help ολίσθηση
Αποστολή από: MichaelP στις 03 Δεκ 2008, 02:53:27 πμ
Φίλοι μου,
Άσχετα με το παραπάνω topic που αναφέρεται ο φιλος στην ολίσθηση πίνακα,
μολις πριν απο λιγο διαπιστωσα μια, πως να το πώ...ασυμμετρία της ολίσθησης (shift), που αναφέρεται στο 2ο κεφάλαιο, την οποία θα ηθελα να σχολιάσω και να μοιραστώ μαζί σας.

Εστω ο δυαδικος :         101101 = (45)10
Ολισθηση αριστερα (Χ2) :1011010 = (90)10
Ολισθηση δεξια (Div 2) :  010110 = (22)10

Παρατηρειτε την ασσυμετρια; Γιατι το Χ2 να εχει 7 ψηφια και το DIV 2, 6; Ενταξει, μη μου πειτε γιατι τοσο κανει... το ξερω το θεμα ειναι γιατι;

Τίτλος: Απ: Help ολίσθηση
Αποστολή από: ntzios kostas στις 03 Δεκ 2008, 08:28:23 πμ
Μιχάλη ας υποθέσουμε ότι το μέγεθος του αριθμού είναι ένα byte, σκέψου ότι αποθηκεύονται στη μνήμη σε πολλαπλάσια του byte. Τότε
ο αρχικός αριθμός μου είναι 00101101 και όχι 101101
Ολίσθηση αριστερα : 01011010
Ολίσθηση δεξια του αρχικού αριθμού: 00010110
Άρα όλα έχουν 8 ψηφία, δεν έχει ούτε 6 ούτε 7.

Ελπίζω να σε κάλυψα.
Φιλικά Κώστας
Τίτλος: Απ: Help ολίσθηση
Αποστολή από: gpapargi στις 03 Δεκ 2008, 01:44:11 μμ
Πως γίνεται η ολίσθηση πίνακα προς τα δεξιά ή αριστερά κατα μ θέσεις?

Στην κυκλική μετάθεση μπορείς (εκτός από την απάντηση του Άλκη) να μην κουνήσεις τα στοιχεία του πίνακα αλλά να αλλάξεις τον τρόπο που τα βλέπεις παίζοντας με τους δείκτες.
Δηλαδή αντί για ι θα βάζεις το δείκτη (ι-1+μ) mod ν +1 που υλοποιεί την κυκλική ολίσθηση σε επίπεδο δείκτη. Μπορείς να βάλεις ένα νέο δείκτη που θα δείχνει στην ολισθημένη θέση. Έτσι εσύ θα βλέπεις κανονικά το δείκτη κ και αυτός από πίσω θα δείχνει στην αληθινή θέση του πίνακα.

Πχ μια εμφάνιση των ν στοιχείων του πίνακα με κυκλική μετάθεση μ μπορεί να γίνει ως εξής:

Για ι από 1 μέχρι ν
  Εμφάνισε α[(ι-1+μ) mod ν +1]
Τέλος_επανάληψης

Ή αλλιώς (με νέο δείκτη κ)

Για ι από 1 μέχρι ν   ! σαρώνω για όλα τα στοιχεία
  κ<-(ι-1+μ) mod ν +1   ! βρίσκω την αληθινή θέση
  Εμφάνισε α[κ]            ! εκτυπώνω
Τέλος_επανάληψης

Μια ακόμα υλοποίηση είναι να φτιάξεις μια συνάρτηση που θα δέχεται το ι και θα σου γυρίζει την πραγματική θέση f(ι).

Τίτλος: Απ: Help ολίσθηση
Αποστολή από: MichaelP στις 03 Δεκ 2008, 08:57:06 μμ
To σκεύθηκα αλλα στη περίπτωση του 11111111 ?

Μ.
Τίτλος: Απ: Help ολίσθηση
Αποστολή από: Laertis στις 03 Δεκ 2008, 09:49:27 μμ
Τότε ο αριθμός είναι 16 bit (2 byte) γιατί αλλιώς δε μπορεί να γίνει 2πλασιασμός αν ο καταχωρητής είναι 8 bit (ολίσθηση αριστερά) οπότε είναι :

0000000011111111   και

Ολίσθηση αριστερα : 0000000111111110

Ολίσθηση δεξιά : 00000000011111111
Τίτλος: Απ: Help ολίσθηση
Αποστολή από: ntzios kostas στις 03 Δεκ 2008, 10:47:41 μμ
Συμφωνώ με τον Laerti. Αν βέβαια θέλεις συνεχείς διπλασιασμούς τότε έχουμε φαινόμενο υπερχείλισης , με αποτέλεσμα από ένα σημείο και μετά, να έχουμε λάθος αποτελέσματα, είτε χρησιμοποιείς 8 είτε οποιονδήποτε άλλον αριθμό ψηφίων.

Για παράδειγμα αν είχαμε τον 8-bit αριθμό, 
11111111 = 255

τότε διπλασιασμός επί δύο θα είχε ως αποτέλεσμα, αν δεν κάνω λάθος, τον αριθμό
11111110=254 (φαινόμενο υπερχείλισης)
Τίτλος: Απ: Help ολίσθηση
Αποστολή από: MichaelP στις 04 Δεκ 2008, 01:16:01 πμ
Ναι ναι σωστά, ευχαριστώ...
Άρα και ο 10000000 πρέπει να καταχωρηθει σε 16bit καταχωρητη διότι αλλιώς, πως θα γίνει ο διπλασιασμος, σωστα;
Δηλ: 0000000010000000


Ευχαριστώ.