Πότε θα γίνει χρήση της ΟΣΟ και πότε της Μέχρις_ότου

Ξεκίνησε από anestis85, 20 Νοε 2011, 12:47:47 ΜΜ

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

anestis85

Καλημέρα σε όλη την κοινότητα!
Έχω το εξής ερώτημα....
Όταν γνωρίζουμε ότι επιτρέπεται η εκτέλεση μίας τουλάχιστον επανάληψης χρησιμοποιούμε την ΜΕΧΡΙΣ_ΟΤΟΥ. Υποχρεωτικά όμως;
θα υπάρξει πρόβλημα εάν οι μαθητές μας χρησιμοποιήσουν την ΌΣΟ; Έτσι κι αλλιώς εάν γνωρίζουμε ότι η πρώτη τιμή είναι αποδεκτη τότε και με την ΟΣΟ και με την ΜΕΧΡΙΣ_ΟΤΟΥ θα γίνει τουλάχιστον μία φορά.

Laertis

Δεν είναι υποχρεωτική η χρήση της ΜΕΧΡΙΣ_ΟΤΟΥ, μπορεί να χρησιμοποιηθεί και η ΟΣΟ εφόσον παράγεται το ίδιο αποτέλεσμα. Κλασική περίπτωση ο έλεγχος εγκυρότητας τιμής που γίνεται και με τους δύο τρόπους αλλά περισσότερο "βολικός" είναι αυτός της ΜΕΧΡΙΣ_ΟΤΟΥ.
Νικολακάκης Γιώργος
Μηχανικός Η/Υ Συστημάτων
Καθηγητής Πληροφορικής
http://users.sch.gr/gnikola

P.Tsiotakis

οι δυο δομές είναι ισοδύναμες
το Μέχρις_ότου θα το προτιμήσεις σε έλεγχο δεδομένων, σε επεξεργασία μενού και όταν θες να επεξεργαστείς ΚΑΙ την τιμή φρουρό (τελευταία επανάληψη συνήθως)

διαφορετικά (αν δε θα επεξεργαστείς την τιμή φρουρό), στο Μέχρις_ότου πρέπει να βάλεις δομή επιλογής για να αποκλείσεις την τελευταία επεξεργασία!


anestis85

Μέχρι σήμερα συμβούλευα τους μαθητές μου να χρησιμοποιούν την ΜΕΧΡΙΣ_ΟΤΟΥ όταν αντιλαμβάνονται την εκτέλεση τουλάχιστον μίας επανάληψης.
Στο είδος των ασκήσεων όμως, που όταν ξεπεραστεί κάποιο όριο θα πρέπει να τερματίζει η επανάληψη χωρίς να λάβει υπόψην την τελευταία τιμή, είναι πιο εύκολη η υλοποίηση με ΟΣΟ. Με την ΜΕΧΡΙΣ_ΟΤΟΥ θα χρειαζόταν μία τιμή φρουρός αν ξεπεραστει το όριο που θέτει η άσκηση.
Απλά ήθελα να ενημερωθω εάν παίζει σημαντικό ρόλο η χρήση της κατάλληλης δομής επανάληψης.... Δεν θα έπρεπε εάν λειτουργεί το ίδιο σωστα φυσικά... :)

Vangelis

Φυσικά να σημειώσουμε ότι  με την ΜΕΧΡΙΣ_ΟΤΟΥ η συνθήκη που ακολουθεί είναι πιο "φυσική" (συνήθως περιγράφεται απο το πρόβλημα) ενώ με την ΟΣΟ θα πρέπει να αντιστραφεί και αυτό σε σύνθετες συνθήκες μπορεί να προκαλέσει προβλήματα. 

petrosp13

Μη  ξεχνάμε την απλή αντιστροφή μιας συνθήκης με χρήση άρνησης (όχι)
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

gpapargi

Παράθεση από: anestis85 στις 20 Νοε 2011, 01:13:42 ΜΜ
Απλά ήθελα να ενημερωθω εάν παίζει σημαντικό ρόλο η χρήση της κατάλληλης δομής επανάληψης.... Δεν θα έπρεπε εάν λειτουργεί το ίδιο σωστα φυσικά... :)

