Διαδικασία με πίνακες

Ξεκίνησε από droopy, 06 Απρ 2009, 05:30:43 ΜΜ

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

droopy

Καλησπέρα σας.

Είναι επιτρεπτό να ορίζουμε στο τμήμα δηλώσεων ενός προγράμματος έναν πίνακα χαρακτήρων Α[30]
και στη διαδικασία πχ Δ1 (Ο,Ν) ο πίνακας Ο που αντιστοιχεί στον πίνακα Α να ορίζεται στο τμήμα δηλώσεων της διαδικασίας ως Ο[100] θέσεων;
[ η διαδικασία καλείται ως εξης: κάλεσε Δ1 (Α,Ν) ]

Το παρατήρησα σε ένα βοήθημα και θέλω την βοήθειά σας.
Δεν θα έπρεπε να είναι και οι δύο πίνακες του ίδιου μεγέθους;

Ευχαριστώ

evry

Ναι θα έπρεπε, αυτό που παρατήρησες είναι λάθος.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

P.Tsiotakis

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

Δεν μπόρεσα να τον πείσω οτι δεν μπορούν να "συνδεθούν" ανόμοια πράγματα.

evry

 Και εγώ κάποτε είχα συζήτηση με έναν έμπειρο συνάδελφο ο οποίος ήθελε να με πείσει ότι η έκφραση α[α[4]]
είναι λάθος γιατί δεν μπορούμε να έχουμε πίνακα μέσα σε πίνακα.
  Πάντως το συγκεκριμένο θέμα σηκώνει συζήτηση και δε νομίζω ότι πρέπει να περιμένουμε από έναν μαθητή να το ξέρει. Κάποιος λογικά μπορεί να υποθέσει ότι αφού το υποπρόγραμμα έχει μεγαλύτερο πίνακα τότε όλα καλά και οι υπόλοιπες θέσεις μένουν κενές. Τα παιδιά δεν ξέρουν από type checking. Στη C ας πούμε θα πέρναγε. Στην Pascal όμως όχι αν θυμάμαι καλά.
  Το επιχείρημα που μπορείς να χρησιμοποιήσεις για τη Γλώσσα είναι ο τρόπος με τον οποίο γίνεται η μεταβίβαση των παραμέτρων αφού κάθε φορά πρέπει να αντιγραφεί η πραγματική στην τυπική και αντιστρόφως. Άρα πρέπει να έχουν το ίδιο μέγεθος.

   
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Νίκος Αδαμόπουλος

Παράθεση από: evry στις 07 Απρ 2009, 01:24:37 ΜΜ
... κάθε φορά πρέπει να αντιγραφεί η πραγματική στην τυπική και αντιστρόφως. Άρα πρέπει να έχουν το ίδιο μέγεθος.

Ακριβώς αυτό είναι το πιο ισχυρό επιχείρημα!

Αν δεν έχουν το ίδιο μέγεθος τότε πώς θα αντιγραφεί ο μεγαλύτερος πίνακας (τυπική παράμετρος) στον μικρότερο (πραγματική παράμετρος) κατά την επιστροφή από τη διαδικασία;

savatage

Καλημερα συναδελφοι και καλως σας βρηκα!
Πραγματι το παραπανω θεμα σηκωνει πολυ συζητηση , καθως απο τη μια υπαρχει το σχολικο βιβλιο το οποιο - ενω δυστηχως - δεν εχει καποιο αντιστοιχο παραδειγμα , προτεινει την πληρη αντιστοιχιση των τυπικων με τις πραγματικες παραμετρους , απο την αλλη μια τετοια προσεγγιση 'καταργει' την γενικοτητα στη μορφη που πρεπει να εχει ενα υποπρογραμμα.
Πολλα βοηθηματα προσεγγιζουν τον τροπο που ανεφερε και ο topic starter , ενω δεν ειναι τυχαιο που δεν εχει ζητηθει παρομοιο θεμα στις πανελληνιες.
Οπως και να εχει , αν δεν υπαρξει επισημη τοποθετηση μεσω του σχολικου βιβλιου - σε μια νεα εκδοση , μεχρι να αποφασισουν να το πεταξουν εντελως και να δωσουν κατι καινουργιο - , κανενας μας δε μπορει να ισχυριστει με απολυτη βεβαιοτητα τη γραμμη που πρεπει να ακολουθησουμε!

