μεταβλητή για βήμα

Ξεκίνησε από droopy, 31 Οκτ 2007, 12:23:59 ΠΜ

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

alkisg

Δηλαδή θα έφτιαχνες ποτέ τον apache με
ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 2 ΜΕ_ΒΗΜΑ -1
;;;

Δεν θα ήταν (προγραμματιστικά) πιο κατανοητό αν χρησιμοποιούσες
ΌΣΟ ΑΛΗΘΗΣ ΕΠΑΝΑΛΑΒΕ
;;;

(Παρένθεση, μάλιστα δεν είναι καν άπειρο loop, αλλά είναι του στυλ

while (getmessage() != QUIT) {
εξυπηρέτησε...
}

αλλά οκ, δεν παίζει ρόλο στη συζήτηση).


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

evry


Για τον apache δεν ξέρω, αλλά έχω δει πολλές φορές κάτι τέτοιο σε κάποιον εξυπηρέτη που περιμένει κάποιο σήμα
for ( ; ; )
και μετά κάνει break

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

Αυτό στο οποίο θέλω να σταθώ είναι ότι κάτι δεν είναι καλά ορισμένο εδώ. Και πιο συγκεκριμένα στο θέμα της μετατροπής της Για σε Όσο. Εκεί με ξενίζει λίγο αυτή η ιδέα. Το πότε μετατρέπουμε δηλαδή το ΜΕΧΡΙ σε <= ή >= . Δεν ξέρω αν αυτό πρέπει να καθορίζεται αποκλειστικά από το βήμα. Αν δηλαδή δώσεις σε κάποιον την παρακάτω δομή

ΓΙΑ Ι ΑΠΟ 3 ΜΕΧΡΙ 4 ΜΕ ΒΗΜΑ -1

δεν είναι πιο λογικό να σκεφτεί ότι ξεκινάω από το 3 και μειώνω κατά -1 μέχρι να φτάσω στο 4? Αλλά επειδή δεν φτάνω ποτέ στο 4 έχω ατέρμων βρόχο. Ποιο λογικό μου φαίνεται αυτό παρά το ότι δεν εκτελείται καμία φορά.
Δε λέω ότι το βιβλίο έχει κάποιο λάθος, απλά δε μου φαίνεται τόσο ξεκάθαρο και πολλοί μαθητές μπορεί να μπερδευτούν.
Για παράδειγμα αν τους ζητήσουμε να μετατρέψουν το παρακάτω τμήμα σε ΓΙΑ..ΑΠΟ...ΜΕΧΡΙ

Ι<--4
ΟΣΟ Ι<=5 ΕΠΑΝΑΛΑΒΕ
     ΓΡΑΨΕ Ι
     Ι <-- Ι - 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

φαντάζομαι ότι σχεδόν όλοι θα κάνουν κάτι τέτοιο
ΓΙΑ Ι ΑΠΟ 4 ΜΕΧΡΙ 5 ΜΕ ΒΗΜΑ -1
     ΓΡΑΨΕ Ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


το οποίο όμως με βάση τη θεώρηση του βιβλίου δεν είναι σωστό

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

alkisg

> for ( ; ; )
Σύμφωνοι, αλλά αυτό δεν έχει καμία σχέση με το αντίθετο βήμα (ούτε και με τη ΓΙΑ της ΓΛΩΣΣΑΣ)... Φαντάζεσαι να το γράφανε
for (int i = 0; i < 1; i--)
ποιος θα καταλάβαινε τι εννοούν;

> Τώρα για το παιδαγωγικό κομμάτι δε μίλησα συγκεκριμένα για τη ΓΙΑ, αλλά για τον ατέρμονα βρόχο...
Νομίζω ότι καλύτερα να χρησιμοποιηθεί η ΟΣΟ σαν παράδειγμα ατέρμονα βρόχου, όχι η ΓΙΑ.

> δεν είναι πιο λογικό να σκεφτεί ότι ξεκινάω από το 3 και μειώνω κατά -1 μέχρι να φτάσω στο 4?
Ακόμα κι αν υποθέσουμε ότι το εφαρμόζαμε στην πράξη, τελικά δεν θα ήταν άπειρος βρόχος. Στη ΓΛΩΣΣΑ αναγκαστικά (αφού υποτίθεται είμαστε σε Η/Υ) υπάρχει περιορισμένο εύρος στους ακεραίους. Θα "κατέβαινε" μέχρι τον -2^(αριθμός bits-1) (π.χ. -9223372036854775808 για 64bit ακεραίους που χρησιμοποιεί ο Διερμηνευτής) και μετά θα έκανε ανακύκλωση και θα πήγαινε στον θετικό 2^(αριθμός bits-1), οπότε θα σταματούσε η επανάληψη. Άντε να το εξηγήσεις αυτό στους μαθητές... Πιο λογικό είναι να τους πεις ότι άπειρος βρόχος είναι ο παρακάτω, επειδή ξέχασαν να αλλάξουν το μετρητή...

