Αποστολέας Θέμα: Συναρτησιακή Άσκηση  (Αναγνώστηκε 3086 φορές)

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3182
  • to Iterate is human to Recurse divine
Συναρτησιακή Άσκηση
« στις: 07 Απρ 2012, 12:27:20 πμ »
Γενικά μου αρέσει ο συναρτησιακός τρόπος σκέψης οπότε έφτιαξα την παρακάτω άσκηση

Συναρτησιακή Άσκηση

1.   Να γράψετε υποπρόγραμμα  max  το οποίο θα δέχεται τρεις ακέραιους αριθμούς και θα επιστρέφει τον μεγαλύτερο
2.   Να γράψετε  υποπρόγραμμα  max2 το οποίο με χρήση του max θα δέχεται έναν πίνακα Ν  ακεραίων και θα επιστρέφει το μέγιστο στοιχείο του.
3.   Να γράψετε υποπρόγραμμα το οποίο θα δέχεται έναν πίνακα Ν ακεραίων και θα τον ταξινομεί σε αύξουσα σειρά με χρήση του max.
Σημειώσεις: Θεωρείστε το Ν σταθερά. Δεν μπορείτε να χρησιμοποιήσετε δομή επιλογής! Όλες οι συγκρίσεις θα γίνουν με χρήση της max.




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

ΥΓ. Μην βαράτε έτσι? είναι εκτός πνεύματος μαθήματος και εξετάσεων
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Πανάγος94

  • Βετεράνος
  • ****
  • Μηνύματα: 65
  • what doesn't kill you only makes you pissed off..
Απ: Συναρτησιακή Άσκηση
« Απάντηση #1 στις: 07 Απρ 2012, 10:35:32 πμ »
στην max όμως μπορούμε να χρησιμοποιήσουμε δομή επιλογής ε???και επίσης δεν πρέπει να θεωρήσουμε ότι Ν >= 3?? η απάντησή μου για το δεύτερο είναι η εξής .... δεν νομίζω να το ζητούσες έτσι αλλά τέσπα....

ΠΡΟΓΡΑΜΜΑ ευρεση_μεγιστου
ΣΤΑΘΕΡΕΣ
  Ν = ...
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Π[Ν], μεγιστο, ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ Ν
    ΔΙΑΒΑΣΕ Π[ι]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  μεγιστο <- max2(Π)
  ΓΡΑΨΕ μεγιστο
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


ΣΥΝΑΡΤΗΣΗ max2(Π): ΑΚΕΡΑΙΑ
ΣΤΑΘΕΡΕΣ
  Ν = ....
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Π[Ν], ι, αρ, maximum
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ Ν div 3
    ΑΝ ι = 1 ΤΟΤΕ
      αρ <- max(Π[ι], Π[ι + 1], Π[ι + 2])
      maximum <- αρ
    ΑΛΛΙΩΣ
      αρ <- max(Π[2*ι + 1], Π[2*ι + 2], Π[2*ι + 3])
      ΑΝ αρ > maximum ΤΟΤΕ
        maximum <- αρ
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΝ Ν mod 3 <> 0 ΤΟΤΕ
    αρ <- max(Π[Ν - 2], Π[Ν - 1], Π[Ν])
    ΑΝ αρ > maximum ΤΟΤΕ
      maximum <- αρ
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΑΝ
  max2 <- maximum
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

ΣΥΝΑΡΤΗΣΗ max(α, β, γ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: α, β, γ, αρ
ΑΡΧΗ
  αρ <- α
  ΑΝ β > αρ ΤΟΤΕ
    αρ <- β
  ΤΕΛΟΣ_ΑΝ
  ΑΝ γ > αρ ΤΟΤΕ
    αρ <- γ
  ΤΕΛΟΣ_ΑΝ
  max <- αρ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
« Τελευταία τροποποίηση: 07 Απρ 2012, 11:20:59 πμ από Πανάγος94 »

sstergou

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 983
  • Program or be Programmed
    • pseudoglossa.gr
Απ: Συναρτησιακή Άσκηση
« Απάντηση #2 στις: 07 Απρ 2012, 11:25:31 πμ »
Γιατί η max συγκρίνει 3 ακεραίους και όχι 2 ;

Πάντως το θέμα είναι να μην χρησιμοποιήσεις δομή επανάληψης και όχι επιλογής  :P
Επίσης καλό είναι το αποτέλεσμα να είναι νέος πίνακας και όχι τροποποίηση του παλιού. Αυτό βέβαια σκοντάφτει στον περιορισμό που ορίσαμε μόνοι μας αλλά χωρίς να φταίμε (ότι δηλαδή μια συνάρτηση δεν μπορεί να επιστρέψει πίνακα).

Στάθης Στέργου - sstergouATgmailDOTcom - http://www.pseudoglossa.gr

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3182
  • to Iterate is human to Recurse divine
Απ: Συναρτησιακή Άσκηση
« Απάντηση #3 στις: 07 Απρ 2012, 05:06:19 μμ »
@Πανάγος

τώρα που το βλέπω η εκφώνησή μου δεν είναι κατανοητή όπως ήθελα.
Μπορείς να χρησιμοποιήσεις Αν μόνο στην πρώτη max και σε καμία άλλη περίπτωση.
Ούτε στην max του πίνακα ούτε στην ταξινόμηση οκ?
Δηλαδή στην max2 δεν μπορείς να χρησιμοποίησεις Αν...Τότε όπως έχεις κάνει

Επίσης θέλω να χρησιμοποιήσεις την max για να συγκρίνεις τους αριθμούς ανά δύο και όχι ανά 3  ;)
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3182
  • to Iterate is human to Recurse divine
