Αποστολέας Θέμα: Help ολίσθηση  (Αναγνώστηκε 6808 φορές)

humus

  • Νέος
  • *
  • Μηνύματα: 3
Help ολίσθηση
« στις: 27 Μαρ 2007, 06:04:56 μμ »
Πως γίνεται η ολίσθηση πίνακα προς τα δεξιά ή αριστερά κατα μ θέσεις?

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3615
  • to Iterate is human to Recurse divine
Απ: Help ολίσθηση
« Απάντηση #1 στις: 27 Μαρ 2007, 11:07:30 μμ »

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

humus

  • Νέος
  • *
  • Μηνύματα: 3
Απ: Help ολίσθηση
« Απάντηση #2 στις: 28 Μαρ 2007, 01:23:35 μμ »
Sorry, εννοούσα ολίσθηση κυκλικά κατα μ θέσεις χωρίς να χάνονται κελιά του πίνακα.Υποθέτω οτι χρειάζεται καινούργιος πίνακας. Γίνεται χωρίς την χρήση νέου βοηθητικού πίνακα?

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

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 6077
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Απ: Help ολίσθηση
« Απάντηση #3 στις: 28 Μαρ 2007, 03:00:46 μμ »
Χε χε ωραίο θέμα! Όχι βέβαια για το μάθημα, για κανέναν διαγωνισμό πληροφορικής ίσως!  ;D
Επισυνάπτω μια λύση χωρίς δεύτερο πίνακα.

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

humus

  • Νέος
  • *
  • Μηνύματα: 3
Απ: Help ολίσθηση
« Απάντηση #4 στις: 29 Μαρ 2007, 10:50:59 πμ »
Σε ευχαριστώ πολύ.Ήταν πολύ χρήσιμη η βοήθειά σου.

MichaelP

  • Θαμώνας
  • ***
  • Μηνύματα: 34
  • ...Εγώ τους τα μαθαίνω χωρίς Απο...Έως ....
Απ: Help ολίσθηση
« Απάντηση #5 στις: 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; Ενταξει, μη μου πειτε γιατι τοσο κανει... το ξερω το θεμα ειναι γιατι;


ntzios kostas

  • Καθηγητής Πληροφορικής
  • Ομάδα διαγωνισμάτων 2010
  • *
  • Μηνύματα: 610
    • Ανάπτυξη Εφαρμογών
Απ: Help ολίσθηση
« Απάντηση #6 στις: 03 Δεκ 2008, 08:28:23 πμ »
Μιχάλη ας υποθέσουμε ότι το μέγεθος του αριθμού είναι ένα byte, σκέψου ότι αποθηκεύονται στη μνήμη σε πολλαπλάσια του byte. Τότε
ο αρχικός αριθμός μου είναι 00101101 και όχι 101101
Ολίσθηση αριστερα : 01011010
Ολίσθηση δεξια του αρχικού αριθμού: 00010110
Άρα όλα έχουν 8 ψηφία, δεν έχει ούτε 6 ούτε 7.

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

gpapargi

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2468
  • I 'm not young enough to know everything
Απ: Help ολίσθηση
« Απάντηση #7 στις: 03 Δεκ 2008, 01:44:11 μμ »
Πως γίνεται η ολίσθηση πίνακα προς τα δεξιά ή αριστερά κατα μ θέσεις?

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

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

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

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

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

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

« Τελευταία τροποποίηση: 03 Δεκ 2008, 02:02:42 μμ από gpapargi »

MichaelP

  • Θαμώνας
  • ***
  • Μηνύματα: 34
  • ...Εγώ τους τα μαθαίνω χωρίς Απο...Έως ....
Απ: Help ολίσθηση
« Απάντηση #8 στις: 03 Δεκ 2008, 08:57:06 μμ »
To σκεύθηκα αλλα στη περίπτωση του 11111111 ?

Μ.

Laertis

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 1534
  • Sky's the limit
    • ΑΣΚΗΣΕΙΣ-ΘΕΜΑΤΑ ΑΕΠΠ
Απ: Help ολίσθηση
« Απάντηση #9 στις: 03 Δεκ 2008, 09:49:27 μμ »
Τότε ο αριθμός είναι 16 bit (2 byte) γιατί αλλιώς δε μπορεί να γίνει 2πλασιασμός αν ο καταχωρητής είναι 8 bit (ολίσθηση αριστερά) οπότε είναι :

0000000011111111   και

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

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

ntzios kostas

  • Καθηγητής Πληροφορικής
  • Ομάδα διαγωνισμάτων 2010
  • *
  • Μηνύματα: 610
    • Ανάπτυξη Εφαρμογών
Απ: Help ολίσθηση
« Απάντηση #10 στις: 03 Δεκ 2008, 10:47:41 μμ »
Συμφωνώ με τον Laerti. Αν βέβαια θέλεις συνεχείς διπλασιασμούς τότε έχουμε φαινόμενο υπερχείλισης , με αποτέλεσμα από ένα σημείο και μετά, να έχουμε λάθος αποτελέσματα, είτε χρησιμοποιείς 8 είτε οποιονδήποτε άλλον αριθμό ψηφίων.

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

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

MichaelP

  • Θαμώνας
  • ***
  • Μηνύματα: 34
  • ...Εγώ τους τα μαθαίνω χωρίς Απο...Έως ....
Απ: Help ολίσθηση
« Απάντηση #11 στις: 04 Δεκ 2008, 01:16:01 πμ »
Ναι ναι σωστά, ευχαριστώ...
Άρα και ο 10000000 πρέπει να καταχωρηθει σε 16bit καταχωρητη διότι αλλιώς, πως θα γίνει ο διπλασιασμος, σωστα;
Δηλ: 0000000010000000


Ευχαριστώ.
« Τελευταία τροποποίηση: 04 Δεκ 2008, 04:06:00 πμ από MichaelP »