Διάγραμμα ροής της ΓΙΑ (ή μετατροπή της σε ΟΣΟ)

Ξεκίνησε από alkisg, 07 Σεπ 2008, 07:51:21 ΜΜ

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

Ποιο διάγραμμα της ΓΙΑ ι ΑΠΟ α ΜΕΧΡΙ τ ΜΕ_ΒΗΜΑ β θα διδάσκατε στους μαθητές σας;

Ιδέα #1: με μία ΟΣΟ που να έχει διπλό ή καθόλου τελεστή (<=, >=)
Ιδέα #2: με μία ΑΝ για το πρόσημο του β και δύο ΟΣΟ
Ιδέα #3: με προσωρινές μεταβλητές για να μην επιτρέπεται αλλαγή του βήματος
Ιδέα #4: με (τ-ι)*β >= 0, μικρό και αρκετά σωστό αλλά δυσνόητο

alkisg

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

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


Πώς θα το κάνατε αυτό σε διάγραμμα; Ή, για να μην παιδευόμαστε με ζωγραφιές, πώς θα το μετατρέπατε σε ΟΣΟ; (οπότε το διάγραμμα βγαίνει εύκολα).

Ιδέα #1:
Κώδικας: ΓΛΩΣΣΑ
ΔΙΑΒΑΣΕ α, τ, β
ι <- α
ΟΣΟ ι (<= Η >=) τ ΕΠΑΝΑΛΑΒΕ
  ΓΡΑΨΕ ι
  ι <- ι + β
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

Δηλαδή και επειδή το <= ή >= εξαρτάται από την τιμή του βήματος, τα γράφουμε παράνομα στη γραμμή της ΟΣΟ (ή στο διάγραμμα σε έναν μόνο ρόμβο) για να μην κάνουμε πολύπλοκο τον κώδικα.

Ιδέα #2:
Κώδικας: ΓΛΩΣΣΑ
ΔΙΑΒΑΣΕ α, τ, β
ι <- α
ΑΝ β = 0 ΤΟΤΕ
  !Κάποιο είδος λάθους, δεν επιτρέπεται τιμή = 0
ΑΛΛΙΩΣ_ΑΝ β > 0 ΤΟΤΕ
  ΟΣΟ ι <= τ ΕΠΑΝΑΛΑΒΕ
    ΓΡΑΨΕ ι
    ι <- ι + β
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΛΛΙΩΣ
  ΟΣΟ ι >= τ ΕΠΑΝΑΛΑΒΕ
    ΓΡΑΨΕ ι
    ι <- ι + β
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΑΝ

Αυτή είναι πιο σωστή έκδοση, φαίνεται ότι υπάρχει μία ΑΝ πριν την ΟΣΟ, η οποία επιλέγει τον κατάλληλο τελεστή (<= ή >=). Όμως γίνεται πολύπλοκο. Αλλά από την άλλη είναι πολύπλοκη η εσωτερική εκτέλεση της ΓΙΑ, επομένως ίσως πρέπει να αντικατοπτρίζεται αυτή η πολυπλοκότητα στο διάγραμμα;

Δεύτερη ερώτηση: όποιο από τα 2 παραπάνω διαγράμματα (ή αυτά που θα προτείνετε εσείς) κι αν διαλέξουμε, το χρησιμοποιούμε όταν τελικά ξέρουμε από πριν το πρόσημο του βήματος; Ή απλοποιούμε επίτηδες το διάγραμμα, κουτσουρεύοντας τη λειτουργία της ΟΣΟ για να μην "φοβηθούν" οι μαθητές;

Τρίτη ερώτηση: το βιβλίο συμβουλεύει ότι δεν πρέπει να μεταβάλλονται η αρχική τιμή, η τελική τιμή και το βήμα στο εσωτερικό μιας εντολής ΓΙΑ. Αν όμως τελικά το κάνει αυτό κάποιος; Ή, αν καλεί συνάρτηση, π.χ. ΓΙΑ χ ΑΠΟ 1 ΜΕΧΡΙ ΜέγιστοςΤουΠίνακα(Α); Θα καλείται η συνάρτηση πολλές φορές, όπως επιβάλλει η παραπάνω μετατροπή του ΓΙΑ σε ΟΣΟ; Ή θα πρέπει να του βγει μήνυμα λάθους; Π.χ. στις πανελλαδικές, θα κόβατε μόρια;
Ο Διερμηνευτής αυτή τη στιγμή υλοποιεί την παρακάτω μετατροπή της ΓΙΑ σε ΟΣΟ:
Ιδέα #3:
Κώδικας: ΓΛΩΣΣΑ
ΔΙΑΒΑΣΕ α, τ, β
ι <- α
μη_μεταβαλλόμενη_τελική_τιμή <- τ
μη_μεταβαλλόμενο_βήμα <- β
ΑΝ μη_μεταβαλλόμενο_βήμα = 0 ΤΟΤΕ
  !Κάποιο είδος λάθους, δεν επιτρέπεται τιμή = 0
ΑΛΛΙΩΣ_ΑΝ μη_μεταβαλλόμενο_βήμα > 0 ΤΟΤΕ
  ΟΣΟ ι <= μη_μεταβαλλόμενη_τελική_τιμή ΕΠΑΝΑΛΑΒΕ
    ΓΡΑΨΕ ι
    ι <- ι + μη_μεταβαλλόμενο_βήμα
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΛΛΙΩΣ
  ΟΣΟ ι >= μη_μεταβαλλόμενη_τελική_τιμή ΕΠΑΝΑΛΑΒΕ
    ΓΡΑΨΕ ι
    ι <- ι + μη_μεταβαλλόμενο_βήμα
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΑΝ

Δηλαδή αποθηκεύει τις τιμές των β, τ σε κρυφές μεταβλητές ώστε ακόμα κι αν ο μαθητής αλλάζει τις τιμές τους (ή καλεί συνάρτηση) η εκτέλεση της ΓΙΑ να συνεχίζεται χωρίς να λαμβάνει υπόψη της τις αλλαγές. Φυσικά αυτό προσθέτει ακόμα μεγαλύτερη πολυπλοκότητα (η οποία συνήθως υπάρχει στη ΓΙΑ όπως αυτή υλοποιείται από Pascal, Basic κτλ, απλά δεν είναι εμφανής).

Εγώ κλίνω προς την 1η ιδέα για να μην "τρομάζουν" οι μαθητές, αν και πιο σωστή μου φαίνεται η 3η.
Επίσης προτείνω η μετατροπή να απλουστεύεται εάν γνωρίζουμε από πριν το πρόσημο του β (δηλαδή να μην γράφουμε πάντα το <= Η >=).
Τέλος, αν οι περισσότεροι συμφωνήσουν ότι η ιδέα #3 παραείναι πολύπλοκη, τότε νομίζω ότι ο Διερμηνευτής θα πρέπει να αλλάξει συμπεριφορά και ή (α) να "χτυπάει" σφάλμα ή (β) να υλοποιεί την ιδέα #1, επιτρέποντας πιθανώς άπειρες επαναλήψεις (εάν π.χ. μεταβάλλεται η τελική_τιμή).
Τι λέτε;

pgrontas

Οι δικές μου σκέψεις είναι οι εξής:
Δεν μου αρέσει καθόλου η πρώτη ιδέα. Νομίζω πως θα μπερδέψει τους μαθητές χωρίς λόγο. Έρχεται επιπλέον και σε αντίθεση με την σύνταξη που έχουν ήδη μάθει και αυτό το ι (<= Η >=) τ δεν μου κάθεται καθόλου καλά στο μάτι.
Εγώ κλίνω προς την δεύτερη, με την προϋπόθεση ότι αν κατάλαβα καλά θα εμφανίζεται ως διάγραμμα το ένα από τα δύο ΟΣΟ, όποιο δηλαδή ταιριάζει στο βήμα. Επιπλέον είναι αρκετά απλή.
Η τρίτη - αν την κατάλαβα σωστά - δεν μου αρέσει γιατί σε περιπτώσεις που αλλάζουν τα όρια ο βρόχος δεν εκτελείται τον σωστό αριθμό φορών, αν δεν ξανακαλέσεις την συνάρτηση. Μπορεί να είναι σύμφωνη με την σύσταση του βιβλίου, αλλά βγάζεις λάθος αποτέλεσμα. Ποιο σωστό κατά τη γνώμη μου θα ήταν να μην τον αφήνει να κάνει αλλαγή ορίων στην ΓΙΑ. Δηλαδή αν ανιχνεύσει αλλαγή ορίων η κλήση συνάρτησης, καλύτερα θα ήταν να βγάζει λάθος.
Οπότε ψηφίζω την ιδέα 2.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

EleniK

Ψηφίζω την ιδέα #2.

-η πρώτη ιδεα μου φαίνεται ελλιπής
-για την τρίτη ιδέα, εκτός από αυτό που είπε ο Παναγιώτης (pgrontas), θεωρώ θα έδινε το πράσινο φως στα παιδιά να 'πειράζουν' τον μετρητή. Το βιβλίο μπορεί να συμβουλεύει αλλά κατά κάποιο περίεργο τρόπο οι μαθητές συνθηως υιοθετούν τους πιο περίεργους η θολούς τρόπους αυτόματα.

Θα μπορούσε ίσως να ενσωματωθεί κάποια προειδοποίηση στο δεύτερο τρόπο όταν αλλάζει ο μετρητής?

Ελένη
Ελένη Κοκκίνου
Καθηγήτρια Πληροφορικής, ΠΕ19

alkisg

#3
Παράθεση από: pgrontas στις 07 Σεπ 2008, 11:35:27 ΜΜ
Εγώ κλίνω προς την δεύτερη, με την προϋπόθεση ότι αν κατάλαβα καλά θα εμφανίζεται ως διάγραμμα το ένα από τα δύο ΟΣΟ, όποιο δηλαδή ταιριάζει στο βήμα.
Αυτό είναι το πρόβλημα. Όταν π.χ. το βήμα είναι μεταβλητή και παίρνει τιμή κατά την εκτέλεση, δεν ξέρεις ποιο από τα δύο ΟΣΟ θα εκτελεστεί. Επομένως θα πρέπει να εμφανίζεται και η ΑΝ, και οι δύο ΟΣΟ.
Το συγκεκριμένο παράδειγμα παραπάνω: ΔΙΑΒΑΣΕ α, τ, β και μετά ακολουθεί η ΓΙΑ, πώς θα το έκανες σε διάγραμμα; Την τιμή του βήματος θα την δώσει ο χρήστης!

Παράθεση από: pgrontas στις 07 Σεπ 2008, 11:35:27 ΜΜ
Η τρίτη - αν την κατάλαβα σωστά - δεν μου αρέσει γιατί σε περιπτώσεις που αλλάζουν τα όρια ο βρόχος δεν εκτελείται τον σωστό αριθμό φορών, αν δεν ξανακαλέσεις την συνάρτηση. Μπορεί να είναι σύμφωνη με την σύσταση του βιβλίου, αλλά βγάζεις λάθος αποτέλεσμα.
Το αντίθετο! Οι απλοποιημένες εκδόσεις #1 και #2 που λέμε στους μαθητές είναι που δεν καλούνται σωστό αριθμό φορών! Και η Pascal το #3 κάνει!
Για παράδειγμα, έστω ότι το βήμα εμπεριέχει κλήση συνάρτησης. Με τους τρόπους #1 και #2 θα έπρεπε να κληθεί:
1) Μία φορά για τον υπολογισμό του προσήμου του βήματος, πριν από την επανάληψη
2) Μία φορά στο τέλος κάθε επανάληψης
Τραβηγμένο παράδειγμα, μη υλοποιήσιμο σε ΓΛΩΣΣΑ, μόνο για να γίνω πιο κατανοητός:
Κώδικας: ΓΛΩΣΣΑ
ι <- 1
ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ Αυξανόμενο
  ΓΡΑΨΕ ι
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
κτλ

ΣΥΝΑΡΤΗΣΗ Αυξανόμενο: ΑΚΕΡΑΙΑ
!Θεωρητική συνάρτηση που την πρώτη φορά που καλείται επιστρέφει 1,
!τη δεύτερη φορά 2, μετά 3, μετά 4... Δεν μπορεί να υλοποιηθεί σε ΓΛΩΣΣΑ.

Ο παραπάνω κώδικας με τις υλοποιήσεις #1 και #2 θα τυπώσει 1, 3, 6, 10
αντί για 1, 2, 4, 7 που θα περιμένουμε να τυπώσουν.
Γιατί:
(κλήση της Αυξανόμενο για υπολογισμό του προσήμου του βήματος => επιστρέφει 1)
ΓΡΑΨΕ 1
ι <- 1 + Αυξανόμενο
(η Αυξανόμενο επιστρέφει 2, άρα το ι γίνεται 3)
...