Κώδικας: ΓΛΩΣΣΑ
ι <- 1
ΟΣΟ ι < 10 ΕΠΑΝΑΛΑΒΕ
  ΓΡΑΨΕ Ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

evry


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

Ι <-- 4
ΟΣΟ Ι<=5 ΕΠΑΝΑΛΑΒΕ
      Ι <-- Ι - 1 
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

alkisg

Αυτό που λέω είναι ότι δεν πρέπει να του θέσουμε τέτοιο ερώτημα. Όταν μετά πάμε στα κεφάλαια 7-10 και του κάνουμε ΓΛΩΣΣΑ, τι θα του πούμε; Τώρα δεν είμαστε σε ψευδογλώσσα, είμαστε σε Η/Υ και άρα αυτά που σου έλεγα ότι είναι άπειρο loop δεν ισχύουν;

Αλλά και στην ψευδογλώσσα, πόσο λογικό ακούγεται ένας αριθμός να έχει άπειρα ψηφία; Δεν είναι ενάντια στον ψηφιακό κόσμο των Η/Υ, στους οποίους δεν υπάρχει τίποτα "άπειρο"; Ακόμα και οι αλγόριθμοι σε χαρτί θα πρέπει να σέβονται ορισμένους βασικούς περιορισμούς (και όντως τους σέβονται, δεν θα βρεις αλγόριθμο που να υποθέτει ότι οι αριθμοί έχουν άπειρα ψηφία)...

Καλύτερα δηλαδή θα είναι να μην θεωρούμε/διδάσκουμε άπειρα loops με μεταβολή του μετρητή. Καλύτερα όταν αναφερόμαστε σε άπειρα loops να δίνουμε σαν παράδειγμα μία ΟΣΟ ή μία ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ όπου δεν αλλάζει ποτέ η συνθήκη.

evry


  Δεν έχω πρόβλημα με τις άπειρες επαναλήψεις, ας μην είναι ατέρμων βρόχος, αυτό που είπα από την αρχή είναι ότι δεν φαίνεται περιέργο να πούμε στα παιδιά ότι η παρακάτω δομή επανάληψης δεν εκτελείται καμία φορά? Ας μην πούμε ότι εκτελείται άπειρες, δεν ξέρω πόσες εκτελείται, αλλά λογικά δεν πρέπει να εκτελείται κάποιες φορές?

ΓΙΑ Ι ΑΠΟ 4 ΜΕΧΡΙ 5 ΜΕ ΒΗΜΑ -1
     ΓΡΑΨΕ Ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Το πρόβλημα δεν είναι η έννοια του ατέρμονος βρόχου αλλά το ότι η μετατροπή από Για σε Όσο δεν είναι καλά ορισμένη, εκεί ήθελα να σταθώ από την αρχή.
Δηλαδή δεν είναι παράξενο ότι η παραπάνω δομή μετατρέπεται σε Όσο (σύμφωνα με το βιβλίο καθηγητή) έτσι
Ι <-- 4
ΟΣΟ Ι>=5 ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ Ι
      Ι <-- Ι - 1 
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


ενώ η παρακάτω

ΓΙΑ Ι ΑΠΟ 4 ΜΕΧΡΙ 5 ΜΕ ΒΗΜΑ 0
     ΓΡΑΨΕ Ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


έτσι;

Ι <-- 4
ΟΣΟ Ι<=5 ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ Ι
      Ι <-- Ι - 0 
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


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

alkisg

Όσο γι' αυτό συμφωνώ και επαυξάνω.

Για μένα, η σωστή μετάφραση ενός ΓΙΑ σε ΟΣΟ, όπως αναφέρω και στη βοήθεια του Διερμηνευτή, είναι η εξής:

Κώδικας: ΓΛΩΣΣΑ
ΓΙΑ μετρητής ΑΠΟ έκφραση_αρχής ΜΕΧΡΙ έκφραση_τέλος ΜΕ_ΒΗΜΑ έκφραση_βήματος
  (εντολές)
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


