Help ολίσθηση

Ξεκίνησε από humus, 27 Μαρ 2007, 06:04:56 ΜΜ

« προηγούμενο - επόμενο »

humus

Πως γίνεται η ολίσθηση πίνακα προς τα δεξιά ή αριστερά κατα μ θέσεις?

evry


  Εξαρτάται πως ορίζεις την ολίσθηση, εννοείς ότι πάει κυκλικά, δηλαδή το τελευταίο στοιχείο γίνεται πρώτο ή χάνεται?
   Προφανώς θα έχεις μια επανάληψη (για κάθε θέση που μετακινείται) στην οποία θα παίζει κάτι του στυλ
       α[i+1]=a για ολίσθηση δεξιά και   a[i-1] = a για ολίσθηση αριστερά.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

humus

Sorry, εννοούσα ολίσθηση κυκλικά κατα μ θέσεις χωρίς να χάνονται κελιά του πίνακα.Υποθέτω οτι χρειάζεται καινούργιος πίνακας. Γίνεται χωρίς την χρήση νέου βοηθητικού πίνακα?

Ευχαριστώ εκ των προτέρων.

alkisg

Χε χε ωραίο θέμα! Όχι βέβαια για το μάθημα, για κανέναν διαγωνισμό πληροφορικής ίσως!  ;D
Επισυνάπτω μια λύση χωρίς δεύτερο πίνακα.

Την επισυνάπτω σε αρχείο για να κάνω δοκιμές για μια καινούργια δυνατότητα που προσπαθώ να φτιάξω στο φόρουμ, να έχει προεπισκόπηση επισυναπτόμενων αρχείων κώδικα.

humus

Σε ευχαριστώ πολύ.Ήταν πολύ χρήσιμη η βοήθειά σου.

MichaelP

Φίλοι μου,
Άσχετα με το παραπάνω topic που αναφέρεται ο φιλος στην ολίσθηση πίνακα,
μολις πριν απο λιγο διαπιστωσα μια, πως να το πώ...ασυμμετρία της ολίσθησης (shift), που αναφέρεται στο 2ο κεφάλαιο, την οποία θα ηθελα να σχολιάσω και να μοιραστώ μαζί σας.

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

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


ntzios kostas

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

Ελπίζω να σε κάλυψα.
Φιλικά Κώστας
Το μάθημα Ανάπτυξη Εφαρμογών δεν έχει σαν στόχο την εκμάθηση κάποιου συγκεκριμένου προγραμματιστικού περιβάλλοντος ούτε την καλλιέργεια προγραμματιστικών δεξιοτήτων από τη μεριά των μαθητών. Δεν αποσκοπεί στη λεπτομερειακή εξέταση της δομής, του ρεπερτορίου και των συντακτικων κανόνων κάποιας γλώσσας...

gpapargi

#7
Παράθεση από: humus στις 27 Μαρ 2007, 06:04:56 ΜΜ
Πως γίνεται η ολίσθηση πίνακα προς τα δεξιά ή αριστερά κατα μ θέσεις?

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

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

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

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

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

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


MichaelP

To σκεύθηκα αλλα στη περίπτωση του 11111111 ?

Μ.

Laertis

Τότε ο αριθμός είναι 16 bit (2 byte) γιατί αλλιώς δε μπορεί να γίνει 2πλασιασμός αν ο καταχωρητής είναι 8 bit (ολίσθηση αριστερά) οπότε είναι :

0000000011111111   και

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

Ολίσθηση δεξιά : 00000000011111111
Νικολακάκης Γιώργος
Μηχανικός Η/Υ Συστημάτων
Καθηγητής Πληροφορικής
http://users.sch.gr/gnikola

ntzios kostas

Συμφωνώ με τον Laerti. Αν βέβαια θέλεις συνεχείς διπλασιασμούς τότε έχουμε φαινόμενο υπερχείλισης , με αποτέλεσμα από ένα σημείο και μετά, να έχουμε λάθος αποτελέσματα, είτε χρησιμοποιείς 8 είτε οποιονδήποτε άλλον αριθμό ψηφίων.

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

τότε διπλασιασμός επί δύο θα είχε ως αποτέλεσμα, αν δεν κάνω λάθος, τον αριθμό
11111110=254 (φαινόμενο υπερχείλισης)
Το μάθημα Ανάπτυξη Εφαρμογών δεν έχει σαν στόχο την εκμάθηση κάποιου συγκεκριμένου προγραμματιστικού περιβάλλοντος ούτε την καλλιέργεια προγραμματιστικών δεξιοτήτων από τη μεριά των μαθητών. Δεν αποσκοπεί στη λεπτομερειακή εξέταση της δομής, του ρεπερτορίου και των συντακτικων κανόνων κάποιας γλώσσας...

MichaelP

#11
Ναι ναι σωστά, ευχαριστώ...
Άρα και ο 10000000 πρέπει να καταχωρηθει σε 16bit καταχωρητη διότι αλλιώς, πως θα γίνει ο διπλασιασμος, σωστα;
Δηλ: 0000000010000000


Ευχαριστώ.