Δεν είναι τελείως παράλογο; Και φυσικά ο compiler δεν μπορεί να προβλέψει αν η Αυξανόμενο θα επιστρέψει θετικό ή αρνητικό για να υπολογίσει το πρόσημο του βήματος χωρίς να την καλέσει, πρέπει υποχρεωτικά να γίνει η πρώτη κλήση πριν από τη ΓΙΑ.
Υλοποίηση σε Visual Basic:
Dim the_step As Integer

Private Sub Form_Load()
'Αυτό τυπώνει 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.
the_step = 1
For i = 1 To 10 Step AutoIncrease(the_step)
  MsgBox i
Next

'Αναμενόμενη μετάφραση με ΟΣΟ. Τυπώνει 1, 2, 4, 7.
'Επομένως ΔΕΝ είναι η σωστή μετάφραση της ΓΙΑ παραπάνω.
the_step = 1
i = 1
While i <= 10
  MsgBox i
  i = i + AutoIncrease(the_step)
Wend
End Sub

Private Function AutoIncrease(the_step)
    AutoIncrease = the_step
    the_step = the_step + 1
End Function

Κοιτάξτε την (αναμενόμενη) μετάφραση σε ΟΣΟ με χρήση των #1 ή #2. Εμ, δεν είναι σωστή αφού βγάζει διαφορετικό αποτέλεσμα. Ο #3 τρόπος είναι ο σωστός (τουλάχιστον για τη Basic).

Παράθεση από: EleniK στις 08 Σεπ 2008, 12:10:48 ΠΜ
Θα μπορούσε ίσως να ενσωματωθεί κάποια προειδοποίηση στο δεύτερο τρόπο όταν αλλάζει ο μετρητής?
Ναι, αυτό δεν είναι πρόβλημα. Μπορεί να εμφανίζεται είτε μήνυμα λάθους και να σταματάει η εκτέλεση είτε απλά προειδοποίηση. Αλλά νομίζω ότι το ίδιο μήνυμα θα πρέπει να εμφανίζεται και για το βήμα και για την τελική τιμή. Η αρχική τιμή δεν είναι πρόβλημα αν μεταβάλλεται, αν και στο βιβλίο (κατά λάθος?) την αναφέρουν κι αυτή.

Επειδή έγραψα πολλά και ίσως κάποιοι χάθηκαν, η απλή μορφή της ερώτησης είναι:
Πώς θα γράφατε είτε με διάγραμμα είτε με ΟΣΟ το παρακάτω τμήμα προγράμματος;
Κώδικας: ΓΛΩΣΣΑ
ΔΙΑΒΑΣΕ α, τ, β
ΓΙΑ ι ΑΠΟ α ΜΕΧΡΙ τ ΜΕ_ΒΗΜΑ β

Εννοείται ότι δεν ξέρουμε τα πρόσημα των α, τ, β αφού τα δίνει ο χρήστης.

pgrontas

Παράθεση από: alkisg στις 08 Σεπ 2008, 12:49:35 ΠΜ
Ο παραπάνω κώδικας με τις υλοποιήσεις #1 και #2 θα τυπώσει 1, 3, 6, 10
αντί για 1, 2, 4, 7 που θα περιμένουμε να τυπώσουν.
Γιατί περιμένουμε να τυπώσει 1,2,4,7? Το τι θα τυπώσει είναι θέμα ορισμού - είτε θα καλέσεις και αρχικά την συνάρτηση είτε όχι. Αν όλοι έχουν συμφωνήσει σε αυτό δεν υπάρχει αμφιβολία.

Νομίζω πάντως ότι η όλη συζήτηση είναι κάπως παραπλανητική για τον εξής λόγο:
Το διάγραμμα ροής δείχνει την  δομή του αλγορίθμου και όχι την εκτέλεση του.
Ποια είναι η δομή αυτή:
Αρχική Τιμή Μετρητή -> Έλεγχος Συνθήκης -> Εκτέλεση Εντολών -> Μεταβολή Μετρητή -> Έλεγχος Συνθήκης -> ...
Αν υποθέσουμε ότι η ΓΙΑ πρέπει να μετατραπεί σε ΟΣΟ γιατί να μην δείξεις απλά την παραπάνω δομή της όσο;

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

Laertis

Η 1η ιδέα υλοποιείται μόνο αν είναι γνωστό εκ των προτέρων το βήμα, οπότε γράφεται η αντίστοιχη ανισότητα.