ισοδυναμεί με:

Κώδικας: ΓΛΩΣΣΑ
μετρητής <- έκφραση_αρχής
βοηθητική_έκφραση_τέλους <- έκφραση_τέλους
βοηθητική_έκφραση_βήματος <- έκφραση_βήματος
ΑΝ βοηθητική_έκφραση_βήματος = 0 ΤΟΤΕ
  ΚΑΛΕΣΕ ΛάθοςΕκτέλεσης('Το βήμα στη ΓΙΑ δεν μπορεί να είναι μηδέν')
ΑΛΛΙΩΣ
  ΑΝ βοηθητική_έκφραση_βήματος > 0 ΤΟΤΕ
    ΟΣΟ μετρητής <= βοηθητική_έκφραση_τέλους ΕΠΑΝΑΛΑΒΕ
      (εντολές)
      μετρητής <- μετρητής + βοηθητική_έκφραση_βήματος
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΛΛΙΩΣ
    ΟΣΟ μετρητής >= βοηθητική_έκφραση_τέλους ΕΠΑΝΑΛΑΒΕ
      (εντολές)
      μετρητής <- μετρητής + βοηθητική_έκφραση_βήματος
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ


Οι βοηθητικές_ΧΧΧ μεταβλητές είναι απαραίτητες επειδή η ΓΙΑ, έτσι όπως θεωρείται στη ΓΛΩΣΣΑ και τις παραπλήσιες γλώσσες (Pascal, Basic αλλά όχι τη C που δεν έχει καμία σχέση), χρησιμοποιείται για σταθερό αριθμό επαναλήψεων. Επομένως δεν μπορούμε να επιτρέπουμε στην τελική τιμή ή στο βήμα να αλλάζουν εντός της επανάληψης. Και φυσικά, αν π.χ. στην έκφραση_βήματος υπήρχε μία συνάρτηση, δεν θα θέλαμε να καλείται κάθε φορά.

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

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

d_bam

Παράθεση από: evry στις 10 Νοε 2007, 01:54:28 ΜΜ

  Δεν έχω πρόβλημα με τις άπειρες επαναλήψεις, ας μην είναι ατέρμων βρόχος, αυτό που είπα από την αρχή είναι ότι δεν φαίνεται περιέργο να πούμε στα παιδιά ότι η παρακάτω δομή επανάληψης δεν εκτελείται καμία φορά? Ας μην πούμε ότι εκτελείται άπειρες, δεν ξέρω πόσες εκτελείται, αλλά λογικά δεν πρέπει να εκτελείται κάποιες φορές?

ΓΙΑ Ι ΑΠΟ 4 ΜΕΧΡΙ 5 ΜΕ ΒΗΜΑ -1
     ΓΡΑΨΕ Ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Το πρόβλημα δεν είναι η έννοια του ατέρμονος βρόχου αλλά το ότι η μετατροπή από Για σε Όσο δεν είναι καλά ορισμένη, εκεί ήθελα να σταθώ από την αρχή.
Δηλαδή δεν είναι παράξενο ότι η παραπάνω δομή μετατρέπεται σε Όσο (σύμφωνα με το βιβλίο καθηγητή) έτσι
Ι <-- 4
ΟΣΟ Ι>=5 ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ Ι
      Ι <-- Ι - 1 
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


ενώ η παρακάτω

ΓΙΑ Ι ΑΠΟ 4 ΜΕΧΡΙ 5 ΜΕ ΒΗΜΑ 0
     ΓΡΑΨΕ Ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


έτσι;

Ι <-- 4
ΟΣΟ Ι<=5 ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ Ι
      Ι <-- Ι - 0 
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ




Πιστεύω πως αν και δεν είναι καλά ορισμένη η μετατροπή όπως φαίνεται και στο παράδειγμά σου, θα μπορούσαμε να αποφύγουμε κάποια σύγχιση
ΠΩΣ;
Δεν υπάρχει λόγος να δώσόυμε ούτε εμείς οι καθηγητές ούτε στις πανελλήνιες για μετατροπή κάποιον ατέρμων βρόχο από μια μορφή σε κάποια άλλη.
Επιπλέον πιστεύω πως όταν στο ΓΙΑ ΑΠΟ ΜΕΧΡΙ το βήμα είναι θετικός θα πρέπει στη μετατροπή να παίρνουμε συνθήκη με <= ,ενώ αν είναι αρνητικός θα πρέπει να παίρνουμε συνθήκη με >= 

Αλεξόπουλος Ανδρέας