Απ: Συναρτησιακή Άσκηση
« Απάντηση #4 στις: 07 Απρ 2012, 05:16:24 μμ »
Θέλω ο μαθητής να σκεφτεί πως θα βρει το μέγιστο 2 αριθμών με τη χρήση μιας συνάρτησης μεγίστου 3.
Γιατί η max συγκρίνει 3 ακεραίους και όχι 2 ;

Πάντως το θέμα είναι να μην χρησιμοποιήσεις δομή επανάληψης και όχι επιλογής  :P
Επίσης καλό είναι το αποτέλεσμα να είναι νέος πίνακας και όχι τροποποίηση του παλιού.


Παράθεση
Αυτό βέβαια σκοντάφτει στον περιορισμό που ορίσαμε μόνοι μας αλλά χωρίς να φταίμε (ότι δηλαδή μια συνάρτηση δεν μπορεί να επιστρέψει πίνακα).
Κοίτα ολόκληρο τον πίνακα δεν μπορεί, γιατί είναι πολλές τιμές, αλλά δείκτη σε πίνακα το συζητάμε :D
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Πανάγος94

  • Βετεράνος
  • ****
  • Μηνύματα: 65
  • what doesn't kill you only makes you pissed off..
Απ: Συναρτησιακή Άσκηση
« Απάντηση #5 στις: 07 Απρ 2012, 06:11:24 μμ »
καλά αφού η συνάρτηση δέχεται τρείς παραμέτρους και σκοπός του αλγορίθμου είναι η σύγκριση ανά δύο, η τρίτη παραμετρος τι στο καλό θα κάνει....αλλά να μου πεις αυτό είναι το θέμα της άσκησης έτσι δεν είναι??

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3182
  • to Iterate is human to Recurse divine
Απ: Συναρτησιακή Άσκηση
« Απάντηση #6 στις: 07 Απρ 2012, 06:38:29 μμ »
Υπάρχουν ασκήσεις που απλά ελέγχουν κάποια πράγματα. Δεν αποτελούν όλες πραγματικές εφαρμογές .
Στην συγκεκριμένη περίπτωση η ιδέα είναι να μπορείς να κατασκευάσεις κάτι με τα εργαλεία που σου δίνουν και όχι να το κάνεις ad hoc.
Δεν λέω ότι το συγκεκριμένο δεν είναι και λίγο "χαζό" αλλά το θεωρώ ενδιαφέρον προβληματάκι (έτσι για να περνάει η ώρα).

Η ταξινόμηση όμως είναι που έχει πραγματικό ενδιαφέρον. Εκεί αν θέλεις χρησιμοποίησε συνάρτηση max(a,b) με 2 παραμέτρους δηλαδή. Η δυσκολία παραμένει η ίδια
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

sstergou

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 983
  • Program or be Programmed
    • pseudoglossa.gr
Απ: Συναρτησιακή Άσκηση
« Απάντηση #7 στις: 07 Απρ 2012, 06:45:01 μμ »
Θέλω ο μαθητής να σκεφτεί πως θα βρει το μέγιστο 2 αριθμών με τη χρήση μιας συνάρτησης μεγίστου 3.
χεχε, για να δούμε

Κοίτα ολόκληρο τον πίνακα δεν μπορεί, γιατί είναι πολλές τιμές, αλλά δείκτη σε πίνακα το συζητάμε :D

Κατά την γνώμη μου αυτό το "πρέπει να επιστρέφει μία τιμή" του βιβλίου θα έπρεπε να σήμαινε "μία τιμή από τους διαθέσιμους τύπους δεδομένων".
Για παράδειγμα αν είχαμε εγγραφές στην ΓΛΩΣΣΑ τότε θα ήταν παράλογο μία συνάρτηση να μην μπορούσε να επιστρέψει εγγραφή.

Τώρα όσον αφορά τους πίνακες θα μπορούσαμε στην ΓΛΩΣΣΑ να έχουμε συναρτήσεις που να επιστρέφουν πίνακα.
π.χ.
Κώδικας: Text
  1. Συνάρτηση τάδε....
  2.   α[1] <-1
  3.   α[2] <- 2
  4.   τάδε <-α
  5. Τέλος_συνάρτησης
  6.  