Τα πάντα λύνονται και με τις 2. Ωστόσο πάντα μία από τις δύο είναι η καταλληλότερη. Το ίδιο το πρόβλημα ουσιαστικά σου ζητάει με ποια θέλει να το λύσεις. Αν σε ενδιαφέρει η διαδικασία με την οποία επιλέγεις την κατάλληλη πες μου να την γράψω. Είναι κάμποσο για να εξηγηθεί σωστά. Πιστεύω πάντως ότι αξίζει τον κόπο γιατί αποδεικνύεται η ισοδυναμία των 2 εντολών, δείχνεται ο αλγόριθμος για τη μετατροπή από τη μια στην άλλη και μπαίνουν και οι βάσεις για το ποιου είδους μετατροπές έχει νόημα να ζητάμε στα θέματα και ποιες όχι. Ξεκαθαρίζεται επίσης και το τι ακριβώς εννοούμε όταν μιλάμε για μετατροπή από τη μια εντολή επανάληψης στην άλλη.

Αθανάσιος Πέρδος

Να αναπτύξετε αλγόριθμο ο οποίος θα διαβάζει τυχαίους αριθμούς μέχρι το πλήθος τους να γίνει 20 ή να δοθεί ο αριθμός 0. Στη συνέχεια να εμφανίζει το μέσο όρο τους. Ο αριθμός 0 να μην συμπεριλαμβάνεται στο μέσο όρο. Αν ο πρώτος αριθμός είναι ο 0, ο αλγόριθμος να τερματίζει εμφανίζοντας το μήνυμα "Δεν δόθηκε αριθμός εκτός του 0".

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

gpapargi

Σε αυτή την περίπτωση υπάρχει μια ιδιαιτερότητα: Υπάρχουν 2 συνθήκες που η κάθε μια προκαλεί διακοπή που όμως δεν γίνονται ταυτόχρονα. Αυτό το μη ταυτόχρονο είναι η ιδιαιτερότητα και καθιστά αδύνατη τη λύση χωρίς εντολή επιλογής. Εδώ πράγματι δεν υπάρχει προτιμότερη με την έννοια που εννοώ. Βλέποντας το προηγούμενο μήνυμα που έγραψα, αυτό που ήθελα να πω (αλλά δεν το είπα και διορθώνω τώρα), είναι ότι πάντα η μια είναι προτιμότερη από την άλλη όταν η συνθήκη διακοπής είναι μία. 

Αθανάσιος Πέρδος

Παράθεση από: gpapargi στις 24 Νοε 2011, 08:46:21 ΠΜ
αυτό που ήθελα να πω (αλλά δεν το είπα και διορθώνω τώρα), είναι ότι πάντα η μια είναι προτιμότερη από την άλλη όταν η συνθήκη διακοπής είναι μία. 

Μία υπεραγορά αποφάσισε να προσφέρει 500 τεμάχια από ένα συγκεκριμένο προϊόν ευρείας κατανάλωσης μισοτιμής. Οι πελάτες της υπεραγοράς όμως μπορούν να αγοράσουν μέχρι 10 τεμάχια από το συγκεκριμένο προϊόν. Να αναπτύξετε αλγόριθμο ο οποίος με δεδομένη την τιμή του τεμαχίου, θα διαβάζει πόσα τεμάχια θέλει ο κάθε πελάτης και θα εμφανίζει το κόστος της αγοράς. Να ελέγχεται κατά την είσοδο ότι τα τεμάχια είναι μικρότερα ή ίσα του 10. Ο αλγόριθμος θα σταματάει όταν κάποιος πελάτης ζητήσει περισσότερα τεμάχια από αυτά που έχουν μείνει διαθέσιμα εμφανίζοντας το μήνυμα «υπάρχουν διαθέσιμα μόνο» και δίπλα τον αριθμό των διαθέσιμων τεμαχίων. Ο τελευταίος πελάτης αγοράζει μόνο όσα έχουν μείνει διαθέσιμα. Τέλος ο αλγόριθμος να εμφανίζει πόσοι πελάτες εκμεταλλεύτηκαν την προσφορά. Θεωρήστε ότι τα τεμάχια της προσφοράς θα εξαντληθούν σίγουρα.

Στο παραπάνω πρόβλημα με μία μόνο συνθήκη διακοπής ποια από τις παρακάτω λύσεις είναι προτιμότερη και γιατί;

