1ο θέμα Όσο<-->Για

Ξεκίνησε από evry, 06 Ιουν 2007, 12:38:55 ΠΜ

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

evry


   Παιδιά μετά από διόρθωση αρκετών γραπτών έχω κατάληξει στο συμπέρασμα. Στο ερώτημα που λέει αν μπορεί να υλοποιηθεί μια δομή επανάληψης Όσο από Για, υπάρχει καταφατική απάντηση σε πολλά γραπτά. Για να είμαι πιο συγκεκριμένος το 70% των ΝΑΙ είναι από γραπτά του 18 και πάνω. Μήπως αυτό σημαίνει κάτι??
   Επίσης μυστηριωδώς μαθητές που έχουν λάθος τα θέματα 2,3,4 έχουν σωστά όλα τα πολλαπλών επιλογών του 1.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Muldy

για το τελευταίο που είπες:τα πολλαπλης επιλογής "φωναζονται" στην αίθουσα, στην δική μου τάξη τουλάχιστον το θεμα πρώτο με τον αλγόριθμο, τα σ,λ, τα αβγ και π1π2π3 ήταν προιόν διακινησης. Βέβαια αυτό δεν ήταν τίποτα μπροστά σε άλλα που γίνονται με τα περι τουλέτας αλλά αυτά είναι άλλου παππά ευαγγέλιο..

pgrontas

Εγώ έχω εκφράσει την άποψη μου, ότι πρέπει να διδάσκουμε ότι όλες οι δομές επανάληψης είναι ισοδύναμες (ΜΠΟΡΕΙ=Σωστό) και να επισημαίνουμε ποια είναι η σωστή χρήση της κάθε μιας (ΠΡΕΠΕΙ = λάθος).

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

Τώρα για τις απαντήσεις των μαθητών, σίγουρα κάποιοι απάντησαν ΣΩΣΤΟ στην τύχη, αλλά είμαι σίγουρος ότι υπήρξαν και κάποιοι αποστασιοποιημένοι από σχολεία και φροντιστήρια που σκέφτηκαν μία είναι η έννοια  της επανάληψης γιατί να υπάρχει διαφορά με ποια εντολή θα την εκφράσεις - υπενθυμίζω ότι ρώταγε αν ΜΠΟΡΕΙ να γίνει μετατροπή

Ίσως όσοι συνάδελφοι είναι σε ΒΚ και είναι πεπεισμένοι για το παραπάνω να έπρεπε να ζητήσουν διευκρίνηση.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

andreas_p

Είναι ξεκάθαρο ΔΕ θέλει διευκρίνιση.

Κάθε  ΓΙΑ  μετατρέπεται  σε ΟΣΟ  ή  ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ. 

Το αντίστροφο ΔΕΝ ισχύει πάντα.

Συνεπώς  :    Θ1. Α5  η ορθή απάντηση  είναι   Λάθος.

Τώρα    οι  προτάσεις :

            1)  Κάθε ΟΣΟ  μπορεί να μετατραπεί  σε  ΜΕΧΡΙΣ_ΟΤΟΥ

            2)  Κάθε  ΜΕΧΡΙΣ_ΟΤΟΥ  μπορεί να μετατραπεί  σε  ΟΣΟ

είναι    ΣΩΣΤΕΣ,

αρκεί  βέβαια 

για την  Πρ.   1)   να προβλέψεις να εισάγεις τη σχετική  ΑΝ  μέσα στο βρόχο της  ΜΕΧΡΙΣ_ΟΤΟΥ

και

για τη  Πρ.  2)  να εξασφαλίσεις την ισοδυναμία.  Πώς  ;    Ανάλογα ...


Ανδρέας



gpapargi

Ευριπίδη το συγκεκριμένο θέμα δε μου φαίνεται και τόσο περίεργο. Πριν από λίγες μέρες είχα κάνει κάποιες τοποθετήσεις που για μένα είναι η εξήγηση του φαινομένου. Κάνω copy paste 2 αποσπάσματα:

Απόσπασμα 1:

"Να προσθέσω κάτι ακόμα.
Οι ασκήσεις που ρωτάνε αν γίνεται ή όχι κάτι και περιμένουν σαν απάντηση το «Όχι, δεν γίνεται με τίποτα» είναι πολύ επικίνδυνες. Μπορεί να νομίζουμε ότι δεν γίνεται κάτι και να βρεθεί κάποιος που να το κάνει και μετά να μας το τρίψει στη μούρη και να μην ξέρουμε τι να κάνουμε. Ολόκληρος ο κλάδος των ψυχαγωγικών μαθηματικών στηρίζεται ακριβώς πάνω σε αυτό. Επειδή εμένα είναι το χόμπυ μου κάθε φορά που ακούω ότι δεν γίνεται κάτι προσπαθώ να το κάνω. Impossible is nothing. Θέλεις απόδειξη για να είσαι πραγματικά σίγουρος ότι δε γίνεται κάτι.

Πχ λέμε εύκολα ότι η «Όσο» δεν μετατρέπεται σε «Για» σε κάθε περίπτωση. Λέμε επίσης ότι δε μετράει το να τερματίσουμε το βρόχο πρόωρα με αλλαγή του μετρητή γιατί αυτό απαγορεύεται. Με χρήση της goto όμως;"

Εδώ ουσιαστικά λέω ότι η "Για" αν περιέχει goto τερματίζει όποτε θέλουμε νόμιμα.

Απόσπασμα 2:

«Κανόνας 2
Αυτός που βάζει το θέμα θα πρέπει να ξέρει ότι άλλο πράγμα είναι αυτό που θέλει να ρωτήσει και άλλο πράγμα αυτό που τελικά ρώτησε. Ο εξεταζόμενος δεν είναι υποχρεωμένος να καταλάβει τι εννοεί ο εξεταστής. Είναι υποχρεωμένος να καταλάβει τι ρώτησε τελικά.»

alkisg

Να προσθέσω κάτι σ' αυτά που πολύ σωστά λέει ο Γιώργος:

Στην εκφώνηση «είναι η ΟΣΟ και η ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ ισοδύναμες»;
απαντάμε ναι.
Επιπρόσθετα, λέμε ότι για να εξασφαλίσουμε την ισοδυναμία προσθέτουμε μια εντολή ΑΝ.

Προσπαθώντας να το πω με τα ίδια λόγια:
Στην εκφώνηση «είναι η ΟΣΟ ισοδύναμη με την ΑΝ»;
απαντάμε ναι.
Επιπρόσθετα, λέμε ότι για να εξασφαλίσουμε την ισοδυναμία προσθέτουμε μια εντολή ΠΗΓΑΙΝΕ (goto).

Γιατί δηλαδή μας επιτρέπεται να προσθέτουμε ΑΝ και όχι ΠΗΓΑΙΝΕ;

Η εκφώνηση δεν το απαγορεύει. Το βιβλίο δεν το απαγορεύει.
Απαγορεύεται όμως έμμεσα επειδή η χρήση της ΠΗΓΑΙΝΕ δεν είναι καλή προγραμματιστική τεχνική, όπως και η αλλαγή του μετρητή στο βρόχο.

Συμπέρασμα; συμφωνώ απόλυτα με τον gpapargi.
> Οι ασκήσεις που ρωτάνε αν γίνεται ή όχι κάτι και περιμένουν σαν απάντηση το «Όχι, δεν γίνεται με τίποτα» είναι πολύ επικίνδυνες.

Θα έπρεπε οι εκφωνήσεις να δίνονται υπό το πρίσμα του τι είναι καταλληλότερο, όχι αν ΓΙΝΕΤΑΙ (ή ισοδυναμία κτλ).

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

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

pgrontas

#6
>> Κάθε  ΓΙΑ  μετατρέπεται  σε ΟΣΟ  ή  ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ. 
>> Το αντίστροφο ΔΕΝ ισχύει πάντα.

Σε αυτό έχεις λάθος. Ένας τρόπος (μη ενδεδειγμένος) είναι με αλλαγή μετρητή, ένα δεύτερος (μη ενδεδειγμένος) είναι με πήγαινε, αλλά γίνεται. Ξαναγράφω το πώς και παρακαλώ να μην ξαναρχίσουν τα σχόλια για το αν το προτείνω ή όχι - δεν το προτείνω.
ΟΣΟ ΣΥΝΘΗΚΗ ΕΠΑΝΑΛΑΒΕ
   ΕΝΤΟΛΕΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