Θα συμφωνήσω κι εγώ με τον φίλο d_bam σε αυτά που έγραψε πιο πάνω. Δεν υπάρχει κανένας λόγος να προσπαθήσουμε να δείξουμε πως μετατρέπεται ένας ατέρμων βρόχος από μια μορφή στην άλλη. Δεν πιστεύω πως είναι αυτός ο σκοπός του μαθήματος, και προσωπικά το θεωρώ απίθανο να ζητηθεί ποτέ τέτοιο θέμα. Το θέμα είναι να μάθουμε στα παιδιά να σκέφτονται σωστά για το πώς θα αντιμετωπίσουν και θα λύσουν έναν αλγόριθμο που "λύνεται".
Και μια γενικότερη προσωπική άποψη την οποία και ακολουθώ στο μάθημά μου. Πιστεύω ότι δεν πρέπει να κοιτάμε τι ακριβώς γίνεται στις κανονικές γλώσσες προγραμματισμού. Στην C για παράδειγμα μπορείς να γράψεις ό,τι σκεφτείς, το οποίο πιθανώς να τρέξει και να βγάλει κάποιο αποτελέσμα. Δεν σημαίνει ότι θα πρέπει να προσπαθήσουμε να κάνουμε το ίδιο και στην ΓΛΩΣΣΑ ή σε έναν ψευδοκώδικα. Γιατί να προσπαθήσουμε να αλλάξουμε με κάποιο τρόπο το ΒΗΜΑ στην εντολή ΓΙΑ...ΑΠΟ...ΜΕΧΡΙ ενώ αυτή έχει ξεκινήσει να εκτελείται; Ακομά κι αν αυτό γίνεται στην C και τη Java, τι θα κερδίσουμε με το να πούμε στα παιδιά πως αυτό σε μια γλώσσα προγραμματισμού γίνεται, αλλά σε εσάς όχι; Μάλλον, μόνο να τα μπερδέψουμε!
Και για να φέρω ένα παράδειγμα κλείνοντας. Έγραψα το παρακάτω πρόγραμμα σε C το οποίο έτρεψε κανονικά
-----------
main() {

        int a;
        a = 4.3;
        printf("a=%d\n",a);
}
------------
και εμφάνισε το 4 στην οθόνη. Πρέπει δηλαδή να προσπαθήσουμε να δούμε πώς θα το κάναμε σε ΓΛΩΣΣΑ; Φυσικά όχι γιατί είναι λάθος σύμφωνα με το συντακτικό της.
Απλώς εκεί που ήθελα να καταλήξω είναι πως δεν υπάρχει λόγος πολλές φορές να κάνουμε δύσκολη τόσο την ζωή την δική μας όσο και των μαθητών...

Φιλικά,
Ανδρέας.

evry


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

Αλεξόπουλος Ανδρέας

Φυσικά και δεν θεωρώ σωστό να προσπαθούμε να διδάξουμε μόνο ό,τι είναι πιθανό να πέσει σε πανελλήνιες (Πότε δεν το έκανα αυτό και ούτε έχω σκοπό να το κάνω). Αλλά όπως είπα και πιο πάνω, πρέπει να τους μαθαίνουμε να σκέφτονται σωστά. Απλώς προσπαθώντας να τους μάθουμε να μετατρέπουν έναν ατέρμων βρόχο σε άλλο, δεν το θεωρώ και τόσο χρήσιμο από παιδαγωγικής άποψης (άποψή μου βέβαια και μπορεί να κάνω λάθος). Υπάρχουν άλλωστε τόσα και τόσα παραδείγματα με μετατροπές που μπορεί να κάνει κάποιος.
Επειδή όμως αυτό το βιβλίο έχουμε και αυτή είναι η κατάσταση, προσπαθώ να βρω μια μέση λύση σε ορισμένα θέματα. Επίσης, επειδή (καλώς ή κακώς) δεν κάνουμε προγραμματισμό με την αυστηρή έννοια του προγραμματισμού, αλλά ετοιμάζουμε τα παιδιά για να γράψουν εξετάσεις, κάποια εξηζητημένα θέματα ίσως πρέπει να τα αποφεύγουμε. Και επειδή στην τελική ανάλυση, "κρίνεται" και το μέλλον τους από το πώς θα γράψουν σε κάθε μάθημα, και επειδή ποτέ δεν μπορείς να ξέρεις πώς σκέφεται αυτός που διορθώνει το κάθε θέμα, προσπαθώ να μάθω τα παιδιά να είναι όσο πιο τυπικά μπορούν σε κάποια πράγματα.