Αλγόριθμος π1
Δεδομένα // τιμή //

αρ_τεμ ← 500
ΠΠ ← 0
done ← Αληθής       ! υπάρχουν ακόμη τεμάχια
Όσο done = Αληθής επανάλαβε
  Αρχή_επανάληψης
    Διάβασε τεμ
  Μέχρις_ότου τεμ ≤ 10
  Αν τεμ ≤ αρ_τεμ τότε
    κόστος ← τεμ * τιμή
    αρ_τεμ ← αρ_τεμ - τεμ
  αλλιώς
    Εμφάνισε "υπάρχουν διαθέσιμα μόνο ", αρ_τεμ
    κόστος ← αρ_τεμ * τιμή
    done ← Ψευδής
  Τέλος_αν
  Εμφάνισε κόστος
  ΠΠ ← ΠΠ + 1
Τέλος_επανάληψης

Εμφάνισε ΠΠ
Τέλος π1 

Αλγόριθμος π1
Δεδομένα // τιμή//

αρ_τεμ ← 500
ΠΠ ← 0
done ← Αληθής     ! υπάρχουν ακόμη τεμάχια
Αρχή_επανάληψης
  Αρχή_επανάληψης
    Διάβασε τεμ
  Μέχρις_ότου τεμ ≤ 10
  Αν τεμ ≤ αρ_τεμ τότε
    κόστος ← τεμ * τιμή
    αρ_τεμ ← αρ_τεμ - τεμ
  αλλιώς
    Εμφάνισε "υπάρχουν διαθέσιμα μόνο ", αρ_τεμ
    κόστος ← αρ_τεμ * τιμή
    done ← Ψευδής
  Τέλος_αν
  Εμφάνισε κόστος
  ΠΠ ← ΠΠ + 1
Μέχρις_ότου done = Ψευδής

Εμφάνισε ΠΠ
Τέλος π1

gpapargi

#10
Κανένα από τα 2. Ο λόγος είναι ότι γίνονται 2 έλεγχοι για κάθε προϊόν (ένας η Αν και ένας η Όσο) εκ των οποίων ο δεύτερος είναι ουσιαστικά ο ίδιος με τον πρώτο ως προς την πληροφορία που μας δίνει.
Γράφω κατά τη γνώμη μου την προτιμότερη λύση με κάποιες παραδοχές που δεν αλλάζουν την ουσία:
Η πρώτη είναι ότι υποθέτω σωστή είσοδο για να γλιτώσω τον έλεγχο εισόδου και να εστιάσουμε στα κρίσιμα σημεία. Αν βέβαια θέλω τον  βάζω μετά κλείνοντας τα Διάβασε σε αρχή_επανάληψης μέχρις_ότου.
Η δεύτερη είναι ότι ασχολούμαι με την περίπτωση που το αρχικό συνολικό πλήθος των προϊόντων και το μέγιστο  πλήθος των προϊόντων της αγοράς είναι τυχαίοι θετικοί αριθμοί.

Η ουσία της άσκησης δεν αλλάζει. Γράφω τη λύση και συζητάμε. Αν είναι ικανοποιητική θα βάλω και το σκεπτικό της

Δεδομένα // αρχικό_συνολικό_πλήθος, όριο_αγοράς// ! το όριο_αγοράς είναι για πιθανό έλεγχο εισόδου

υπόλοιπο_προϊόντων <- αρχικό_συνολικό_πλήθος
Πλήθος_πελατών <- 0
Διάβασε πλήθος_αγοράς
Όσο πλήθος_αγοράς <= υπόλοιπο_προϊόντων επανάλαβε
   κόστος<- τιμή_μονάδας * πλήθος_αγοράς
   Εμφάνισε κόστος
   υπόλοιπο_προϊόντων <- υπόλοιπο_προϊόντων – πλήθος_αγοράς
   πλήθος_πελατών<- πλήθος πελατών +1
   Διάβασε πλήθος_αγοράς
Τέλος_επανάληψης
Εμφάνισε «Υπάρχουν διαθέσιμα μόνο», υπόλοιπο_προϊόντων, τιμή_μονάδας * υπόλοιπο_προϊόντων


Δες το αν μας καλύπτει ως προς τη λειτουργικότητα και το συζητάμε

Αθανάσιος Πέρδος

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

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

Όποτε με τον τρόπο που θέτεις το ζήτημα η λύση που δίνεις είναι πιο "λειτουργική" αν και στο πλαίσιο του μαθήματος δεν ξέρω πως ορίζεται αυτή η έννοια. Βέβαια παραβλέπεις ότι αν κάποια στιγμή ένας πελάτης ζητήσει ακριβώς όσα περισσεύουν ο αλγόριθμος πρέπει να τελειώσει και όχι να περιμένει και άλλον πελάτη ώστε να του εμφανίσει ότι υπάρχουν διάθεσιμα 0 και το κόστος αγοράς είναι 0. Νομίζω ότι δεν είναι λογικό αυτό.

Δίνω λοιπόν ακόμη μία εκφώνηση και τη λύση της με τις δύο μορφές.
Ένα τηλεοπτικό κανάλι παρουσιάζει κάθε χρόνο για φιλανθρωπικούς σκοπούς μία εκπομπή στην οποία οι τηλεθεατές στέλνουν μηνύματα κινητού τηλεφώνου που περιέχουν τη λέξη «Μπορώ» για τη συγκέντρωση ενός ποσού. Με ένα μήνυμα ο κάθε τηλεθεατής συνεισφέρει 3,5€. Να αναπτύξετε αλγόριθμο ο οποίος θα εμφανίζει το ποσό που συγκεντρώθηκε ενώ αν κανένας τηλεθεατής δεν στείλει μήνυμα να εμφανίζει «Δεν υπάρχει προσφορά». Ο αλγόριθμος θα τερματίζει όταν σταλεί μήνυμα από τον υπεύθυνο της παραγωγής με τη λέξη «Τέλος» το οποίο φυσικά δεν χρεώνεται.

Αλγόριθμος π1
π ← 1
Διάβασε μήνυμα
Όσο μήνυμα ≠ "Τέλος" επανάλαβε
  π ← π + 1
  Διάβασε μήνυμα
Τέλος_επανάληψης

Αν π > 1 τότε
  π ← π - 1
  Εμφάνισε π * 3.5
αλλιώς
  Εμφάνισε "Δεν υπήρξε καμία προσφορά"
Τέλος_αν

Τέλος π1

Αλγόριθμος π1
π ← 0

Αρχή_επανάληψης
  π ← π + 1
  Διάβασε μήνυμα
Μέχρις_ότου μήνυμα = "Τέλος"

Αν π > 1 τότε
  π ← π - 1
  Εμφάνισε π* 3.5
αλλιώς
  Εμφάνισε "Δεν υπήρξε καμία προσφορά"
Τέλος_αν

Τέλος π1

Χωρίς λοιπόν να αλλάξεις την εκφώνηση, το ερώτημα είναι γιατί η λύση με όσο είναι προτιμότερη από αυτή με μέχρις_ότου ή και το αντίστροφο. Εγώ δεν μπορώ να καταλάβω κάποια διαφορά στη λειτουργικότητα τους. Θα ήθελα πολύ να μάθω το σκεπτικό σου γιατί αυτό το ερώτημα μου έχει τεθεί από πάρα πολλούς μαθητές.

gpapargi

Παράθεση από: aperdos στις 30 Νοε 2011, 01:04:33 ΠΜ
Τώρα όσον αφορά το δεύτερο παράδειγμα σαφέστατα αλλάζεις την ουσία της άσκησης. Η άσκηση θέτοντας 500 προϊόντα αρχικά και αγοράζοντας μόνο 10 το μέγιστο ο κάθε πελάτης θέτει ως δεδομένο ότι δεν μπορεί ο πρώτος να τα αγοράσει όλα. Δεν μιλάει για τυχαίους αριθμούς.

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

υπόλοιπο_προϊόντων <- αρχικό_συνολικό_πλήθος
Πλήθος_πελατών <- 0
Διάβασε πλήθος_αγοράς
Αρχή_επανάληψης
   κόστος<- τιμή_μονάδας * πλήθος_αγοράς
   Εμφάνισε κόστος
   υπόλοιπο_προϊόντων <- υπόλοιπο_προϊόντων – πλήθος_αγοράς
   πλήθος_πελατών<- πλήθος πελατών +1
   Διάβασε πλήθος_αγοράς
Μέχρις_ότου πλήθος_αγοράς > υπόλοιπο_προϊόντων
Εμφάνισε «Υπάρχουν διαθέσιμα μόνο», υπόλοιπο_προϊόντων, τιμή_μονάδας * υπόλοιπο_προϊόντων

Παράθεση από: aperdos στις 30 Νοε 2011, 01:04:33 ΠΜ
Βέβαια παραβλέπεις ότι αν κάποια στιγμή ένας πελάτης ζητήσει ακριβώς όσα περισσεύουν ο αλγόριθμος πρέπει να τελειώσει και όχι να περιμένει και άλλον πελάτη ώστε να του εμφανίσει ότι υπάρχουν διάθεσιμα 0 και το κόστος αγοράς είναι 0. Νομίζω ότι δεν είναι λογικό αυτό.

Όχι δεν το παρέβλεψα. Απλά είδα ότι έτσι λειτουργεί και ο κώδικας που έγραψες.


Παράθεση από: aperdos στις 30 Νοε 2011, 01:04:33 ΠΜ
Δίνω λοιπόν ακόμη μία εκφώνηση και τη λύση της με τις δύο μορφές.
Ένα τηλεοπτικό κανάλι παρουσιάζει κάθε χρόνο για φιλανθρωπικούς σκοπούς μία εκπομπή στην οποία οι τηλεθεατές στέλνουν μηνύματα κινητού τηλεφώνου που περιέχουν τη λέξη «Μπορώ» για τη συγκέντρωση ενός ποσού. Με ένα μήνυμα ο κάθε τηλεθεατής συνεισφέρει 3,5€. Να αναπτύξετε αλγόριθμο ο οποίος θα εμφανίζει το ποσό που συγκεντρώθηκε ενώ αν κανένας τηλεθεατής δεν στείλει μήνυμα να εμφανίζει «Δεν υπάρχει προσφορά». Ο αλγόριθμος θα τερματίζει όταν σταλεί μήνυμα από τον υπεύθυνο της παραγωγής με τη λέξη «Τέλος» το οποίο φυσικά δεν χρεώνεται.

Αλγόριθμος π1
π ← 1
Διάβασε μήνυμα
Όσο μήνυμα ≠ "Τέλος" επανάλαβε
  π ← π + 1
  Διάβασε μήνυμα
Τέλος_επανάληψης

Αν π > 1 τότε
  π ← π - 1
  Εμφάνισε π * 3.5
αλλιώς
  Εμφάνισε "Δεν υπήρξε καμία προσφορά"
Τέλος_αν

Τέλος π1

Αλγόριθμος π1
π ← 0

Αρχή_επανάληψης
  π ← π + 1
  Διάβασε μήνυμα
Μέχρις_ότου μήνυμα = "Τέλος"

Αν π > 1 τότε
  π ← π - 1
  Εμφάνισε π* 3.5
αλλιώς
  Εμφάνισε "Δεν υπήρξε καμία προσφορά"
Τέλος_αν

Τέλος π1

Χωρίς λοιπόν να αλλάξεις την εκφώνηση, το ερώτημα είναι γιατί η λύση με όσο είναι προτιμότερη από αυτή με μέχρις_ότου ή και το αντίστροφο. Εγώ δεν μπορώ να καταλάβω κάποια διαφορά στη λειτουργικότητα τους. Θα ήθελα πολύ να μάθω το σκεπτικό σου γιατί αυτό το ερώτημα μου έχει τεθεί από πάρα πολλούς μαθητές.

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

π<- 0
Διάβασε μήνυμα
Όσο μήνυμα <> «τέλος» επανάλαβε
   π<-π+1
   Διάβασε μήνυμα
Τέλος_επανάληψης

Αν π = 0 τότε
   Εμφάνισε "Δεν υπήρξε καμία προσφορά"
Αλλιώς
   Εμφάνισε π * 3.5
Τέλος_αν

