Αλλαγή αρχικής ή τελικής τιμής ή βήματος εντός της Για

Ξεκίνησε από nikolasmer, 08 Φεβ 2017, 04:58:30 ΜΜ

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

nikolasmer

Τι είδους λάθος είναι;
Δε θυμάμαι σε ποιό νήμα έχει απαντηθεί;
(Στο Διερμηνευτή είπαμε γιατί τρέχει και δεν βγάζει λάθος;)
Μερεντίτης Νικόλαος
Πληροφορικός

alkisg

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

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

evry

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

nikolasmer

Άρα επειδή είναι κακή προγραμματιστική τεχνική δεν είναι συντακτικό η λογικό λάθος.
Και επειδή τρέχει στον Διερμηνευτή δε σημαίνει πως είναι και αποδεκτό. Σωστά;

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

Evry στην Python δουλεύει;;;
Μερεντίτης Νικόλαος
Πληροφορικός

evry

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

nikolasmer

Παράθεση από: evry στις 08 Φεβ 2017, 10:57:29 ΜΜ
Σε όλες τις σύγχρονες γλώσσες υπάρχει η break για τη βίαιη διακοπή του βρόχου η οποία χρησιμοποιείται ευρέως.
Η αλλαγή του μετρητή γενικά δεν είναι καλή ιδέα.

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

itt

Παράθεση από: nikolasmer στις 08 Φεβ 2017, 11:47:00 ΜΜ
Ναι σωστά .
Επίσης χωρίς να θέλω να ξεφύγω από τον τίτλο του νήματος , αυτή η Continue πέρα από το να μας τερματίζει την συγκεκριμένη επανάληψη , ποια είναι η χρησιμότητα της; ( εννοώ , σε ένα πιο ευρύ πλαίσιο)

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

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

for(..) {
  if(!condition) continue | break;
  // do cool things here
}


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

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

evry

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

itt

Γενικά υπάρχει χρήση για το 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

Παράθεση από: evry στις 08 Φεβ 2017, 10:57:29 ΜΜ
Σε όλες τις σύγχρονες γλώσσες υπάρχει η break για τη βίαιη διακοπή του βρόχου η οποία χρησιμοποιείται ευρέως.
Η αλλαγή του μετρητή γενικά δεν είναι καλή ιδέα.
Αυτό που μπορείς να πεις στους μαθητές σου είναι ότι αν στις εξετάσεις κάνουν κάτι τέτοιο θα χάσουν μονάδες και ότι δεν επιτρέπεται στο μάθημα.
Εννοείται ότι αποτρέπω τους μαθητές μου από τέτοια χρήση. Αλλά βρίσκω ευκαιρία να ρωτήσω μια απορία μου. Από το "δεν είναι καλή ιδέα", μέχρι το "θα χάσουν μονάδες, δεν επιτρέπεται στο μάθημα", δεν είναι μεγάλη η απόσταση; Ειδικά με δεδομένο ότι (δυστυχώς) ακόμη και τα κριτήρια αλγορίθμων (καθοριστικότητα) δεν εξετάζονται ουσιαστικά πάνω στις ασκήσεις...
::)
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

ilias_s

Παράθεση από: akalest0s στις 05 Ιουλ 2017, 10:21:40 ΜΜ
Εννοείται ότι αποτρέπω τους μαθητές μου από τέτοια χρήση. Αλλά βρίσκω ευκαιρία να ρωτήσω μια απορία μου. Από το "δεν είναι καλή ιδέα", μέχρι το "θα χάσουν μονάδες, δεν επιτρέπεται στο μάθημα", δεν είναι μεγάλη η απόσταση; Ειδικά με δεδομένο ότι (δυστυχώς) ακόμη και τα κριτήρια αλγορίθμων (καθοριστικότητα) δεν εξετάζονται ουσιαστικά πάνω στις ασκήσεις...
::)

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

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

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

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

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