Αποστολέας Θέμα: Αλλαγή αρχικής ή τελικής τιμής ή βήματος εντός της Για  (Αναγνώστηκε 843 φορές)

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 480
  • There can be only one...may it be AEPP.
Τι είδους λάθος είναι;
Δε θυμάμαι σε ποιό νήμα έχει απαντηθεί;
(Στο Διερμηνευτή είπαμε γιατί τρέχει και δεν βγάζει λάθος;)
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 4293
    • alkisg@im.sch.gr
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Είναι λάθος... τακτικής. Σαν την goto, δεν προτείνεται λόγω του ότι κάνει το πρόγραμμα πιο δυσνόητο (αν θυμάμαι καλά κάπου στο βιβλίο καθηγητή το αναφέρει πιο αναλυτικά). Έτσι δεν έχει νόημα να απαγορευτεί από το περιβάλλον του Διερμηνευτή.
Το να αλλάξει η αρχική τιμή βέβαια δεν είναι και ιδιαίτερο πρόβλημα, γιατί η αρχική τιμή έτσι κι αλλιώς δεν ξαναχρησιμοποιείται μέσα στο βρόχο.
Το να αλλάξει η τελική τιμή ή το βήμα προκαλεί και ένα ζήτημα καθοριστικότητας, το αν θα χρησιμοποιείται η νέα τελική τιμή (όπως θα γινόταν στην όσο) ή η παλιά τελική τιμή, όπως κάνει ο Διερμηνευτής: http://alkisg.mysch.gr/ΓΛΩΣΣΑ/ΓΙΑ/ - η οποία συμπίπτει με την υλοποίηση κάποιας Pascal που είχα ελέγξει.

Δες και αυτό: http://alkisg.mysch.gr/steki/index.php?topic=1797.0;all

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2917
  • to Iterate is human to Recurse divine
Το έχουμε ξαναθίξει το θέμα. Στο τετράδιο μαθητή το παρουσιάζει ως κακή πρακτική
Ποτέ μη χρησιμοποιείς εντολές που αλλάζουν την αρχική τιμή, την τελική τιμή, το βήμα ή τη μεταβλητή που ελέγχει την επανάληψη μέσα σε ένα βρόχο ΓΙΑ. Αν και μερικές γλώσσες προγραμματισμού επιτρέπουν αυτές τις αλλαγές, να τις αποφεύγεις, γιατί οδηγούν σε προγράμματα δυσνόητα και συνήθως λανθασμένα.
έχει σταλεί από το ΠΙ και σχετική οδηγία.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 480
  • There can be only one...may it be AEPP.
Άρα επειδή είναι κακή προγραμματιστική τεχνική δεν είναι συντακτικό η λογικό λάθος.
Και επειδή τρέχει στον Διερμηνευτή δε σημαίνει πως είναι και αποδεκτό. Σωστά;

Ανακεφαλαίωση γιατί παίζονται καναδυο καφέδες στοίχημα στους μαθητές μου. Απλά αυτό...

Evry στην Python δουλεύει;;;
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2917
  • to Iterate is human to Recurse divine
Σε όλες τις σύγχρονες γλώσσες υπάρχει η break για τη βίαιη διακοπή του βρόχου η οποία χρησιμοποιείται ευρέως.
Η αλλαγή του μετρητή γενικά δεν είναι καλή ιδέα.
Αυτό που μπορείς να πεις στους μαθητές σου είναι ότι αν στις εξετάσεις κάνουν κάτι τέτοιο θα χάσουν μονάδες και ότι δεν επιτρέπεται στο μάθημα.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 480
  • There can be only one...may it be AEPP.
Σε όλες τις σύγχρονες γλώσσες υπάρχει η break για τη βίαιη διακοπή του βρόχου η οποία χρησιμοποιείται ευρέως.
Η αλλαγή του μετρητή γενικά δεν είναι καλή ιδέα.

Ναι σωστά .
Επίσης χωρίς να θέλω να ξεφύγω από τον τίτλο του νήματος , αυτή η Continue πέρα από το να μας τερματίζει την συγκεκριμένη επανάληψη , ποια είναι η χρησιμότητα της; ( εννοώ , σε ένα πιο ευρύ πλαίσιο)
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

itt

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 412
  • Real stupidity beats ΑΙ any time
Ναι σωστά .
Επίσης χωρίς να θέλω να ξεφύγω από τον τίτλο του νήματος , αυτή η Continue πέρα από το να μας τερματίζει την συγκεκριμένη επανάληψη , ποια είναι η χρησιμότητα της; ( εννοώ , σε ένα πιο ευρύ πλαίσιο)

Τι εννοείς ποια είναι η χρησιμότητά της σε πιο ευρύ πλαίσιο;  Εννοείς από high-level σκοπιά, γιατί να κάνεις skip ένα iteration του βρόγχου;

Συνήθως η λογική για την continue (και συμμετρικά για την break) είναι κάτι τέτοιο:

Κώδικας: [Επιλογή]
for(..) {
  if(!condition) continue | break;
  // do cool things here
}