Το πρόβλημα που υπάρχει τώρα είναι ποιος θα είναι ο τύπος επιστροφής της συνάρτησης. Με λίγα λόγια είναι και πάλι πρόβλημα τύπων. Πάντως θα ήθελα σε μια μελλοντική εκπαιδευτική γλώσσα οι πίνακες (αν όχι και οι συναρτήσεις) να είναι αντικείμενα πρώτης τάξης.
Κάτι τέτοιο θα ήταν πολύ καλό από παιδαγωγικής αλλά και από τεχνικής απόψεως!
Στάθης Στέργου - sstergouATgmailDOTcom - http://www.pseudoglossa.gr

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3182
  • to Iterate is human to Recurse divine
Απ: Συναρτησιακή Άσκηση
« Απάντηση #8 στις: 07 Απρ 2012, 07:00:29 μμ »
Κατά την γνώμη μου αυτό το "πρέπει να επιστρέφει μία τιμή" του βιβλίου θα έπρεπε να σήμαινε "μία τιμή από τους διαθέσιμους τύπους δεδομένων".
Για παράδειγμα αν είχαμε εγγραφές στην ΓΛΩΣΣΑ τότε θα ήταν παράλογο μία συνάρτηση να μην μπορούσε να επιστρέψει εγγραφή.
κοίτα δεν χρειάζεται να παίρνουμε της μετρητοίς και ότι λέει το βιβλίο. Δηλαδή όταν λέει ότι ένα υποπρόγραμμα δεν πρέπει να είναι πολύ μεγάλο???

Εσύ αν κατάλαβα καλά λες ότι μπορεί να επιστρέφει ένα αντικείμενο, π.χ. πίνακα, εγγραφή, (συνάρτηση !!!  >:D) κλπ.


Παράθεση
Τώρα όσον αφορά τους πίνακες θα μπορούσαμε στην ΓΛΩΣΣΑ να έχουμε συναρτήσεις που να επιστρέφουν πίνακα.
π.χ.
Κώδικας: Text
  1. Συνάρτηση τάδε....
  2.   α[1] <-1
  3.   α[2] <- 2
  4.   τάδε <-α
  5. Τέλος_συνάρτησης
  6.  

Το πρόβλημα που υπάρχει τώρα είναι ποιος θα είναι ο τύπος επιστροφής της συνάρτησης. Με λίγα λόγια είναι και πάλι πρόβλημα τύπων. Πάντως θα ήθελα σε μια μελλοντική εκπαιδευτική γλώσσα οι πίνακες (αν όχι και οι συναρτήσεις) να είναι αντικείμενα πρώτης τάξης.
Κάτι τέτοιο θα ήταν πολύ καλό από παιδαγωγικής αλλά και από τεχνικής απόψεως!

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

Πάντως με το void* λύνονται όλα τα προβλήματα τύπων :D

Αλλά και εσύ θέλεις συνάρτηση να επιστρέφει συνάρτηση!!! Αδιανόητο. Κάτσε πρώτα να ξεμπερδέψουμε με πιο σοβαρά ζητήματα (κεφαλαία - μικρά, μονά/διπλά αυτάκια) και θα φτάσουμε και εκεί.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

dkonetas

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 116
Απ: Συναρτησιακή Άσκηση
« Απάντηση #9 στις: 08 Απρ 2012, 10:10:33 πμ »
έτσι συμμετέχοντας σε μία συζήτηση η οποία είναι προφανές ότι δεν έχει σχέση με τα διδασκόμενα ...
 
Αλήθεια χωρίς δείκτες το τάδε <-α   δεν απαιτεί ...υπερφόρτωση τελεστών;

ΔΚ :-)

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3182
  • to Iterate is human to Recurse divine
Απ: Συναρτησιακή Άσκηση
« Απάντηση #10 στις: 08 Απρ 2012, 10:31:11 πμ »
όχι απαραίτητα, αν θεωρηθεί χαρακτηριστικό της γλώσσας.
Για παράδειγμα η Java δεν έχει υπερφόρτωση τελεστών (σε σχέση με την "κακή" C++) αλλά το "+" στα strings δουλεύει μια χαρά  :D
έτσι συμμετέχοντας σε μία συζήτηση η οποία είναι προφανές ότι δεν έχει σχέση με τα διδασκόμενα ...
 
Αλήθεια χωρίς δείκτες το τάδε <-α   δεν απαιτεί ...υπερφόρτωση τελεστών;

ΔΚ :-)

Το συμπέρασμα είναι ότι οι δείκτες είναι κόκκινο πανί για πολλούς αλλά τελικά με αυτούς κάνεις τα πάντα
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr