Η δομή επανάληψης Για

Ξεκίνησε από ptsiotakis, 13 Οκτ 2004, 11:18:53 ΠΜ

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

P.Tsiotakis

Διάγραμμα ροής και συζήτηση για τη δομή επανάληψης Για

P.Tsiotakis

Παράδειγμα 8: Να διαβαστούν 20 αριθμοί και να εκτυπωθεί ο μέσος όρος τους

Αλγόριθμος Παράδειγμα_8
   άθροισμα <-  0
   Για i από 1 μέχρι 20
       Διάβασε αριθμός
       άθροισμα <-  άθροισμα + αριθμός          
   Τέλος_Επανάληψης
   μέσος_όρος <- άθροισμα / 20
   Εκτύπωσε μέσος_όρος
Τέλος Παράδειγμα_8

1. Οι εντολές που περιέχονται στην επαναληπτική δομή θα εκτελεστούν 20 φορές
2. Μετά τον υπολογισμό του αθροίσματος η ροή του αλγορίθμου επανέρχεται στην εντολή Για
3. Η μεταβλητή i θα αυξηθεί από την τιμή 1 μέχρι την τιμή 20 (την ονομάζουμε μετρητή) κατά μία μονάδα κάθε φορά
4. Σύμφωνα με την παράγραφο 5.1.3 του σχολικού βιβλίου η μεταβλητή i θα αυξηθεί 20 φορές, άρα η τελική τιμή που θα λάβει είναι 21 (το θέμα αυτό έχει εξαντληθεί σε πολλές συζητήσεις)
5. Αφού διαβαστεί κάθε ένας αριθμός από τους 20 και εισχωρηθεί στην ομώνυμη μεταβλητή, προστίθεται στη μεταβλητή άθροισμα
6. Το τμήμα εντολών που βρίσκεται εντός του Για ονομάζεται βρόχος
7. Επιπρόσθετα, πρέπει έξω από την επαναληπτική δομή να μηδενίσουμε την μεταβλητή άθροισμα, διαφορετικά δεν μπορούμε να γνωρίζουμε την τιμή της κατά την πρώτη επανάληψη - αρχικοποίηση