Τώρα στο ερώτημα σου Άλκη, κι εφόσον το βήμα ορίζεται μετά τη Για νομίζω ότι η 3η λύση (αν και πολύπλοκη) είναι πιο κοντά στην υλοποίηση που πραγματεύεται το ίδιο το βιβλίο, αλλά όπως πολύ σωστά αναφέρεις και στην πράξη.

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

Πιό σωστή επιστημονικά βλέπω την 3η λύση. Παιδαγωγικά τη 2η με τις ανάλογες προειδοποιήσεις όταν μεταβάλλεται το βήμα ή η τελική τιμή.
Νικολακάκης Γιώργος
Μηχανικός Η/Υ Συστημάτων
Καθηγητής Πληροφορικής
http://users.sch.gr/gnikola

alkisg

Παράθεση από: pgrontas στις 08 Σεπ 2008, 05:21:03 ΜΜ
Γιατί περιμένουμε να τυπώσει 1,2,4,7? Το τι θα τυπώσει είναι θέμα ορισμού - είτε θα καλέσεις και αρχικά την συνάρτηση είτε όχι. Αν όλοι έχουν συμφωνήσει σε αυτό δεν υπάρχει αμφιβολία.

Παναγιώτη, αν δεν κληθεί η συνάρτηση στην αρχική ΑΝ του ισοδύναμου κώδικα με ΟΣΟ, τότε πώς μπορεί να αποφασιστεί αν θα χρησιμοποιηθεί το <= ή το >=; Δεν είναι θέμα ορισμού, δεν γίνεται αλλιώς...

ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ 1
Πρέπει να χρησιμοποιηθεί <= και να γίνουν 10 επαναλήψεις.

ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ -1
Πρέπει να χρησιμοποιηθεί >= και να μη γίνει καμία επανάληψη.

ΓΙΑ ι ΑΠΟ α ΜΕΧΡΙ τ ΜΕ_ΒΗΜΑ β
Πρέπει να γίνει ΑΝ (δηλαδή να υπολογιστεί η τιμή του β - αν είναι συνάρτηση, να κληθεί) για να αποφασιστεί αν θα χρησιμοποιηθεί <= ή >=.

Παράθεση από: pgrontas στις 08 Σεπ 2008, 05:21:03 ΜΜ
Νομίζω πάντως ότι η όλη συζήτηση είναι κάπως παραπλανητική για τον εξής λόγο:
Το διάγραμμα ροής δείχνει την  δομή του αλγορίθμου και όχι την εκτέλεση του.
Ποια είναι η δομή αυτή:
Αρχική Τιμή Μετρητή -> Έλεγχος Συνθήκης -> Εκτέλεση Εντολών -> Μεταβολή Μετρητή -> Έλεγχος Συνθήκης -> ...
Αν υποθέσουμε ότι η ΓΙΑ πρέπει να μετατραπεί σε ΟΣΟ γιατί να μην δείξεις απλά την παραπάνω δομή της όσο;
ΟΚ, αλλά τι να γράψω στο διάγραμμα στον Έλεγχο Συνθήκης όταν δεν ξέρω το πρόσημο του β; <= ή >=;


@Laertis: έχω μια ιδέα για απλοποίηση, θα τη γράψω αύριο για να φτιάξω και το σχετικό σχήμα... πολύ μπελάς πάντως, χίλιες φορές καλύτερο το for της C ή της Java!

alkisg

#7
Ιδέα #4:

Επισυνάπτω ένα αρχείο .γλώσσας με μια ιδέα απλοποίησης της μετατροπής της ΓΙΑ σε ΟΣΟ (και κατά συνέπεια του αντίστοιχου διαγράμματος). Δηλαδή η αντίστοιχη ΟΣΟ είναι: ΟΣΟ (τ - ι)*β >= 0 ΕΠΑΝΑΛΑΒΕ..., το οποίο σημαίνει ότι κοιτάμε εάν το (τ-ι) είναι ομόσημο με το βήμα β.
Απ' ότι νομίζω και από ότι λένε και οι συνάδελφοι εδώ θα πρέπει να χρησιμοποιείται μόνο αν δεν γνωρίζουμε το πρόσημο του βήματος. Εάν το γνωρίζουμε (δηλαδή αν είναι σταθερά), τότε θα πρέπει να χρησιμοποιείται η απλή μετατροπή σε ΟΣΟ.

Πλεονεκτήματα:
1. Είναι σωστό συντακτικά, δεν έχει περίεργα του στυλ (<= Η >=) όπως η ιδέα #1.
2. Είναι πολύ πιο απλό (τουλάχιστον οπτικά) από τις ιδέες #2 και #3 αφού ενώνει μία ΑΝ και δύο ΟΣΟ και τις κάνει μία και μοναδική ΟΣΟ.

