Επανάληψη ΓΙΑ

Ξεκίνησε από abal, 07 Δεκ 2018, 09:39:53 ΠΜ

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

abal

Στο μικρό βιβλίο του μαθήματος "Οδηγίες Μελέτης Μαθητή", στη σελίδα 35, παράγραφος 3.3.3 αναφέρει στις παρατηρήσεις τα παρακάτω:

Μέσα στην εντολή ΓΙΑ δεν επιτρέπεται να αλλάζει η τιμή της μεταβλητής του ΓΙΑ, γιατί τότε δεν λειτουργεί σωστά η εντολή επανάληψης.

Αυτό το "δεν επιτρέπεται" τι σημαίνει; Σε όλες τις γλώσσες προγραμματισμού η μεταβλητή αυτή επιτρέπεται να αλλάζει. Μπορεί να μην είναι καλή πρακτική αλλά δεν απαγορεύεται.

Σε περίπτωση αντίστοιχης ερώτησης σωστού λάθους, τι λέμε στους μαθητές μας;

Λαμπράκης Μανώλης

Καλημέρα

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

ΥΓ. νομίζω πως και στον διερμηνευτή της ΓΛΩΣΣΑΣ ισως γίνεται να αλλάξει ο μετρητής, ο Άλκης είναι σίγουρα  ο καταλληλότερος για να μας λύσει την απορία, όμως "στπ πλαίσιο του μαθήματος" δεν γίνεται μάλλον .

P.Tsiotakis

Όπως το    δεν επιτρέπεται να κάνω διαίρεση με το μηδέν, γιατί τότε δεν ορίζεται η πράξη.
Όπως το    δεν επιτρέπεται το βήμα της δομής ΓΙΑ να είναι μηδέν, γιατί τότε θα πραγματοποιηθούν άπειρες επαναλήψεις.
Όπως το    δεν επιτρέπεται εντός του ΓΙΑ να τροποποιούνται οι τιμές της αρχικής τιμής, της τελικής τιμής και του βήματος, γιατί τότε είναι μη προκαθορισμένο το πλήθος των επαναλήψεων.

alkisg

Το "δεν λειτουργεί σωστά η εντολή επανάληψης" το ερμηνεύω ως "λειτουργεί αλλά δεν κάνει αυτό που πρέπει".
Και επομένως αφού λειτουργεί είναι και εκτελέσιμη.
Και επομένως ο Διερμηνευτής είναι υποχρεωμένος να εκτελέσει τις εντολές αλλαγής των μετρητών μιας ΓΙΑ.
Για παράδειγμα, στον Διερμηνευτή, ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 10... ι <- 20 ...ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ, το ι θα γίνει 20 και η επανάληψη θα σταματήσει.

Όμως προσοχή, ο μαθητής δεν μπορεί να στηριχθεί στη συγκεκριμένη συμπεριφορά του Διερμηνευτή· κάποια άλλη υλοποίηση θα μπορούσε να αγνοεί τελείως τις χειρωνακτικές αλλαγές του μετρητή (π.χ. αν χρησιμοποιούσε registers για ταχύτητα στους μετρητές). Είναι αυτό που λέμε "undefined behavior", δηλαδή κάθε προγραμματιστικό περιβάλλον είναι υποχρεωμένο να εκτελέσει όπως νομίζει αυτή την εντολή, αλλά δεν μπορούμε να στηριχθούμε στο τι θα κάνει εφόσον δεν έχει καθοριστεί στο "πρότυπο", στην ίδια την ΓΛΩΣΣΑ. Αυτό δεν είναι κάτι σπάνιο, ακόμα και στην Javascript υπάρχουν σημεία με undefined behavior όπου ο κάθε browser το υλοποιεί όπως νομίζει και οι προγραμματιστές πρέπει να τα αποφεύγουν αφού δεν ορίζονται από το σχετικό πρότυπο της W3C.

Όσον αφορά στη βαθμολόγηση, νομίζω ότι το να στηρίζει κάποιος το πρόγραμμά του σε εντολές με "undefined behavior" αξίζει κάποα απώλεια σε μονάδες, αφού μπορεί σίγουρα να θεωρηθεί κακή πρακτική και πιθανώς και λογικό λάθος.

abal

Προσωπικά θεωρώ το "δεν επιτρέπεται" λάθος διατύπωση που θα έπρεπε να αλλαχθεί.

Το να βάλω βήμα 0 στο ΓΙΑ δεν είναι απλά ένα λογικό λάθος;  Σαν να ξεχάσω την αύξηση του μετρητή στον ΟΣΟ;

αλλά πείτε μου, αν σε άσκηση μαθητής χρησιμοποιήσει ΓΙΑ, και αλλάξει το μετρητή (με ΑΝ) για να σταματήσει την επανάληψη όταν ικανοποιηθεί μια συνθήκη, θα κόβατε μονάδες;
Συμφωνώ ότι είναι κακή πρακτική, αλλά οι κακές πρακτικές δεν έχουν αρνητική βαθμολογία σε γραπτές εξετάσεις.

alkisg

Δεν σου εγγυάται κάποιος ότι αλλάζοντας την τιμή του μετρητή θα τερματιστεί η επανάληψη. Δεν είναι σίγουρο ότι είναι απλά κακή πρακτική, ανάλογα με την υλοποίηση μπορεί να μην δουλεύει καν.

Για παράδειγμα, το παρακάτω πρόγραμμα στο Διερμηνευτή εσκεμμένα εμφανίζει "1 2 3 4 5" και όχι "1" όπως πιθανώς κάποιοι θα περίμεναν. Εξήγηση στη βοήθεια, https://alkisg.mysch.gr/ΓΛΩΣΣΑ/ΓΙΑ/.

ΠΡΟΓΡΑΜΜΑ τεστ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι, κ
ΑΡΧΗ
  κ <- 5
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ κ
    ΓΡΑΨΕ ι
    κ <- 0
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

Κωστας τζιαννης

μιας και ειπωθηκε για μετρητες και για ,να κατι που θεωρω ενδιαφερον.

με δεδομενο μη αρνητικο αριθμο χ που διαβαζεται απο το πληκτρολογιο να βρειτε τι υλοποιει το παρακατω τμημα αλγοριθμου

ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ χ
    ΓΡΑΨΕ ι
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  Σ <- ΨΕΥΔΗΣ
  ΑΝ ι - 1 = χ ΤΟΤΕ
    Σ <- ΑΛΗΘΗΣ
  ΤΕΛΟΣ_ΑΝ