(πηγή http://users.kor.sch.gr/ptsiotakis/aepp/aepp_theory2c.htm)

P.Tsiotakis

Η μετατροπή του αλγορίθμου που παρουσιάστηκε στην προηγούμενη ενότητα με την δομή Όσο θα είναι ο εξής:

Αλγόριθμος Παράδειγμα_8_εναλ
   άθροισμα <-  0
   i <-  1
   Όσο i <= 100 επανάλαβε
           Διάβασε αριθμός
           άθροισμα <-  άθροισμα + αριθμός
            i <-  i + 1
   Τέλος_Επανάληψης
   μέσος_όρος <- άθροισμα / 100
   Εκτύπωσε μέσος_όρος
Τέλος Παράδειγμα_8_εναλ


Παρατηρούμε οτι η υλοποίησή της Για απαιτεί τη χρήση μιας σειράς εντολών. Αυτές είναι:

a. Η εντολή εκχώρησης i <- 1, για αρχικοποίηση της μεταβλητής
b. Η συνθήκη τερματισμού i <= 100
c. Η εντολή εκχώρησης i <- i + 1
Και οι τρεις παραπάνω εντολές περιέχονται στην δομή Για


Ο έλεγχος της συνθήκης στην Για γίνεται στην αρχή του βρόχου όπως στην Όσο και όχι όπως στην Μέχρις_Ότου.

Άρα, το διάγραμμα ροής της Για είναι όπως της Όσο θα είναι:




(πηγή: http://users.kor.sch.gr/ptsiotakis/aepp/aepp_theory2c.htm)

Με χαρά αναμένω σχόλια και απαντήσεις...


Με εκτίμηση,

xaidi

εγώ συμφωνώ με τα παραπάνω και ότι το διάγραμμα ροής για αυτές τις 2 δομές είναι κοινό. διαφορετικό είναι για την ...μέχρις_ότου.


Ευχαριστώ,

redhata

το μόνο που με προβληματίζει είναι η τιμή που θα έχει ο μετρητής, μετά το τέλος των δύο loops...
π.χ.
---------------------------
για i από 1 μέχρι 100
στο τέλος i=100
----------------------------
i<-1
όσο i<=100 επανέλαβε
....
i<-i+1
τέλος_όσο
στο τέλος i=101
rEdHaTa

P.Tsiotakis

Στο παλιό δοξασμένο forum του σχολικού δικτύου (http://www-old.sch.gr:6080/forums) αλλά και σε πολλές συζητήσεις και στο στέκι έχουμε καταλήξει (ή έτσι πιστεύω εγώ) οτι η τελική τιμή του μετρητή στο Για είναι η επόμενη τιμή (το 101) στο συγκεκριμένο παράδειγμα (δες π.χ. την παράγραφο 5.1.3 που περιγράφει την Για)
Ακόμη, είχαμε καταλήξει στο συμπέρασμα οτι δεν υπάρχει νόημα στο να ζητηθεί η εκτύπωση της τιμής του μετρητή μετά την δομή επανάληψης

Πάντως αν και δεν απαγορεύεται ΔΕΝ ΠΡΕΠΕΙ ΝΑ ΤΡΟΠΟΠΟΙΕΊΤΑΙ Η ΤΙΜΗ ΤΟΥ ΜΕΤΡΗΤΗ ΕΝΤΟΣ ΤΟΥ ΒΡΟΧΟΥ ΣΤΗ ΔΟΜΗ ΓΙΑ (θα έχουμε απρόβλεπτα αποτελέσματα)

Το οτι η Για δουλεύει ακριβώς όπως η Όσο το δείχνει και το επόμενο παράδειγμα


Για i από 13 μέχρι 3 με_βήμα 2
...
Τέλος_επανάληψης

Δεν θα εκτελεστεί καμμία επανάληψη. Γιατί;;;; Γιατί ελέγχει την τιμή 13 με την τιμή 3 πριν μπει στον βρόχο...

Με χαρά βλέπω οτι όλοι οι καθηγητές πληροφορικής έχουν πέσει με τα μούτρα στα ιδιαίτερα και δεν προλαβαίνουν να τοποθετηθούν σε χαζά ζητήματα όπως το διάγραμμα ροής της δομής επίλεξε ή της δομής Για, μόνο 5 άτομα έχουν αμφιβολίες

Να αλλάξουμε τον τίτλο, εδώ δεν είναι το στέκι των πληροφορικών, αλλά το στέκι των παρατηρητών   8)

redhata

Στη σελίδα 43, που είναι εντός ύλης λέει:
"...δηλαδή αρχική τιμή της μεταβλητής i(=1) και τελική τιμή (=100).
αναφέρεται σε loop: για i από 1 μέχρι 100.
Στην 5.13 όντως ισχύει αυτό που λες...
αφού μιλάει για πέντε αυξήσεις σε loop: για i από 0 μέχρι 4, κάνοντας μια "ανάλυση" της υλοποίησης της για, χωρίς όμως να δίνει τον αντίστοιχο κώδικα assembly παρόλο που πάει να μετρήσει εκτελέσιμες εντολές.
Κώδικας assembly για basic-like for δίνεται στη σελ. 119, δε νομίζω όμως πως είναι ολοκληρωμένος, παρόλα αυτά εκεί φαίνεται πως το i τελικά μειώνεται από 10 σε 1, αντί να αυξάνεται όπως το γράφει ο basic-like programmer.
Εγώ πάντως εξακολουθώ να θεωρώ ότι μετά από ένα "για" το i έχει την τελική τιμή μετά το "μέχρι", επηρεασμένος από την pascal κυρίως και από αυτό που αναφέρεται στη σελίδα 43.  
rEdHaTa

redhata

#7
--------------ΤΡΟΠΟΠΟΙΗΣΗ ΓΙΑ ΤΗΝ ΠΑΡΑΠΑΝΩ ΑΠΑΝΤΗΣΗ--------------------
Σε basic όμως(που είναι και ποιο κοντά στο "για" του βιβλίου), ο μετρητής στο τέλος έχει τιμή μεγαλύτερη ή μικρότερη  της τελικής... ανάλογα με την αρχική τιμή και το βήμα.
και τελικά αυτό βολεύει περισσότερο, αν εξαιρέσεις τη σελίδα 43.
εκτός από αυτό δεν έχω άλλον προβληματισμό σχετικά με τις ομοιότητες της "όσο" και της "για".
rEdHaTa

gpapargi

Άντε να πω και εγώ τη γνώμη μου για να μη φωνάζει ο φίλος μου ο Παναγιώτης :-)
Η θεωρία λέει ότι χρησιμοποιούμε την «Για» όταν ξέρουμε το πλήθος των επαναλήψεων. Όταν δεν το ξέρουμε χρησιμοποιούμε την «Όσο». Αυτό είναι αρκετό για τους μαθητές.
Τώρα για μας. Νομίζω ότι δεν έχει σημασία η τιμή του μετρητή μετά την εντολή για 2 λόγους:

Ο πρώτος είναι ότι μετά από την εντολή «Για» δεν υπάρχει περίπτωση να χρησιμοποιήσουμε το μετρητή γιατί απλούστατα το πλήθος των επαναλήψεων είναι δεδομένο. Ο μετρητής αν και λέγεται μετρητής δε μετράει κάτι ή μάλλον δε μετράει κάτι που δεν ξέρουμε πόσο είναι. Με το τέλος της εντολής ο «μετρητής» έχει επιτελέσει το ρόλο του (που είναι να εγγυηθεί σταθερό πλήθος επαναλήψεων) και δεν τον χρειαζόμαστε πια. Αντίθετα στην «Όσο» ο μετρητής μπορεί να χρησιμοποιηθεί στην περίπτωση σύνθετης συνθήκης πχ (ι<10 ή βρέθηκε=ΑΛΗΘΗΣ). Αν η λογική μεταβλητή «βρέθηκε» πάρει την τιμή ΑΛΗΘΗΣ και τερματίσει το βρόχο, τότε έχει νόημα να ξέρουμε την τιμή του μετρητή για να ξέρουμε πόσες φορές εκτελέστηκε ο βρόχος.

Ο δεύτερος (και σπουδαιότερος) λόγος για τον οποίο νομίζω ότι δεν έχει σημασία να ψάχνουμε την τιμή είναι το ότι η ΓΛΩΣΣΑ δεν είναι κάτι το υπαρκτό. Δεν πρόκειται για μια πραγματική γλώσσα προγραματισμού που χρησιμοποιήται παγκοσμίως και αποτελεί κάποιο standard. Αν μιλάγαμε πχ για τη C θα φτιάχναμε ένα προγραμματάκι και θα το δοκιμάζαμε. Τώρα δεν μπορούμε να κάνουμε κάτι τέτοιο. Αυτό που ουσιαστικά ρωτάμε είναι τι έχει στο μυαλό του ο συγγραφέας του βιβλίου. Δηλαδή πως θα ήθελε να συμπεριφέρεται η ΓΛΩΣΣΑ που δημιούργησε. Νομίζω πως θα απαντούσε ότι θα ήθελε να έχει τιμή 100 και όχι 101 στην εντολή Για ι από 1 μέχρι 100.
Αλλά είναι προφανές ότι μιλάμε για κάτι τελείως υποθετικό. Το μόνο υπαρκτό της γλώσσας είναι ο μεταφραστής του Άλκη. Αλλά και αυτό δεν είναι κάποιο παγκόσμιο standard. Κάλλιστα θα μπορούσε κάποιος άλλος developer να το έχει υλοποιήσει διαφορετικά από τον Άλκη. Νομίζω ότι δεν έχουμε στοιχεία για να απαντήσουμε αυτό το ερώτημα.

Με βάση τους 2 παραπάνω λόγους αλλά και με δεδομένο ότι είναι γνωστό πότε πρέπει να χρησιμοποιούμε τη «Για» πιστεύω ότι δεν μπορούμε να πούμε κάτι περισσότερο για το θέμα.

Αυτά και από μένα

xaidi

χωρίς να μακρηγορώ γιατί οι αιτιολογήσεις αναφέρθηκαν πιο πάνω, πιστεύω πως στην "για" βοηθητική μεταβλητή i (δεν θα την ονόμαζα μετρητή με την έννοια που γνωρίζουμε) παίρνει ως τελική τιμή το όριο.
Στις άλλες δομές έχει συν ή πλην ανάλογα.
στο παράδειγμα που αναφέρεται επάνω και για τον υπολογισμό του ΜΟ αν χρησιμοποιούσα την όσο θα έγραφα ΜΟ = άθροισμα / (i-1) αν δεν χρησιμοποιούσα το 100.
Ευχαριστώ,

P.Tsiotakis

Αγαπητοί φίλοι,

1. Συμφωνώ οτι δεν πρέπει να χρησιμοποιούμε την μεταβλητή - μετρητή του Για για άλλο σκοπό πλην του να εξασφαλίσουμε την επανάληψη

2. Στη σελίδα 43 του σχολικού βιβλίου περιγράφει το διάγραμμα ροής του παραδείγματος 10 (δομή Για) - και είναι το ίδιο με το διάγραμμα που έχω παρουσιάσει σε αυτήν την ενότητα. Στο διάγραμμα ροής λοιπόν (που παρουσιάζει η συγγραφική ομάδα και είναι εντός ύλης) είναι ξεκάθαρο οτι η τελική τιμή του i στο συγκεκριμένο παράδειγμα είναι 101...

Πρώτα αυξάνει την τιμή του μετρητή και μετά ελέγχει με την τελική τιμή

Γιώργο, εκτός από το διερμηνευτή της Γλώσσας υπάρχει και η Γλωσσομάθεια (http://glossomatheia.studies.gr). Ωστόσο, κανένα εργαλείο δεν είναι πιστοποιημένο από το Παιδαγωγικό Ινστιτούτο ώστε να αποτελεί για μας τους υπόλοιπους σημείο αναφοράς

Με τη γνωστή εκτίμηση,