gpapargi

Παράθεση από: alkisg στις 09 Νοε 2007, 10:53:41 ΠΜ
Αλλά και στην ψευδογλώσσα, πόσο λογικό ακούγεται ένας αριθμός να έχει άπειρα ψηφία; Δεν είναι ενάντια στον ψηφιακό κόσμο των Η/Υ, στους οποίους δεν υπάρχει τίποτα "άπειρο"; Ακόμα και οι αλγόριθμοι σε χαρτί θα πρέπει να σέβονται ορισμένους βασικούς περιορισμούς (και όντως τους σέβονται, δεν θα βρεις αλγόριθμο που να υποθέτει ότι οι αριθμοί έχουν άπειρα ψηφία)...

Να πω πάνω σε αυτό ότι ο Knuth στο βιβλίο του έτσι ακριβώς ορίζει την αποτελεσματικότητα (effetciveness). Δηλαδή θα πρέπει να μπορούν οι αλγόριθμοι να εκτελεστούν από τον άνθρωπο με μολύβι και χαρτί. Και αναφέρει σαν παράδειγμα ακριβώς αυτό που γράφει και ο Άλκης. Στην περίπτωση που έχουμε πράξεις με πραγματικούς αριθμούς αναπτυγμένους σε άπειρα δεκαδικά ψηφία παραβιάζεται η αποτελεσματικότητα λόγω του ότι δεν μπορεί να γίνει το ίδιο με μολύβι και χαρτί.  Δεν μπορώ να μη θυμήσω την άποψή μου ότι το effectiveness μεταφέρθηκε λανθασμένα στα ελληνικά. Το effectiveness το χρησιμοποίησε ο Knuth με την άλλη έννοια που δίνουν τα λεξικά: αυτή της πραγματοποιησιμότητας  και όχι της αποτελεσματικότητας. Ο χειρισμός απείρων δεκαδικών αναπτυγμάτων των πραγματικών είναι "μη πραγματοποιήσιμος". Τι θα μπορούσε να σημαίνει το "μη αποτελεσματικός";

Στα άλλα τώρα

Με είχε προβληματίσει παλαιότερα Ευριπίδη αυτό που λες για τη λογική. Μου φαινόταν και εμένα «παράλογο»… ότι κι αν σημαίνει τέλος πάντων λογικό και παράλογο.

Ας δούμε το παράδειγμα «Για ι από 1 μέχρι 5 με_βήμα -1»

Η λογική που αναφέρεις (και η δική μου δηλαδή) λέει το εξής:

«Ξεκινάω από 1 και θέλω να ανέβω αφού το άλλο άκρο είναι το 5. ʼρα ο συγκριτικός τελεστής που θα χρησιμοποιήσω είναι ο <=. ʼρα η ισοδύναμη Όσο είναι η παρακάτω:

ι<-1
Όσο ι<=5 επανάλαβε
…
   ι<-ι-1
Τέλος_επανάληψης

ʼρα πάω σε ατέρμονα βρόχο.»


Η «λογική» που δείχνει να έχει το βιβλίο είναι η εξής: «Ξεκινάω από το 1 και θέλω να κατέβω αφού το βήμα είναι αρνητικό. ʼρα ο συγκριτικός τελεστής είναι το >=. ʼρα η ισοδύναμη Όσο είναι η παρακάτω:

ι<-1
Όσο ι>=5 επανάλαβε
…
   ι<-ι-1
Τέλος_επανάληψης

ʼρα δεν μπαίνω καμία φορά στο βρόχο.»

Η διαφορά των 2 «λογικών» είναι στο κριτήριο με βάση το οποίο αποφασίζουμε αν ανεβαίνουμε ή κατεβαίνουμε. Η πρώτη λογική βασίζεται στο άλλο άκρο. Η δεύτερη λογική βασίζεται στο βήμα. Βέβαια το πρόβλημα είναι ότι έχουμε να κάνουμε με μια παθολογική περίπτωση (είτε 0 είναι οι επαναλήψεις είτε άπειρες). Έτσι το βήμα και το δεξί άκρο δίνουν διαφορετικές "εκτιμήσεις".