P.Tsiotakis


evry


  Νομίζω ότι ο τρόπος μεταβίβασης παραμέτρων που προτείνει το βιβλίο όπως είπα και παραπάνω, οδηγεί στο συμπέρασμα ότι η πραγματική και η τυπική παράμετρος πρέπει να έχουν το ίδιο μέγεθος. Η χρήση πινάκων διαφορετικού μεγέθους θα έχει πρόβλημα με τον συγκεκριμένο τρόπο μεταβίβασης παραμέτρων.
  Όπως και να έχει πάντως, αυτό που θα πρέπει να κάνουμε από τη στιγμή που το βιβλίο έχει αρκετά κενά είναι να καθοδηγούμε τους μαθητές μας σε τεχνικές και μεθόδους που είναι σωστές με απόλυτη βεβαιότητα.
    Η κλήση ενός υποπρογράμματος που περιμένει σαν παράμετρο έναν πίνακα 100 θέσεων με πραγματική παράμετρο έναν πίνακα 10 θέσεων ίσως να μην πείθει κάποιους ότι είναι λάθος, όμως σίγουρα συμφωνούμε όλοι ότι "είναι στον αέρα" και πιθανόν να θεωρηθεί λάθος από πολλούς καθηγητές.
   Άρα, άσχετα με το τι πιστεύουμε καλό θα ήταν να οδηγούμε τους μαθητές να αποφεύγουν τέτοια παραδείγματα
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Καρκαμάνης Γεώργιος

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

Οταν θέλουμε να αντιγράψουμε το περιεχόμενο ενος πίνακα Α[30] σε έναν πίνακα Β[100]  και γράφουμε την παρακάτω εντολη ΓΙΑ:
Για ι απο 1 μεχρι 100
   Β[ι] <- Α[ι]
Τέλος_επανάληψης

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

evry


   Πιστεύω πως κάποιος που κάνει το μάθημα πολλά χρόνια θα έχει καταλάβει πως η ΓΛΩΣΣΑ είναι η πλέον στατική - μη ευέλικτη γλώσσα προγραμματισμού. Στο πνεύμα αυτό, οι πίνακες Α[100] και Β[99] θεωρούνται διαφορετικού τύπου και για αυτό το λόγο δεν μπορεί να μπει ο ένας στη θέση του άλλου. Θα σε σταματήσει το type checking όταν κάνεις compile.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

meteo_xampos

Μια μαθήτριά μου στο 4ο θέμα των περσινών επαναληπτικών εξετάσεων, μου έγραψε μια διαδικασία για την ταξινόμηση
η οποία είχε σαν είσοδο το όνομα ενός πίνακα, και ένα αριθμό n, ο οποίος είναι το μέγεθος του εκάστοτε πίνακα που θα
εισάγεται στη διαδικασία για να ταξινομηθεί. Δηλαδή την έγραψε κάπως έτσι...

Διαδικασία Ταξινόμηση(ΠΙΝ, n)
Μεταβλητές
Πραγματικές: n, ΠΙΝ[n]
Ακέραιες: i, j
Αρχή
Για i από 2 μέχρι n
.....

και μετά την καλούσε με τις εντολές
ΚΑΛΕΣΕ Ταξινόμηση ( ΠΙΝ1, 8 )
ΚΑΛΕΣΕ Ταξινόμηση ( ΠΙΝ2, 8 )
ΚΑΛΕΣΕ Ταξινόμηση ( ΠΙΝ3, 14 )

Της είπα να μην την κάνει αυτή τη λύση, γιατί πρώτ'απ'όλα δεν μπορούμε να βάλουμε σα διάσταση
πίνακα μια μεταβλητή. ΑΛλά μου άρεσε η σκέψη της.

Το θέμα είναι, μπορεί να γίνει κάτι τέτοιο στην PASCAL; Να ορίζουμε μια διαδικασία γενική για την
ταξινόμηση, και το μέγεθος του πίνακα να το περνάμε σα παράμετρο; Αν όχι στην PASCAL σε κάποια
άλλη γλώσσα;