Στο ερώτημα γιατί η μια και όχι η άλλη εντολή η γνώμη είναι η εξής:
Έχω βάλει κάποια κριτήρια. Θα πρέπει καταρχήν ο αλγόριθμος να κάνει ακριβώς αυτό που θα έκανε ο άνθρωπος με το χέρι, όχι κάτι άλλο. Αυτό είναι κάτι γενικότερο από αυτό που συζητάμε. Κατά τη γνώμη μου αυτή είναι η ουσία του μαθήματος: Να μη βάζεις τη μηχανή να κάνει διαφορετικά από αυτά που κάνει ο άνθρωπος με το χέρι. Στο εισαγωγικό επίπεδο που είναι το μάθημα δε ζητάμε από το μαθητή να ανακαλύψει αλγόριθμο δηλαδή να λύσει πρόβλημα που δεν το λύνει με το χέρι. Του δίνουμε πρόβλημα που λύνει με το χέρι και ζητάμε να γράψει τα βήματα που κάνει. Δηλαδή θα πρέπει να "μιλήσει" ας πούμε με τον εαυτό του και να εντοπίσει ποια είναι τα βήματα που εκτελεί μηχανικά. ΑΥτά τα βήματα που εκτελεί μηχανικά θα πρέπει να τα καταγράψει σε... ψευδογλώσσα. 

Δηλαδή για μένα η σύγκριση είναι μεταξύ των 2 κωδίκων:

π<- 0
Διάβασε μήνυμα
Όσο μήνυμα <> «τέλος» επανάλαβε
   π<-π+1
   Διάβασε μήνυμα
Τέλος_επανάληψης

και

π<- 0
Διάβασε μήνυμα
Αν μήνυμα <> «τέλος» τότε
   Αρχή_επανάληψης
      π<-π+1
      Διάβασε μήνυμα
   Μέχρις_ότου μήνυμα = «τέλος»
Τέλος_αν

Εδώ την Αν έξω από τη μέχρις_ότου δεν μπορείς να τη γλιτώσεις γιατί μπορεί να μπει κατευθείαν η λέξη «τέλος».

Τα κριτήρια που βάζω εγώ είναι τα εξής:
Πρώτον να κάνει τα λιγότερα δυνατά βήματα
Δεύτερον (αν είναι ίδια τότε) να έχει τις λιγότερες γραμμές κώδικα. 

Οι 2 παραπάνω κώδικες κάνουν τα ίδια ακριβώς πράγματα που είναι ίδια με αυτά που θα έκανε ο άνθρωπος. Μεταξύ τους προτιμώ την Όσο γιατί είναι λιγότερες γραμμές κώδικα. Είναι κάπως άκομψο το να βάλεις τη Μέχρις_ότου μέσα στην Αν

Αθανάσιος Πέρδος

Παράθεση
Για μένα είναι σημαντικό να βάλεις τη μηχανή να κάνει αυτό που κάνει ο άνθρωπος με το χέρι. Ο άνθρωπος δε θα βρισκόταν στη μέτρησή του ένα βήμα μπροστά από το πλήθος έτσι ώστε να χρειαστεί να το  αφαιρέσει μετά.
Καταρχήν δεν βρίσκεται ένα βήμα μπροστά. Τα μηνύματα που στέλνονται είναι π αλλά χρεώνονται π - 1. Είναι θέμα θεώρησης λοιπόν. Εξάλλου αν έβαζες μήνυμα για την είσοδο θα έλεγες αρχικά "Δώσε το πρώτο μήνυμα" είτε είναι το "Τέλος" είτε όχι.

Αν και νομίζω ότι η συζήτηση είναι πια ενδιαφέρουσα μόνο για εμάς, παρατηρώ ότι στο σκεπτικό σου μπαίνουν κάθε φορά και κάποια κριτήρια παραπάνω. Νομίζω ότι κατάλαβα τι εννοείς και κατά βάση σε θεωρητικό επίπεδο πέρα από το πλαίσιο του μαθήματος δεν θα διαφωνήσω. Υπάρχει ένα πολύ μεγάλο αλλά. Η μηχανή και ο άνθρωπος δεν κάνουν τα ίδια ακριβώς πράγματα. Με βάση την υλοποίηση που προτείνεις, ο κώδικας που θα ταίριαζε σε μηχανή θα ήταν της ακόλουθης μορφής:

1. π <- 0
2. Διάβασε μήνυμα
3. Αν μήνυμα = "Τέλος" τότε πήγαινε στο 6
4. π <- π + 1
5. πήγαινε στο 2
6. Αν π = 0 τότε ...
7. ....

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

gpapargi