Μειονεκτήματα:
1. Αντίθετα από την ιδέα #3 και όμοια με τη #2, είναι ευάλωτο σε αλλαγές των τιμών της τελικής τιμής και του βήματος.
2. Υπολογίζει (=καλεί, αν είναι συνάρτηση) το βήμα πολύ περισσότερες φορές από όλες τις υπόλοιπες ιδέες. Παράδειγμα εκτέλεσης του επισυναπτόμενου:
Δώστε την αρχική τιμή, για παράδειγμα -1: -1
Δώστε την τελική τιμή, για παράδειγμα -3: -3
ΓΙΑ:
  (κλήθηκε η ΣΥΝΑΡΤΗΣΗ β)
-1
-2
-3
Ισοδύναμη ΟΣΟ:
  (κλήθηκε η ΣΥΝΑΡΤΗΣΗ β)
-1
  (κλήθηκε η ΣΥΝΑΡΤΗΣΗ β)
  (κλήθηκε η ΣΥΝΑΡΤΗΣΗ β)
-2
  (κλήθηκε η ΣΥΝΑΡΤΗΣΗ β)
  (κλήθηκε η ΣΥΝΑΡΤΗΣΗ β)
-3
  (κλήθηκε η ΣΥΝΑΡΤΗΣΗ β)
  (κλήθηκε η ΣΥΝΑΡΤΗΣΗ β)

Δηλαδή για 3 επαναλήψεις κάλεσε τη συνάρτηση β επτά φορές αντί για μία.
(Η ΓΡΑΨΕ μπήκε παράνομα στη συνάρτηση μόνο και μόνο για επίδειξη του προβλήματος)

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

alkisg

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

Υ.Γ. όλα αυτά δέχονται μικροαλλαγές, π.χ. θα μπορούσε να χρησιμοποιηθεί το #1 και τη στιγμή (κατά την εκτέλεση) που γίνεται γνωστή η τιμή του βήματος να αντικαθίσταται το (<= Η >=) με τον σωστό τελεστή, είτε <= είτε >=.

evry


   Δεν έχω κάποιο επιχείρημα για να στηρίξω τη μια ή την άλλη άποψη αλλά πιστεύω ότι εδώ φαίνεται ξεκάθαρα ο προβληματικός ορισμός της Για. Πολύ καλά είπες Άλκη ότι η for των C++, Java είναι μια χαρά. Από την πρώτη στιγμή δε μου άρεσε αυτή η εξάρτηση της ανισότητας στο Όσο από το πρόσημο του βήματος. Μου φαινόταν ότι κάτι δεν πήγαινε καλά. Μια λύση όσον αφορά την εντολή Για θα ήταν να υπήρχε κάτι σαν το DOWNTO της Pascal και στη συνέχεια να υπήρχε και βήμα που θα ήταν πάντα θετικό. Έτσι θα ξέραμε σε compile time για την ανισότητα στο Όσο. Τέλος πάντων ποτέ μου δε χώνεψα τη Για όπως την ορίζει το βιβλίο αλλά όπως και να έχει εγώ θα πρότεινα το εξής :
  Να μην βάλεις τίποτα μεταξή του  i και του t. ʼστο κενό ή χρωμάτισε το background, κάπως όμως να υποδηλώνει ότι ακόμα αυτό που θα έπρεπε να είναι εκεί δεν έχει υπολογιστεί. Αυτό φυσικά μόνο όταν το βήμα είναι μεταβλητή. Με το που θα φτάσει ο έλεγχος στην Όσο, οπότε λογικά θα έχει πάρει τιμή το βήμα, τότε εμφανίζεις σε runtime τον κατάλληλο συγκριτικό τελεστή. Ενώ εκτελείται δηλαδή το διάγραμμα ροής.
   Τώρα αν δεν το εκτελείς και απλά θέλεις να εξάγεις ένα διάγραμμα μάλλον το 2ο φαίνεται καλύτερο, όμως θα μπλέξει σίγουρα τα παιδιά.
    Πιστεύω ότι αν πας κατα γράμμα με αυτά που λέει το βιβλίο θα πρέπει να το κάνεις όσο πιο απλό γίνεται αφού θα προορίζεται για το συγκεκριμένο μάθημα με κίνδυνο να μην είσαι εντελώς τυπικός.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

