Πινακες- διαγραφη γραμμης-στηλης

Ξεκίνησε από kiro, 17 Μαρ 2006, 02:18:23 ΠΜ

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

kiro

Γεια σας!
Θα ήθελα να ζητήσω τη γνώμη σας για μια άσκηση που βρήκα μια  σε ένα βοήθημα. Η εκφώνηση είναι

¨Να γραφεί ο αλγόριθμος ο οποίος να διαβάζει έναν πίνακας 50x50 (αν ο αριθμός δεν είναι μεταξύ του 1 και του 50 να ζητείται επαναληπτικά μέχρι να δοθεί το σωστό νούμερο). Και να δημιουργεί έναν δεύτερο πίνακα 49 49 στον οποίο θα έχουν αντιγραφεί τα στοιχεία του πρώτου πίνακα εκτός των στοιχείων που βρίσκονται στην γραμμή και στη στήλη που αντιστοιχεί στον αριθμό εισόδου. Η λύση που δίνει είναι η παρακάτω

Αλγόριθμος Διαγραφη_Γραμμης
   Δεδομένα //Π//
   Απχη_επαναληψης
      Διάβασε α
   Μεχρις_οτου α>=1 και α<=50
   Για i απο 1 μεχρι α-1
      Για j απο 1 μεχρι α-1
         Β[i,j] <- Α[i,j]
      Τελος_επαναληψης
   Τελοσ_επαναληψης
   Για i απο 1 μεχρι α-1
      Για j απο α+1 μεχρι 50
          Β[i,j-1] <- Α[i,j]
      Τελος_επαναληψης
   Τελοσ_επαναληψης
   Για i απο α+1 μεχρι 50
      Για j απο 1 μεχρι α-1
         Β[i-1,j] <- Α[i,j]
      Τελος_επαναληψης
   Τελοσ_επαναληψης
   Για i απο α+1 μεχρι 50
      Για j απο α+1 μεχρι 50
          Β[i-1,j-1] <- Α[i,j]
      Τελος_επαναληψης
   Τελοσ_επαναληψης

Όπως τη βλέπω λυμένη μπορώ να την καταλάβω απλά πιστεύω είναι δύσκολο να περιγράψω τη λογική στα παιδιά …
Και κατή ακόμα…στην περίπτωση που ο αριθμός εισόδου ανήκει 1 η 50 γενικά δηλ αν πρέπει να διαγραφεί η πρώτη στήλη και γραμμή ή η πεντηκοστή τότε τι γίνεται? Υπάρχει επανάληψη που παίρνει τιμή  Για ι από 1 μέχρι 0…

ευχαριστώ....



gpapargi

Επειδή είμαι μπλεγμένος αυτή τη στιγμή απαντώ λίγο βιαστικά.
Φτιάξε μια συνάρτηση step(x,m) που να σου επιστρέφει 0 για τιμές αν το x είναι μικρότερο του m και 1 αν το x είναι μεγαλύτερο ή ίσο του m.
Στη συνέχεια κάνε αντιγραφή των 2 πινάκων με εντολές «Για» από 1 μέχρι 49. Πριν χρησιμοποιήσεις τα στοιχεία του πίνακα Α χρησιμοποίησε τη συνάρτηση step για να βρεις τους δείκτες σε αυτόν. Ουσιαστικά η step υλοποιεί το επιλεκτικό πηδηματάκι για αριθμούς πάνω από αυτόν που δόθηκε από είσοδο. Έτσι στο Β πιάνεις όλους τους αριθμούς από 1 μέχρι 49 ενώ στον Α πιάνεις από 1 μέχρι 50 με πήδημα στο κατάλληλο σημείο.

Τα έγραψα λίγο γρήγορα αλλά νομίζω ότι πιάνεις την ιδέα.

P.Tsiotakis

ρέπει να ξεκαθαρίσουμε οτι δεν νοείται η λειτουργία της διαγραφής σε στατική δομή δεδομένων όπως είναι ο πίνακας.

Επομένως, η άσκηση αυτή πραγματοποιεί "διαγραφή" δημιουργώντας πίνακα με μια γραμμή και μια στήλη λιγότερη. Με ελεύθερο κείμενο θα έλεγα οτι χωρίζει τον αρχικό πίνακα σε 4 τεταρτημόρια (χωρίς τις υπο "διαγραφή" γραμμές και στήλες) και περνάει με τη σειρά κάθε τεταρτημόριο προσέχωντας κάθε φορά τους δείκτες τον πινάκων. Αν διαγράφεται η π.χ. πρώτη στήλη δεν θα μπει καθόλου στο Για που αναφέρεις (δεν υπάρχουν τα δυο αριστερά τεταρτημόρια)
Στο βιβλίο μου υλοιποιώ την συγκεκριμένη άσκηση λίγο διαφορετικά, αλλά και αυτός ο τρόπος είναι πιο κοντά σε αυτό που θα κάναμε στο χαρτί αν υλοποιούσαμε την άσκηση.

Όλγα, καλό είναι όταν σε μπερδεύει κάποιος αλγόριθμος να υλοποιείς ένα παράδειγμα εκτελώντας τον αλγόριθμο.