Παράθεση από: aperdos στις 30 Νοε 2011, 11:56:30 ΠΜ
Επίσης πιστεύω ότι δεν θα υπάρξει κάποιος να λάβει υπόψη του σε βαθμολογία τα κριτήρια που αναφέρεις. Θεωρώ λοιπόν ότι η ουσία του μαθήματος είναι οι μαθητές να έχουν κατανοήσει τη λειτουργία των εργαλείων που τους δίνονται και να αναπτύξουν αλγόριθμο που δίνει σωστή λύση στο πρόβλημα και όχι να ψάχνουν ποιος αλγόριθμος έχει μία ή δύο λιγότερες  εντολές.

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

Παράθεση από: aperdos στις 30 Νοε 2011, 11:56:30 ΠΜ
Καταρχήν δεν βρίσκεται ένα βήμα μπροστά. Τα μηνύματα που στέλνονται είναι π αλλά χρεώνονται π - 1. Είναι θέμα θεώρησης λοιπόν. Εξάλλου αν έβαζες μήνυμα για την είσοδο θα έλεγες αρχικά "Δώσε το πρώτο μήνυμα" είτε είναι το "Τέλος" είτε όχι.

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

Παράθεση από: aperdos στις 30 Νοε 2011, 11:56:30 ΠΜ
Αν και νομίζω ότι η συζήτηση είναι πια ενδιαφέρουσα μόνο για εμάς, παρατηρώ ότι στο σκεπτικό σου μπαίνουν κάθε φορά και κάποια κριτήρια παραπάνω.

Όχι, δεν είναι έτσι γιατί μόνο στο τελευταίο μου μήνυμα ανέφερα τα κριτήρια. Στα άλλα απλά ανέφερα το λόγο που διαφωνώ.

Παράθεση από: aperdos στις 30 Νοε 2011, 11:56:30 ΠΜ
Υπάρχει ένα πολύ μεγάλο αλλά. Η μηχανή και ο άνθρωπος δεν κάνουν τα ίδια ακριβώς πράγματα. Με βάση την υλοποίηση που προτείνεις, ο κώδικας που θα ταίριαζε σε μηχανή θα ήταν της ακόλουθης μορφής:

1. π <- 0
2. Διάβασε μήνυμα
3. Αν μήνυμα = "Τέλος" τότε πήγαινε στο 6
4. π <- π + 1
5. πήγαινε στο 2
6. Αν π = 0 τότε ...
7. ....

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

Πχ στο κομμάτι που αναφέρεις γίνεται στο βήμα 3 έλεγχος αν το μήνυμα είναι «τέλος» και αν είναι ελέγχεις αν το π είναι 0 κλπ. Το ίδιο ακριβώς γίνεται είτε με τη goto είτε με τους άλλους κώδικες. Αυτό που γίνεται είναι η ακριβής ενέργεια (αυτό εγώ λέω αλγόριθμο). Το αν θα το κάνεις με goto ή με Όσο είναι απλά θέμα κωδικοποίησης.

Συνεχίζω στο επόμενο μήνυμα γιατί είναι κάπως ανεξάρτητο το θέμα

gpapargi

Να γίνω πιο σαφής και να εξηγήσω και τον τρόπο που δουλεύω εγώ.

Ξεχνάω για λίγο τις συγκεκριμένες εντολές που έχει το περιβάλλον μου και  καταγράφω τα ακριβή βήματα που θα εκτελέσει όποιος εκτελεί τον αλγόριθμο (στέκομαι μόνο σε αυτά που επαναλαμβάνονται). Αυτά είναι:

Διαβάζω μήνυμα
Ελέγχω αν το μήνυμα είναι «τέλος»
Αυξάνω το πλήθος
-----------------------------------
Διαβάζω μήνυμα
Ελέγχω αν το μήνυμα είναι «τέλος»
Αυξάνω το πλήθος
----------------------------------
Διαβάζω μήνυμα
Ελέγχω αν το μήνυμα είναι «τέλος»
Αυξάνω το πλήθος
-----------------------------------------

Κλπ