P.Tsiotakis

Κι όμως, τελικά το πιο απλό (παρά τη χρήση 2 συγκριτικών τελεστών) είναι το πρώτο.  (έχει κάποιο λαθάκι το δ.ρ. ; )

Κατά τη γνώμη μου, δεν είναι δυνατόν να παραχθεί κωδικοποίηση (και βήματα δ.ρ.) 2πλάσια ή και 3πλάσια απο την αρχική κωδικοποίηση.

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

Στην μετατροπή μεταξύ δομών επανάληψης, πρέπει να διερευνώνται όλες οι περιπτώσεις με κατάλληλες δομές επιλογής.

Είναι βέβαια ένα λεπτό σημείο...

alkisg

Παράθεση από: Τσιωτάκης Παναγιώτης στις 09 Σεπ 2008, 11:56:17 ΠΜ
(έχει κάποιο λαθάκι το δ.ρ. ; )

Ουπς... Ο δαίμων του τυπογραφείου χτύπησε!  >:D

ΟΚ, οπότε βάζω απλά ένα ι ≶= τ μέσα στο ρόμβο (δηλαδή την ιδέα #1) και όποιος καθηγητής θέλει κάνει σχετική συζήτηση. Υπάρχει κάποιος συνάδελφος που θα έκοβε μονάδες αν έβλεπε τέτοιο διάγραμμα σε γραπτό;

Μπορώ να αντικαθιστώ το ≶= με >= ή <= ανάλογα κατά την εκτέλεση, αλλά αν η ΓΙΑ είναι μέσα σε άλλη, μεγαλύτερη επανάληψη, τότε μπορεί το βήμα στην πρώτη μεγάλη επανάληψη να είναι θετικό και στη δεύτερη αρνητικό, οπότε να φαίνεται τελείως γελοίος ο τελεστής ≷= που θα αλλάζει κάθε λίγο και λιγάκι... Μάλλον θα είναι καλύτερα να τον αφήσω αμετάβλητο.

P.Tsiotakis

#12
Άλκη δεν ξέρω αν είναι η πιο σωστή η σκέψη μου..

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

alkisg

Το έβαλα σε ψηφοφορία, πιθανώς κάποιοι να έχουν συγκεκριμένη άποψη αλλά να μην έχουν να προσθέσουν κάτι στη συζήτηση, ας "ακουστούν" κι αυτοί...

pgrontas

Τελικά ψήφισα και εγώ το πρώτο, λόγω της απλότητας. Η μόνη διαφοροποίηση που εξακολουθώ να έχω είναι η ύπαρξη των διπλών τελεστών. Καλύτερα να μην μπει καθόλου τελεστής όπως είπε ο evry ή να μπει περιφραστικά - όσο το ι δεν έχει φτάσει το τ.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

Laertis

Θεωρώ ως πιό σωστό το 3ο, καταλληλότερο για την περιγραφή αλλά μπερδεμένο για τα παιδιά το 2ο αλλά για λόγους απλότητας ψηφίζω το 1ο  :D
Νικολακάκης Γιώργος
Μηχανικός Η/Υ Συστημάτων
Καθηγητής Πληροφορικής
http://users.sch.gr/gnikola

alkisg

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

vistrian

#17
Ψήφισα το δεύτερο, διότι αφού πρέπει να ελέγχουμε εάν το βήμα είναι θετικό ή αρνητικό
θα πρέπει να πάρουμε δύο περιπτώσεις και πιστεύω ότι είναι πιο εύκολο στον μαθητή να το καταλάβει.

ΑΛΛΑ όπως λέει και ο Παναγιώτης "Όλα αυτά για το πρόσημο του β, που προφορικά μπορεί να εξηγηθεί."
τότε το πιο απλό και το πιο κατανοητό είναι το πρώτο.


Άλκη στα διαγράμματα ιδέα_2 και ιδέα_3 δεν θα πρέπει να βγάλουμε από την συνθήκη β>=0 το =;
Εφόσον δεν επιτρέπεται το βήμα να είναι αρνητικό.
ʼρα θα έπρεπε κατά την γνώμη μου να υπάρχει ακόμη μία ΑΝ δηλ όπως ακριβώς το έκανες σε πρόγραμμα.

Τελικά νομίζω ότι αρχίζει και γίνεται πολύ πολύπλοκο.....   
VR in Computing