Ελπίζω να βοήθησα,

nikosx

Και εγώ με τη σειρά μου νομίζω ότι η άσκηση αυτή θα μπορούσε να γίνει με χρήση μίας πολλαπλής επιλογής η οποία τελικά θα ελέγχει το α. Αν ο α είναι ανάμεσα στο 2 και στο 49 τότε θα εκτελείται το τμήμα με τα 4 Για (σαν τεταρτημόρια τα βλέπω και εγώ), αν τώρα το α=50 τότε:

Για i από 1 μέχρι 49
  Για j από 1 μέχρι 49
      Β[i,j] <-- A[i,j]
  Tέλος_Επανάληψης
Τέλος_Επανάληψης

αλλιώς (αν το α=1 δηλαδή)

Για i από 1 μέχρι 49
  Για j από 1 μέχρι 49
      Β[i,j] <-- A[i+1,j+1]
  Tέλος_Επανάληψης
Τέλος_Επανάληψης

φιλικά,

Νίκος Ξ.
Νίκος Ξένος
Καθηγητής Πληροφορικής
nxenos@sch.gr

alkisg

Εγώ θα την υλοποιούσα διαφορετικά, για να είναι πιο κατανοητή στους μαθητές. Θα ήταν λίγο πιο "αργή" προγραμματιστικά επειδή χρησιμοποιεί ΑΝ για κάθε στοιχείο, αλλά δεν αλλάζει η τάξη του αλγορίθμου.

Θεωρώ ι, κ μετρητές που χρησιμοποιούνται αποκλειστικά για το A και μ, ν μετρητές που χρησιμοποιούνται αποκλειστικά για το Β.[glossa]
μ = 1
ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 50
  ν = 1
  ΓΙΑ κ ΑΠΟ 1 ΜΕΧΡΙ 50
    ΑΝ κ <> α ΤΟΤΕ
      Β[μ, ν] = Α[ι, κ]
      ν = ν + 1
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΝ ι <> α ΤΟΤΕ
    μ = μ + 1
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ[/glossa]Νομίζω είναι πιο απλό έτσι, χρειάζεται μόνο 2 εντολές ΓΙΑ...

kiro



gpapargi

#7
Περιγράφω και λίγο πιο αναλυτικά τη λύση που ανέφερα  σύντομα πιο πάνω.

Ξεκινώ από την κλασσική αντιγραφή πινάκων

Για i από 1 μέχρι 49
    Για j από 1 μέχρι 49
        Β[i,j] <- A[i,j]
    Τέλος_επανάληψης
Τέλος_επανάληψης

Το μόνο που θέλω να κάνω είναι να τροποποιήσω τον παραπάνω αλγόριθμο έτσι ώστε όταν στον πίνακα Α περάσουμε τη γραμμή/στήλή που θέλουμε να παραλείψουμε, να αυξάνεται κατά 1 ο κατάλληλος δείκτης του πίνακα, κάνοντας ένα μικρό πήδημα. Φτιάχνω λοιπόν τη συνάρτηση step(x,m) που κάνει ακριβώς αυτό. m είναι το σημείο που θα γίνει το πήδημα (θα πάρει την τιμή της γραμμής/στήλης που θέλουμε να διαγράψουμε) και x είναι ο αντίστοιχος δείκτης του Β (θα ήταν και του Α αν δεν γινόταν το πήδημα).

Έτσι ο παραπάνω αλγόριθμος γίνεται (με bold βάζω τα σημεία που διαφέρουν)

ΓIA I ΑΠΟ 1 ΜΕΧΡΙ 49
    ΓIA J ΑΠΟ 1 ΜΕΧΡΙ 49
        K <- I + step(I,Σημείο_διαγραφής)    ! Υπολογισμός γραμμής του πίνακα Α
        L <- J + step(J,Σημείο_διαγραφής)    !  Υπολογισμός στήλης του πίνακα Α
        Β[I,J] <- A[K,L]
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

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

ΑΝ X<M TOTE
     step <- 0

AΛΛΙΩΣ
     step <- 1

ΤΕΛΟΣ_ΑΝ

Μπορούμε να το δούμε και ως εξής: Αν το πρώτο όρισμα της step είναι μικρότερο από το δεύτερο τότε γυρίζει 0. Αλλιώς γυρίζει 1.

Για όσους τα πάνε καλά με τα μαθηματικά η step δεν έιναι παρά μια δεξιά ολίσθηση της συνάρτησης μοναδιαίου βήματος δηλαδή η u(x-m).

Εμένα απλό μου φαίνεται για την κατανόηση του μαθητή. Ουσιαστικά είναι η κλασσική αντιγραφή πινάκων με μια τροποποίηση που υλοποιεί το πήδημα του δείκτη στον Α. Αλλά πάντα αυτός που κάνει μια σκέψη είναι λογικό να του φαίνεται απλή γιατί την έχει μέσα στο κεφάλι του. Μπορεί να κάνω και λάθος. Αν θέλετε ρίξτε μια γνώμη ως προς την απλότητα αυτής της λύσης για το μαθητή.