Τα παραπάνω είναι οι ενέργειες που θα εκτελεστούν από αυτόν που εκτελεί τον αλγόριθμο ανεξάρτητα από Όσο, μέχρις_ότου, goto κλπ. Αν πας με το χέρι να εκτελέσεις τον αλγόριθμο αυτά τα βήματα θα κάνεις, ανεξάρτητα από εντολές. Είμαστε σε πιο κάτω (θεμελιώδες) επίπεδο από τη γλώσσα. Είμαστε σε επίπεδο ενεργειών. Αυτό εγώ αποκαλώ αλγόριθμο.

Τα βήματα τα έχω γκρουπάρει ανά μήνυμα.
Το πρόβλημα είναι το εξής:

Οι εντολές επανάληψης που έχω στη διάθεσή μου στο συγκεκριμένο περιβάλλον είτε ξεκινάνε με έλεγχο (Όσο) είτε τελειώνουν με έλεγχο (μέχρις_ότου). Αντίθετα το γκρουπάρισμα που έχω κάνει ούτε ξεκινάει ούτε τελειώνει με έλεγχο. Η λύση είναι η εξής: θα αλλάξω το γκουπάρισμα έτσι ώστε είτε να αρχίζω είτε να τελειώνω με έλεγχο.

Διαβάζω μήνυμα
------------------------------------------
Ελέγχω αν το μήνυμα είναι «τέλος»
Αυξάνω το πλήθος
Διαβάζω μήνυμα
--------------------------------------------------
Ελέγχω αν το μήνυμα είναι «τέλος»
Αυξάνω το πλήθος
Διαβάζω μήνυμα
-------------------------------------------------

Κλπ

Πρόσεξε πως ότι γκρουπάρισμα και να κάνω, τα βήματα που θα εκτελέσω είναι τα ίδια. Έχω όμως ένα πλεονέκτημα: Τώρα ξεκινάω με έλεγχο. Οπότε αυτό μπορεί να απεικονιστεί με μια Όσο. Δηλαδή

Διάβασε μήνυμα
Όσο μήνυμα <> «τέλος» επανάλαβε
   π<-π+1
   Διάβασε μήνυμα
Τέλος_επανάληψης

Δηλαδή βρήκα ένα παράθυρο που να έχει όλα τα διαφορετικά βήματα και να ξεκινάει με έλεγχο. Επειδή δεν πρέπει να παραλείψω κανένα βήμα βγαίνει το πρώτο «Διάβασε μήνυμα» έξω.

Αν ήθελα μπορούσα να κάνω ένα κλικ παρακάτω και να γκουπάρω έτσι ώστε να τελειώνω με έλεγχο

Διαβάζω μήνυμα
Ελέγχω αν το μήνυμα είναι «τέλος»
-----------------------------------------
Αυξάνω το πλήθος
Διαβάζω μήνυμα
Ελέγχω αν το μήνυμα είναι «τέλος»
------------------------------------------
Αυξάνω το πλήθος
Διαβάζω μήνυμα
Ελέγχω αν το μήνυμα είναι «τέλος»
-----------------------------------------
Αυξάνω το πλήθος
κλπ

Αυτό το γκρουπάρισμα αντιστοιχεί σε μέχρις_ότου

Διάβασε μήνυμα
Αν μήνυμα <> «τέλος» τότε
   Αρχή_επανάληψης
      π<-π+1
      Διάβασε μήνυμα
   Μέχρις_ότου μήνυμα = «τέλος»
Τέλος_αν

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

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

Εφόσον γίνει κατανοητό ότι με οποιαδήποτε εντολή και να πας, τα ίδια πράγματα κάνεις και απλώς αλλάζει η κωδικοποίηση βλέπουμε και τι ακριβώς εννοούμε (ή πρέπει να εννοούμε) όταν ζητάμε μετατροπή από τη μια εντολή στην άλλη:
Ζητάμε να γίνονται τα ίδια ακριβώς πράγματα και με την ίδια ακριβώς σειρά.
Οτιδήποτε άλλο οδηγεί σε ασυνέπειες.
Πχ  αν πούμε ότι ζητάμε την ίδια έξοδο για την ίδια είσοδο θα μπορούσα εγώ να μετατρέψω μια σειριακή αναζήτηση σε δυαδική με μέχρις_ότου. Την ίδια έξοδο θα είχα αλλά δε θα έκανα τα ίδια πράγματα και σίγουρα δε θα έκανα αυτό που ήθελε η άσκηση.