Δηλαδή ελέγχεις κάποιο precondition για το στοιχείο που είσαι (ή για κάποιο άλλο state τελοσπάντων) στην αρχή του iteration και άμα δεν σε ικανοποιήσει  ή σκιπάρεις το στοιχείο ή σταματάς εντελώς.

Το να βάζεις continue βαθιά μέσα στον βρόγχο γενικά _πρέπει_ να αποφεύγεται γιατί μπορεί να σου δημιουργήσει τεράστιο πρόβλημα στο reasoning του τι κάνει ο κώδικας.

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2917
  • to Iterate is human to Recurse divine
Δεν έχω χρησιμοποιήσει ποτέ continue ενώ break χρησιμοποιώ συνεχώς. Πάντα μου φαινόταν πολύ περίεργη εντολή και εγώ είχα την απορία για την χρησιμότητά της.
Η μόνη εξήγηση που μπορώ να δώσω είναι ότι αυτός που την σκέφτηκε βαριόταν να χρησιμοποιεί την if και να βάζει τα σύμβολα { } για την οριοθέτηση ενός μπλοκ.
Η continue σε αντίθεση με την break είναι μια εντολή που νομίζω ότι θα μπορούσε να δημιουργήσει πολλά προβλήματα σε μεγάλα τμήματα κώδικα.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

itt

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 412
  • Real stupidity beats ΑΙ any time
Γενικά υπάρχει χρήση για το continue, μπορείς να βελτιώσεις το readability του κώδικα εαν σου γλυτώσει deep nesting.

Πχ. κάτι τέτοιο:

Κώδικας: [Επιλογή]
for(...) {
    foo();
    bar();
   
    if(condition) {
       DoCoolThings1();
       DoCoolThings2();
       if(anotherCondition) {
          DoCoolThings3();
       }
    }

}

μπορείς να το κάνεις rewrite σε κάτι τέτοιο:

Κώδικας: [Επιλογή]
for(...) {
    foo();
    bar();
   
    if(!condition) continue;

    DoCoolThings1();
    DoCoolThings2();

    if(anotherCondition) continue;

    DoCoolThings3();
       
}

akalest0s

  • Οπαδός
  • **
  • Μηνύματα: 19
Απ: Αλλαγή αρχικής ή τελικής τιμής ή βήματος εντός της Για
« Απάντηση #9 στις: 05 Ιούλ 2017, 10:21:40 μμ »
Σε όλες τις σύγχρονες γλώσσες υπάρχει η break για τη βίαιη διακοπή του βρόχου η οποία χρησιμοποιείται ευρέως.
Η αλλαγή του μετρητή γενικά δεν είναι καλή ιδέα.
Αυτό που μπορείς να πεις στους μαθητές σου είναι ότι αν στις εξετάσεις κάνουν κάτι τέτοιο θα χάσουν μονάδες και ότι δεν επιτρέπεται στο μάθημα.
Εννοείται ότι αποτρέπω τους μαθητές μου από τέτοια χρήση. Αλλά βρίσκω ευκαιρία να ρωτήσω μια απορία μου. Από το "δεν είναι καλή ιδέα", μέχρι το "θα χάσουν μονάδες, δεν επιτρέπεται στο μάθημα", δεν είναι μεγάλη η απόσταση; Ειδικά με δεδομένο ότι (δυστυχώς) ακόμη και τα κριτήρια αλγορίθμων (καθοριστικότητα) δεν εξετάζονται ουσιαστικά πάνω στις ασκήσεις...
 ::)

ilias_s

  • Βετεράνος
  • ****
  • Μηνύματα: 51
Εννοείται ότι αποτρέπω τους μαθητές μου από τέτοια χρήση. Αλλά βρίσκω ευκαιρία να ρωτήσω μια απορία μου. Από το "δεν είναι καλή ιδέα", μέχρι το "θα χάσουν μονάδες, δεν επιτρέπεται στο μάθημα", δεν είναι μεγάλη η απόσταση; Ειδικά με δεδομένο ότι (δυστυχώς) ακόμη και τα κριτήρια αλγορίθμων (καθοριστικότητα) δεν εξετάζονται ουσιαστικά πάνω στις ασκήσεις...
 ::)

Εδώ υπάρχει ένα "αλλά".

Μέχρι σήμερα και εγώ θα έλεγα πως κάτι τέτοιο δεν είναι "καλή πρακτική" και θα πρέπει να αποφεύγεται γενικά και ΕΚΕΙ θα τελείωνε η κουβέντα ΑΛΛΑ...

... επειδή μπορεί κάλλιστα να μπει ως ερώτηση θεωρίας πλέον θα τους λέω πως μπορεί να γίνει (έστω και αν δεν είναι καλή πρακτική και αν στην πράξη δεν το κάνουμε ποτέ κτλ κτλ).

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

Υ.Γ : Φέτος, για παράδειγμα, ένα ερώτημα του Α1 βασίζονταν στο ότι μπορούμε να κάνουμε μία ΓΙΑ να μην επαναλαμβάνεται καμία φορά (πράγμα που στην πράξη αποφεύγουμε γενικά). Αφού όμως ρώτησαν κάτι τέτοιο (που δεν το λες και καλή πρακτική) γιατί να μη ρωτήσουν και αυτό?