Χαράλαμπος, Ιεράπετρα

evry


  Καλή η μαθήτριά σου αλλά άτυχη. Στην Pascal νομίζω ότι δε γίνεται ούτε το ένα ούτε το άλλο. Δηλαδή δε μπορείς να περάσεις σαν παράμετρο στη θέση ενός πίνακα 10 θέσεων έναν πίνακα 8 θέσεων. Αυτό συμβαίνει γιατί το μέγεθος του πίνακα είναι μέρος του τύπου του. Για αυτό είμαι σίγουρος γιατί μου είχε χτυπήσει πολύ άσχημα όταν μάθαινα pascal. Τώρα για το μεταβλητό μέγεθος πίνακα νομίζω πως ούτε αυτό γίνεται. Ο compiler πρέπει να ξέρει εξαρχής το μέγεθος του πίνακα σε χρόνο μεταγλώττισης ώστε να το δεσμεύσει από τη στοίβα και όχι από τον σωρό.
   Αν θέλεις μεταβλητό μέγεθος πρέπει να παίξεις με pointers που δεν έχει η Γλώσσα οπότε άστο.
  Στην ερώτησή σου αν αυτό γίνεται σε κάποια γλώσσα, ναι γίνεται στη C και στη C++ και νομίζω και στη Java. Γενικά στη C δε νομίζω να υπάρχει πράγμα που δεν γίνεται  :)

Για περισσότερα δες αυτό το πολύ καλό άρθρο από τον Brian W. Kernighan,
Why Pascal is Not My Favorite Programming Language

που λέει τα πράγματα με το όνομά τους, μάλλον πρέπει να γράψουμε και εμείς ένα αντίστοιχο άρθρο για την δική μας ΓΛΩΣΣΑ.

  Πάντως στη συγκεκριμένη περίπτωση θα μπορούσε η μαθήτρια σου απλά να βάλει όλους του πίνακες με μέγεθος 14 και απλά να έχει αχρησιμοποιήτες θέσεις.

Έχω βάλει και εγώ το θέμα σε πολλούς μαθητές μου και ενώ τους είχα δείξει την συγχώνευση προτίμησαν όλοι αυτόν τον τρόπο. Για αυτό νομίζω ότι το θέμα αυτό αν και ήταν πολή καλη ιδέα ήταν αποτυχημένο στα πλαίσια αυτού του μαθήματος γιατί δεν υποχρέωνε τα παιδιά να κάνουν συγχώνευση (την οποία μάλιστα θεωρητικά δεν είναι υποχρεωμένα και να ξέρουν) αλλά τους άφηνε ανοικτό το παραθυράκι της brute force λύσης, πράγμα που έκαναν.

Η πλάκα είναι ότι η λύση με συγχώνευση είναι της πλάκας, διότι δεν χρειάζεται να γράψεις το δύσκολο κομμάτι της συγχώνευσης, δηλαδή το κομμάτι κώδικα που αντιγράφει ότι έχει απομείνει στον έναν πίνακα όταν κάποιος τελειώσει. Επειδή ζητούνται μόνο οι άλλοι 6 καλύτεροι είναι βέβαιο ότι κανένας πίνακας δεν θα τελειώσει που σημαίνει ότι μπορείς να χρησιμοποιήσεις την Για...από....μέχρι κάπως έτσι

Κώδικας: ΓΛΩΣΣΑ
ΤΕΛΙΚΟΣ[1] <- Α[1]
ΤΕΛΙΚΟΣ[2] <- Β[1]
i <- 2
j <- 2
ΓΙΑ κ από 3 ΜΕΧΡΙ 8 
   ΑΝ Α[i] < B[j] Τότε
       ΤΕΛΙΚΟΣ[κ] <- Α[i]
       i <- i + 1
  ΑΛΛΙΩΣ
       ΤΕΛΙΚΟΣ[κ] <- Β[j]
       j <- j + 1
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Απλά έπρεπε να υποχρεώσουν τους μαθητές με κάποιον τρόπο να μην κάνουν την συγχώνευση με τον brute force τρόπο, όπως έκαναν οι περισσότεροι
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr