Απορία για Ορθότητα

Ξεκίνησε από Glass, 02 Οκτ 2010, 12:02:57 ΜΜ

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

Glass

Καλησπέρα σε όλους.

Πιστεύετε είναι σωστό το παρακάτω;

Α<--1

Για Α από Α μέχρι 10
....
Τέλος_Επανάληψης

Ευχαριστώ

gthal

Γεια.
Αυτό, πιθανότατα λειτουργεί, αλλά θα έλεγα οπωσδήποτε να το αποφεύγουμε!
Αν θέλουμε η αρχική τιμή της ΓΙΑ να παρθεί από μια μεταβλητή (που είναι μια πολύ πιθανή κατάσταση), τότε δεν έχουμε κανένα λόγο να χρησιμοποιήσουμε την ίδια μεταβλητή για τον μετρητή της ΓΙΑ.
Φιλικά,
Γιώργος Θαλασσινός

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

Σύμφωνα με την 43652/Γ2/20-04-2010 του Υπ. Παιδείας (http://dide.ilei.sch.gr/keplinet/education/docs/aepp_yp_2010.pdf ) :

" ... σελίδας 78 του Τετραδίου Μαθητή αναφέρεται: «Ποτέ μην χρησιμοποιείς εντολές που αλλάζουν την αρχική τιμή, την τελική τιμή, το βήμα ή τη μεταβλητή που ελέγχει την επανάληψη μέσα σε ένα βρόχο ΓΙΑ. Αν και μερικές γλώσσες προγραμματισμού επιτρέπουν αυτές τις αλλαγές, να τις αποφεύγεις, γιατί οδηγούν σε προγράμματα δυσνόητα και συνήθως λανθασμένα». Από το απόσπασμα αυτό προκύπτει ότι η ΓΛΩΣΣΑ δεν περιλαμβάνεται στις «μερικές γλώσσες προγραμματισμού». "

Αφού λοιπόν δεν μπορούμε να αλλάζουμε την αρχική τιμή, και αφού ο μετρητής Α αλλάζει κατά τη εκτέλεση του βρόχου, αρά η αρχική τιμή δεν μπορεί να είναι το Α ....

odysseas

Δεν μπορώ να αγνοήσω το επιχείρημα ότι το Τετράδιο Μαθητή δίνει την οδηγία στους μαθητές να μη γράφουν προγράμματα που τροποποιούν την αρχική τιμή, αλλά ας μην ξεχνάμε ότι πρόκειται για οδηγία -- εγώ από το παραπάνω απόσπασμα δεν καταλαβαίνω ότι δε γίνεται ή ότι απαγορεύεται η τροποποίηση της αρχικής τιμής, αλλά ότι πρέπει να αποφεύγεται, για να μην οδηγήσει σε προγράμματα "δυσνόητα ή λανθασμένα". Να προσθέσω επίσης ότι η τροποποίηση της αρχικής τιμής, σε αντίθεση με τις υπόλοιπες μη-συνιστώμενες τροποποιήσεις, δε μεταβάλλει το σταθερό και γνωστό εκ των προτέρων πλήθος των επαναλήψεων, άρα δεν έρχεται σε αντίθεση με το "πνεύμα" της ΓΙΑ.

Να δώσω κι ένα παράδειγμα όπου το να παραβιάσει κανείς την παραπάνω οδηγία δε μου φαίνεται καθόλου λανθασμένο: Έστω ότι μας δίνεται το παρακάτω απόσπασμα αλγορίθμου και τίθεται το ερώτημα αν μπορεί να γραφτεί ισοδύναμα με την επαναληπτική δομή ΓΙΑ:

α <-- 20
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
  β <-- α ^ 2
  ΕΜΦΑΝΙΣΕ β
  α <-- α - 3
ΜΕΧΡΙΣ_ΟΤΟΥ α < 10
ΕΜΦΑΝΙΣΕ α, β


Η τυπική μετατροπή σε ΟΣΟ μας δίνει:

α <-- 20
β <-- α ^ 2
ΕΜΦΑΝΙΣΕ β
α <-- α - 3
ΟΣΟ α >= 10 ΕΠΑΝΑΛΑΒΕ
  β <-- α ^ 2
  ΕΜΦΑΝΙΣΕ β
  α <-- α - 3
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΕΜΦΑΝΙΣΕ α, β


Θα απαντούσα ότι μπορεί να χρησιμοποιηθεί η δομή ΓΙΑ, ως εξής:

α <-- 20
β <-- α ^ 2
ΕΜΦΑΝΙΣΕ β
ΓΙΑ α ΑΠΟ α-3 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ -3
  β <-- α ^ 2
  ΕΜΦΑΝΙΣΕ β
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΕΜΦΑΝΙΣΕ α, β

gthal

χμμ... Οδυσσέα δεν κατάλαβα γιατί πρέπει να εκτελεστούν οι εντολές
β <-- α ^ 2
ΕΜΦΑΝΙΣΕ β
α <-- α - 3
μια φορά πριν να αρχίσει η ΟΣΟ (και κατ' επέκταση οι β <-- α ^ 2  και ΕΜΦΑΝΙΣΕ β  πριν από τη ΓΙΑ)

αλλά, τέλος πάντων, αν θέλουμε να αρχίσουμε τη ΓΙΑ από την τιμή α-3 καλύτερα δε θα ήταν να γράφαμε το παρακάτω;
ΓΙΑ κ ΑΠΟ α-3 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ -3
  β <-- κ^ 2
  ΕΜΦΑΝΙΣΕ β
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Φιλικά,
Γιώργος Θαλασσινός

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

Παράθεση από: odysseas στις 02 Οκτ 2010, 01:33:28 ΜΜ
Δεν μπορώ να αγνοήσω το επιχείρημα ότι το Τετράδιο Μαθητή δίνει την οδηγία στους μαθητές να μη γράφουν προγράμματα που τροποποιούν την αρχική τιμή, αλλά ας μην ξεχνάμε ότι πρόκειται για οδηγία -- εγώ από το παραπάνω απόσπασμα δεν καταλαβαίνω ότι δε γίνεται ή ότι απαγορεύεται η τροποποίηση της αρχικής τιμής, αλλά ότι πρέπει να αποφεύγεται, για να μην οδηγήσει σε προγράμματα "δυσνόητα ή λανθασμένα". ...

H εν λόγω "οδηγία" αναφερόταν σε άλλη παρόμοια ερώτηση (για μεταβολή του μετρητή) ... Η σχετική παράγραφος, λοιπόν, της παραπάνω εγκυκλίου τελειώνει ως εξής: "Από τα προαναφερθέντα προκύπτει ότι η ΓΛΩΣΣΑ αποκλείει τη μεταβολή του μετρητή."

Εγώ μετά από όλα αυτά θεωρώ ότι δεν πρόκειται πλέον για οδηγία αλλά για απαγόρευση! Στο κάτω κάτω αφού μπορεί να γραφτεί και με άλλο τρόπο, όπως λέει και ο Γιώργος, γιατί να φτάνουμε σε κώδικα αμφισβητούμενο;

odysseas

Παράθεση από: gthal στις 02 Οκτ 2010, 02:37:47 ΜΜ
δεν κατάλαβα γιατί πρέπει να εκτελεστούν οι εντολές
β <-- α ^ 2
ΕΜΦΑΝΙΣΕ β
α <-- α - 3
μια φορά πριν να αρχίσει η ΟΣΟ

Επειδή έτσι θα γίνει και με το αρχικό απόσπασμα που χρησιμοποιεί τη ΜΕΧΡΙΣ_ΟΤΟΥ και η εκφώνηση ζητά ισοδύναμο κώδικα.

Παράθεση από: Νίκος Αδαμόπουλος στις 02 Οκτ 2010, 03:28:01 ΜΜ
Εγώ μετά από όλα αυτά θεωρώ ότι δεν πρόκειται πλέον για οδηγία αλλά για απαγόρευση! Στο κάτω κάτω αφού μπορεί να γραφτεί και με άλλο τρόπο, όπως λέει και ο Γιώργος, γιατί να φτάνουμε σε κώδικα αμφισβητούμενο;

Όπως αγαπάς! Δε θέλω να παρεξηγηθώ: δε θα πρότεινα κανείς να γράψει κώδικα που ακροβατεί και δεν μπορώ να σκεφτώ γενικές περιπτώσεις στις οποίες θα έγραφα έναν αλγόριθμο που να χρησιμοποιεί τέτοιου είδους διατυπώσεις. Ωστόσο, έδωσα ένα παράδειγμα άσκησης η οποία, κατά τη γνώμη μου, λύνεται ορθότερα έτσι. Αν χρησιμοποιήσεις άλλη μεταβλητή γράφεις κώδικα που έχει το ίδιο αποτέλεσμα όμως δεν "ισοδυναμεί" με τον αρχικό. Βέβαια, καλό θα ήταν να μην μπούμε σε συζητήσεις που αφορούν τη νεφελώδη "ισοδυναμία", αφού αυτό δεν είναι το θέμα του thread και αφού τα τελευταία χρόνια στις εξετάσεις η λέξη αυτή δε χρησιμοποιείται πια.

Όσο για τη μη μεταβολή του μετρητή (ή και της τελικής τιμής) μέσα στην επανάληψη, δεν υπάρχει συζήτηση, δεν μπορεί να επιτρέπεται.

evry

Το θέμα το έχουμε ξανασυζητήσει παλαιότερα αλλά δεν θυμάμαι το σχετικό thread.
Κατ'αρχήν τι νόημα έχει να λέμε ότι "δεν επιτρέπεται να αλλάζουμε την αρχική τιμή" του μετρητή στη Για από τη στιγμή που η τιμή αυτή υπολογίζεται μια φορά πριν την πρώτη επανάληψη? Δηλαδή σε τι θα επηρεάσει την αρχική τιμή αν το Α αλλάξει μετά τιμή?
Προφανώς σε τίποτα.
Σίγουρα ο αρχικός κώδικας δεν είναι λάθος. Απλά είναι κακή πρακτική, και πρέπει να αποτρέπουμε τους μαθητές από το να γράφουν τέτοιο κώδικα, αλλά δεν μπορούμε να το χαρακτηρίσουμε και λάθος.
   Συμφωνώ με τον odyssea που λέει ότι πρόκειται για οδηγία και όχι για απαγόρευση γιατί αν πούμε ότι είναι λάθος θα πρέπει να εξηγήσουμε και τι λάθος είναι, συντακτικό ή λογικό.
  Επίσης οι "μερικές" γλώσσες προγραμματισμού που λέει το τετράδιο μαθητή είναι οι C, C++, Java, C#. Δηλαδή όλες οι σύγχρονες γλώσσες προγραμματισμού.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gthal

Παράθεση από: odysseas στις 02 Οκτ 2010, 04:12:11 ΜΜ
Βέβαια, καλό θα ήταν να μην μπούμε σε συζητήσεις που αφορούν τη νεφελώδη "ισοδυναμία"
Με πρόλαβες.   :-X

Γιατί με βρίσκει αντίθετο ετούτο:
Παράθεση από: odysseas στις 02 Οκτ 2010, 04:12:11 ΜΜ
Επειδή έτσι θα γίνει και με το αρχικό απόσπασμα που χρησιμοποιεί τη ΜΕΧΡΙΣ_ΟΤΟΥ και η εκφώνηση ζητά ισοδύναμο κώδικα.
Και ετούτο:
Παράθεση από: odysseas στις 02 Οκτ 2010, 04:12:11 ΜΜ
Αν χρησιμοποιήσεις άλλη μεταβλητή γράφεις κώδικα που έχει το ίδιο αποτέλεσμα όμως δεν "ισοδυναμεί" με τον αρχικό.
Και είχα αρχίσει κι εγώ να σκέφτομαι τι εννοεί με τον όρο "ισοδυναμία" ο καθένας μας.
(αλλά απ' ότι είδα σε συζητήσεις προηγούμενων ετών, πράγματι είναι μια έννοια σχετική και χωράει ατέλειωτη κουβέντα)
Φιλικά,
Γιώργος Θαλασσινός