γίνεται
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 1
ΑΝ ΣΥΝΘΗΚΗ ΤΟΤΕ
    ΕΝΤΟΛΕΣ
    I<-1
ΑΛΛΙΩΣ
    Ι<-2
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

Αλλά για να μην μακρυγορούμε θα ήθελα αν έχεις υπόψιν σου κάποιο παράδειγμα στο οποίο δεν ΜΠΟΡΟΥΜΕ να μετατρέψουμε την ΟΣΟ σε ΓΙΑ.

Στο συγκεκριμένο θέμα δεν είναι σωστά διατυπωμένη η ερώτηση, όπως σωστά προαναφέρθηκε.

Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

petrosp13

Σχολικό βιβλίο, σελίδα 178:
"Η εντολή ΓΙΑ...ΑΠΟ...ΜΕΧΡΙ χρησιμοποιείται στην περίπτωση που πρέπει να επαναληφθεί η εκτέλεση κάποιων εντολών για προκαθορισμένο αριθμό επαναλήψεων"

Γι'αυτό τον λόγο το έβαλε η επιτροπή των εξετάσεων

Γιατί το συζητάμε ακόμα; Έχουμε αρχίσει να αμφιβάλλουμε και για τα αυτονόητα και σίγουρα
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

pgrontas

Το συζητάμε ακριβώς επειδή δεν χρησιμοποιήσαν την διατύπωση του βιβλίου.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

P.Tsiotakis

@pgontas το παράδειγμα που γράφεις είναι λάθος

Στο τετράδιο μαθητή, στη σελίδα 78 αναφέρει: "Ποτέ μη χρησιμοποιείς εντολές που αλλάζουν ...τη μεταβλητή που ελέγχει την επανάληψη...γιατί οδηγούν σε προγράμματα δυσνότητα...".

Το ποτέ που βάζει δεν είναι σαφές; Γιατί επιμένεις σε μια άποψη που είναι λανθασμένη;

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

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

Οι 3 δομές ΔΕΝ είναι ισοδύναμες μεταξύ τους.....

petrosp13

Ακριβώς
Γι'αυτόν τον λόγο, άλλωστε, υπάρχουν και 3 δομές επανάληψης
Η κάθε μια με τα χαρακτηριστικά της διευκολύνει κάποιες περιπτώσεις

Φυσικά, μπορούμε να χρησιμοποιούμε την "Όσο" σε κάθε περίπτωση
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

pgrontas

@ptsiotakis,
το συζητάμε πρώτα από όλα γιατί είναι ενδιαφέρον (για μένα τουλάχιστον που σχετικά πρόσφατα άρχισα να συμμετέχω στο site).
Κυρίως όμως γιατί ενώ στην σελίδα που ανέφερες το βιβλίο διατυπώνει μια ισχυρή ΠΡΟΤΡΟΠΗ, η ερώτηση που έπεσε ελέγχει ΔΥΝΑΤΟΤΗΤΑ, τα οποία είναι δύο διαφορετικά πράγματα.
Κατά συνέπεια το συζητάμε επειδή άλλα λέει το βιβλίο και άλλα ζήτησαν στις πανελλήνιες (κατά τη γνώμη μου πάντα).
Δεν καταλαβαίνω γιατί πρέπει να υπάρχει ενόχληση;

ΥΓ: Σου ανταποδίδω τα σέβη και θέλω να σε ευχαριστήσω για την βοήθεια που μου προσέφερες μέσω του site σου αυτή την χρονιά.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

johnny_xp

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

Το συγκεκριμένο θέμα, έχει εξαντληθεί. Δεν είναι δυνατόν μετά από 7 χρόνια πορείας του μαθήματος να αναλύουμε τέτοια ζητήματα, τα οποία εν τέλη είναι καθαρά τεχνικά και έχουν να κάνουν καθαρά και μόνο με την υλοποίηση μιας γλώσσας προγραμματισμού. Σε τελική ανάλυση σε όσες γλώσσες επιτέπεται αλλαγή μετρητή εντός του βρόχου, επουδενί δε συστήνεται. Αυτή είναι η ουσία! Από όσο εγώ τουλάχιστον γνωρίζω η C και η C++ έγουν το γενικότερο βρόχο for, όπου επιτρέπεται να αλλάξεις τα πάντα εντός του βρόχου. Ωστόσο δεν έχου δει σε κάποι βιβλίο να λέει: "είναι καλή τακτική να αλλάζεται το βήμα εντός του βρόχου ώστε να μην ξέρετε ακριβώς πότε θα ολοκληρωθεί". Τουναντίον όσα βιβλία εγώ έχω συναναστραφεί κατά περιόδους το αντίθετο προτρέπουν. Και παραθέτω από το documentation της Visual C++:

Use the for statement to construct loops that must execute a specified number of times.

Αυτό είναι το ουσιώδες και αυτό πρέπει να καταλάβει ο μαθητής.

gpapargi

Καλά… το θέμα των μετατροπών από τη μια εντολή στην άλλη είναι μεγαλύτερο από όσο δείχνει. Το είχα ψάξει μέσα μου αρκετά με αφορμή κάποιο θέμα σε κάποιο διαγώνισμα που έφτιαξε το στέκι. Το χειμώνα θα τα πούμε πιο αναλυτικά αυτά. Για την ώρα θέλω να πω πως για να μετατρέψεις την Όσο σε Μέχρις_ότου το σωστό είναι να βάλεις το Αν έξω από το βρόχο. Για να μετατρέψεις το μέχρις_ότου σε Όσο θα πρέπει να επαναλάβεις όλες τις εντολές του βρόχου πριν το βρόχο.

Όλα εξαρτώνται από το τι ακριβώς ζητάμε όταν θέλουμε μετατροπή από τη μια εντολή στην άλλη. Συνήθως λέμε ότι θέλουμε για κάθε είσοδο την ίδια έξοδο. Είναι όμως έτσι; Πχ αν κάποιος ζητήσει μετατροπή της σειριακής αναζήτησης από «όσο» σε «Μέχρις_ότου» και ο μαθητής γράψει τη δυαδική αναζήτηση με «μέχρις_ότου» είναι αυτό που ζητάμε; (αφού έχουν ίδια είσοδο και ίδια έξοδο) Μήπως κάτι άλλο είναι αυτό που θέλουμε να δούμε από αυτές τις ασκήσεις τελικά;

Είναι μεγάλο θέμα. Άλκη ετοιμάσου για θεωρητική κουβέντα τον Οκτώβριο  ;)

ΥΓ

Η αντικατάσταση της Όσο από τη Για που είχα στο νου μου είναι η εξής:

Για ι από 1 μέχρι 2 με_βήμα 0 ! ατέρμνων βρόχος
  Αν συνθήκη τότε
    πήγαινε έξω από το βρόχο
  Τέλος_αν
Τέλος_επανάληψης

johnny_xp

@gpapargi
Σχετικά με τη βίαιη διακοπή του βρόχου: Δοθέντος ότι το βιβλίο εξυμνεί τον δομημένο προγραμματισμό (και πολύ καλά κάνει, κατά τη γνώμη μου) δε θεωρώ πως είναι ορθή προσέγγιση να διδάσκουμε στους μαθητές τέτοιες τεχνικές.

Φυσικά και ο κώδικας ο οποίο δίνεται είναι, στη γενική περίπτωση, έγκυρος και νόμιμος, δοθέντος ότι όλες οι πολύ γνωστές γλώσσες προγραμματισμού υποστηρίζουν κάποια εντολή μορφής goto ή break (ή exit για την Basic). Ωστόσο, είναι κοινή άποψη πλέον ότι οι εντολές αυτές πρέπει να εξαλειφθούν. Για παράδειγμα η Java έχει δεχθεί μεγάλη κριτική γιατί υποστηρίζει τη χρήση της goto. Επίσης ας αναφέρω ότι η γλώσσα προγραμματισμού Eiffel, η οποία είναι πολύ σύγχρονη και έχει ως σκοπό να εξαλείψει πολλές “ασθένειες” τέτοιας μορφής δεν υποστηρίζει καν αδόμητες διακλαδώσεις κώδικα. Αξίζει δε να σημειωθεί ότι η συγκεκριμένη γλώσσα υποστηρίζει μια και μόνο δομή επανάληψης της μορφής while, εφαρμόζοντας (ορθά, κατά τη γνώμη μου) τη φιλοσοφική προσέγγιση του ξυραφιού του Occam.