Αποστολέας Θέμα: Πότε θα γίνει χρήση της ΟΣΟ και πότε της Μέχρις_ότου  (Αναγνώστηκε 2939 φορές)

gpapargi

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2457
  • I 'm not young enough to know everything
Απ: Πότε θα γίνει χρήση της ΟΣΟ και πότε της Μέχρις_ότου
« Απάντηση #15 στις: 01 Δεκ 2011, 03:12:57 μμ »
Να γίνω πιο σαφής και να εξηγήσω και τον τρόπο που δουλεύω εγώ.

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

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

Κλπ

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

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

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

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

Κλπ

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

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

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

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

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

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

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

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

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

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