Στη λογική του βιβλίου τίθεται το θέμα του τι γίνεται με βήμα 0. Δεν υπάρχει σαφής ορισμός μετατροπής, οπότε η πρώτη σκέψη που θα μπορούσα να κάνω είναι η εξής:
Για να υπάρχει συμμετρία ως προς τις 2 κατευθύνσεις θα έπρεπε να χρησιμοποιηθεί ο τελεστής <>. Δηλαδή:
ι<-1
Όσο ι<>5 επανάλαβε
…
   ι<-ι+0
Τέλος_επανάληψης

Βέβαια υπάρχει και η σκέψη του ʼλκη: «Αφού ο αριθμός επαναλήψεων πρέπει να είναι συγκεκριμένος και σταθερός τότε δεν επιτρέπεται να είναι ατέρμων ο βρόχος γιατί το άπειρο δεν είναι συγκεκριμένος αριθμός. ʼρα αν μπει βήμα 0 τότε δεν θα πρέπει να έχουμε ατέρμων βρόχο. ʼρα τι μένει; Να είναι λάθος εκτέλεσης»

Βασικά έχω προσέξει ʼλκη ότι εμείς οι 2 έχουμε μια διαφορετική προσέγγιση των πραγμάτων. Εσύ κυρίως ενδιαφέρεσαι για το πώς θα μπορούσαν να είναι τα πράγματα έτσι ώστε να βγαίνουν αληθής όλες οι προτάσεις του σχολικού βιβλίου. Λογικό μια που έχεις κάνει την υλοποίηση και κεντρικό σου μέλημα ήταν να υλοποιήσεις αυτό ακριβώς που περιγράφεται και όχι κάτι άλλο. Εγώ είμαι πιο πολύ «φιλόσοφος». Με απασχολεί το πως θα μπορούσαν να είναι τα πράγματα (συμπεριλαμβανομένου και του σχολικού βιβλίου) έτσι ώστε να δένουν όλα όσο γίνεται καλύτερα μεταξύ τους.

Αυτό που με απασχολεί εμένα (δεν το έχω σκεφτεί ακόμα αλλά το θέτω προς προβληματισμό) είναι το εξής:

Επιτρέπεται τελικά να ρωτήσουμε σε Σ-Λ αν η Για με βήμα 0 παραβιάζει την περατότητα;

Αν είναι λάθος η σύνταξη της "Για" με βήμα 0 τότε δεν θα παραβιαστεί καμία περατότητα γιατί δεν υπάρχει τέτοια σύνταξη. Αν υπήρχε τέτοια σύνταξη τότε θα είχαμε παραβίαση της περατότητας. Αλλά δεν υπάρχει γιατί σύμφωνα με το βιβλίο "Η Για πρέπει να εκτελείται για προκαθορισμένο αριθμό επαναλήψεων" και το άπειρο δεν είναι προκαθορισμένος αριθμός επαναλήψεων. Για να το θέσω διαφορετικά: Υπάρχει περίπτωση να κατασκευάσει κάποιος ατέρμονα βρόχο στο Διερμηνευτή χρησιμοποιώντας τη Για; Εννοώ να τον βάλει να τρέξει και να μην τελειώνει ποτέ.
Από την άλλη μεριά το βιβλίο λέει: "το βήμα δεν μπορεί να είναι μηδέν γιατί ο βρόχος εκτελείται επ' άπειρον". Ίσως  μια διέξοδος να είναι ότι η Για με βήμα 0 απλά δεν χρησιμοποιείται λόγω του ότι δε λύνει κάποιο πρόβλημα. Δηλαδή ότι το βιβλίο εννοεί ότι δεν χρησιμοποιείται και όχι ότι δεν γίνεται να χρησιμοποιηθεί. Θα μπορούσε δηλαδή να επιτρέπεται η χρηση του με τον κίνδυνο εγκλωβισμού σε ατέρμονα βρόχο.
Φυσικά δεν τίθεται κανένα θέμα παιδαγωγικής αξίας. Για να χρησιμοποιήσεις τη "Για" θα πρέπει να ξέρεις πόσες φορές θα την εκτελέσεις. ʼρα αποκλείεται να συλλάβεις λύση προβλήματος με "Για" που έχει βήμα 0.

evry

@gpapargi

Γιώργο αυτό που λες έχει πέσει θέμα το 2005. Μάλιστα η πλάκα είναι ότι στην εκφώνηση λέει "ο παρακάτω αλγόριθμος" ενώ θα έπρεπε να λέει τμήμα εντολών ή υπολογιστική διαδικασία. Το βήμα 0 δηλαδή υπάρχει και επίσημα στα θέματα οπότε δε μπορούμε να μην το εξηγήσουμε στα παιδιά

2. Ποιο κριτήριο δεν ικανοποιεί ο παρακάτω αλγόριθμος και γιατί;
      S  ← 0
      Για I από 2 μέχρι 10 με_βήμα 0
         S ← S + I
      Τέλος_επανάληψης
      Εμφάνισε S


@aalexop

  Προφανώς και συμφωνώ σε αυτά που λες. Εννοείται ότι δε μπορούμε να δίνουμε στους μαθητές ασκήσεις που έχουν ασάφειες. Όπως βλέπεις όμως το παραπάνω θέμα έπεσε στις εξετάσεις και είναι ατέρμων βρόχος, δηλαδή κάποιες φορές όταν δεν έχεις ορίσει καλά κάποια πράγματα, μπορεί κάποια άσκηση να δημιουργήσει σύγχυση στα παιδιά.
Αυτό που θέλω να τονίσω είναι ότι η δομή Για...από...μέχρι που παρουσιάζει το βιβλίο έχει κάποια κενά για τα οποία πρέπει να απολογηθείς σε κάποιον πιο υποψιασμένο μαθητή. Πιστεύω ότι θα έπρεπε αυτή η δομή να αλλάξει ή τουλάχιστον αν θέλουμε μια δομή που να μην υπάρχει αυτούσια σε κάποια γλώσσα προγραμματισμού ας την ορίσουμε καλά.
    Πιο συγκεκριμένα δε μου αρέσει να απαντάω σε ερωτήσεις μαθητών με την απάντηση "Γιατί έτσι το λέει το βιβλίο". Προσπάθω να εξηγώ κάθε φορά οτιδήποτε όσο πιο απλά γίνεται και να αποκαλύπτω τη λογική που υπάρχει πίσω από κάθε εντολή ή μηχανισμό της γλώσσας. Και υπάρχουν πράγματα στα οποία δε μπορεί να γίνει αυτό. Θα μπορούσε όμως αν είχαν οριστεί διαφορετικά.
  π.χ. στην Pascal (από την οποία προέρχεται κατά μεγάλο βαθμό η Γλώσσα) δεν υπάρχει πρόβλημα με το αρνητικό βήμα γιατί εκεί υπάρχει το DOWNTO οπότε ξέρεις αν ανεβαίνεις ή κατεβαίνεις. Δεν θα ήταν πιο απλό και λογικό αν υπήρχε ένα αντίστοιχο DOWNTO και στη Γλώσσα;

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

koniordos

Bέβαια στην Pascal δεν υπάρχει step στη for. Οπότε, πας αναγκαστικά με while ή repeat.

Στα παιδιά εγώ "αναγκάζομαι" να διδάσκω πως ο συγκεκριμένος "Αλγόριθμος" (τί παράδοξο και αυτο? Αφού δεν ικανοποιεί ένα sine qua non κριτήριο - πώς είναι αλγόριθμος?)
δεν ικανοποιεί το κριτήριο της περατότητας γιατί ξέρω πως αυτό αναμένεται σαν απάντηση, ενώ πέρα των όλων ασαφειών που κουβαλάει, νιώθω πως είναι καθαρή περίπτωση παραβίασης της αποτελεσματικότητας - βλέπω μια μη πραγματοποιήσιμη εντολή!
Τσορώνης Τάκης
Ηλ.Μηχ. & Μηχ. Η/Υ ΕΜΠ

alkisg

Παράθεση από: gpapargi στις 16 Νοε 2007, 10:47:49 ΠΜ
Ξεκινάω από 1 και θέλω να ανέβω αφού το άλλο άκρο είναι το 5. Άρα ο συγκριτικός τελεστής που θα χρησιμοποιήσω είναι ο <=.
Όχι, αυτό δεν είναι σωστό. Το σωστό είναι να αποφασιστεί το <= ή >= ανάλογα με την τιμή του βήματος. Εκτός του ότι έτσι το κάνουν και οι άλλες γλώσσες προγραμματισμού, είναι και πιο λογικό, γιατί μπορεί να χρησιμεύσει σε περισσότερα σενάρια από ότι αν κοιτάμε τα άκρα. Δεν γράφω παραδείγματα για να μην μακρυγορήσω.

Παράθεση από: gpapargi στις 16 Νοε 2007, 10:47:49 ΠΜ
Για να υπάρχει συμμετρία ως προς τις 2 κατευθύνσεις θα έπρεπε να χρησιμοποιηθεί ο τελεστής <>.

Κώδικας: ΓΛΩΣΣΑ
ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 1
  ΓΡΑΨΕ ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Το παραπάνω προφανώς επαναλαμβάνεται ακριβώς μία φορά.

Κώδικας: ΓΛΩΣΣΑ
ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 1 ΜΕ_ΒΗΜΑ 0
  ΓΡΑΨΕ ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Αν το μεταφράσουμε με ΟΣΟ και <>, τότε αυτό δεν θα επαναληφθεί καμία φορά, το οποίο δεν στέκει. Επομένως δεν μπορούμε να χρησιμοποιήσουμε <> για τη μετάφραση του ΜΕ_ΒΗΜΑ 0.


Παράθεση από: gpapargi στις 16 Νοε 2007, 10:47:49 ΠΜ
Εσύ κυρίως ενδιαφέρεσαι για το πώς θα μπορούσαν να είναι τα πράγματα έτσι ώστε να βγαίνουν αληθής όλες οι προτάσεις του σχολικού βιβλίου.

Αν και με ενδιαφέρει να ερμηνεύεται πιστά το βιβλίο, ώστε μέσα από το Διερμηνευτή να δίνονται όσο πιο σωστές κατευθύνσεις γίνεται, δεν είναι το μόνο που με ενδιαφέρει. Με ενδιαφέρει επίσης η ΓΛΩΣΣΑ να είναι κατάλληλη για εκπαιδευτικούς σκοπούς. Όταν (σωστά) λέμε ότι η ΓΙΑ χρησιμοποιείται για συγκεκριμένο αριθμό επαναλήψεων, δεν μπορούμε στη συνέχεια να ρωτάμε στις πανελλήνιες τι γίνεται για βήμα = 0. Αναμενόμενες μετά είναι και οι συναφείς ερωτήσεις "μπορούμε να αλλάξουμε το μετρητή μέσα στη ΓΙΑ;" ή "ποια τιμή έχει ο μετρητής μετά την ΓΙΑ;".
Σε επόμενες εκδόσεις του Διερμηνευτή σκέφτομαι να απαγορευτούν τα παραπάνω. Είναι λάθος από τη μία να χρησιμοποιούμε την εκπαιδευτική ΓΛΩΣΣΑ για να μην μπαίνουμε σε "λεπτομέρειες ενός συγκεκριμένου προγραμματιστικού περιβάλλοντος" και από την άλλη να εξετάζουμε ακριβώς αυτές τις λεπτομέρειες.
Αν μπορούσε να διορθωθεί το βιβλίο, θα απαντούσα σε όλα τα παραπάνω "Είναι λάθος εκτέλεσης. Τελεία. Δεν το χρησιμοποιούμε, δεν μας ενδιαφέρει".

Παράθεση από: gpapargi στις 16 Νοε 2007, 10:47:49 ΠΜ
Υπάρχει περίπτωση να κατασκευάσει κάποιος ατέρμονα βρόχο στο Διερμηνευτή χρησιμοποιώντας τη Για;
Μέχρι στιγμής ναι, αρκεί κάποιος να μεταβάλλει την τιμή του μετρητή στο εσωτερικό της επανάληψης. Σκέφτομαι όμως να το αλλάξω σε επόμενη έκδοση και να προκαλείται λάθος χρόνου εκτέλεσης. Θα δούμε, ίσως μία ψηφοφορία ή μια ακόμα επιλογή στο διάλογο επιλογών. :)

Παράθεση από: evry στις 16 Νοε 2007, 01:21:02 ΜΜ
π.χ. στην Pascal (από την οποία προέρχεται κατά μεγάλο βαθμό η Γλώσσα) δεν υπάρχει πρόβλημα με το αρνητικό βήμα γιατί εκεί υπάρχει το DOWNTO οπότε ξέρεις αν ανεβαίνεις ή κατεβαίνεις. Δεν θα ήταν πιο απλό και λογικό αν υπήρχε ένα αντίστοιχο DOWNTO και στη Γλώσσα;
Στην Pascal δεν υπάρχει ΜΕ_ΒΗΜΑ. Το downto ισοδυναμεί με "ΜΕ_ΒΗΜΑ -1". Αφού όμως η ΓΛΩΣΣΑ υποστηρίζει ΜΕ_ΒΗΜΑ, το downto θα ήταν πλεονασμός.
Η Basic και αν θυμάμαι καλά και η Fortran μοιάζουν πολύ με τη ΓΛΩΣΣΑ στη λειτουργία της ΓΙΑ.