Τώρα όσον αφορά το δεύτερο παράδειγμα σαφέστατα αλλάζεις την ουσία της άσκησης. Η άσκηση θέτοντας 500 προϊόντα αρχικά και αγοράζοντας μόνο 10 το μέγιστο ο κάθε πελάτης θέτει ως δεδομένο ότι δεν μπορεί ο πρώτος να τα αγοράσει όλα. Δεν μιλάει για τυχαίους αριθμούς.
Οκ κατάλαβα. Αν θέλουμε τα συγκεκριμένα νούμερα ξέρουμε ότι θα μπει μια φορά οπότε την κάνουμε μέχρις_ότου. Απλά ήθελα να το γράψω στην πιο γενική μορφή που το πλήθος το συνολικό πλήθος και το όριο αγοράς μπορούν να έρχονται και με είσοδο.
υπόλοιπο_προϊόντων <- αρχικό_συνολικό_πλήθος
Πλήθος_πελατών <- 0
Διάβασε πλήθος_αγοράς
Αρχή_επανάληψης
κόστος<- τιμή_μονάδας * πλήθος_αγοράς
Εμφάνισε κόστος
υπόλοιπο_προϊόντων <- υπόλοιπο_προϊόντων – πλήθος_αγοράς
πλήθος_πελατών<- πλήθος πελατών +1
Διάβασε πλήθος_αγοράς
Μέχρις_ότου πλήθος_αγοράς > υπόλοιπο_προϊόντων
Εμφάνισε «Υπάρχουν διαθέσιμα μόνο», υπόλοιπο_προϊόντων, τιμή_μονάδας * υπόλοιπο_προϊόντων
Βέβαια παραβλέπεις ότι αν κάποια στιγμή ένας πελάτης ζητήσει ακριβώς όσα περισσεύουν ο αλγόριθμος πρέπει να τελειώσει και όχι να περιμένει και άλλον πελάτη ώστε να του εμφανίσει ότι υπάρχουν διάθεσιμα 0 και το κόστος αγοράς είναι 0. Νομίζω ότι δεν είναι λογικό αυτό.
Όχι δεν το παρέβλεψα. Απλά είδα ότι έτσι λειτουργεί και ο κώδικας που έγραψες.
Δίνω λοιπόν ακόμη μία εκφώνηση και τη λύση της με τις δύο μορφές.
Ένα τηλεοπτικό κανάλι παρουσιάζει κάθε χρόνο για φιλανθρωπικούς σκοπούς μία εκπομπή στην οποία οι τηλεθεατές στέλνουν μηνύματα κινητού τηλεφώνου που περιέχουν τη λέξη «Μπορώ» για τη συγκέντρωση ενός ποσού. Με ένα μήνυμα ο κάθε τηλεθεατής συνεισφέρει 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 παραπάνω κώδικες κάνουν τα ίδια ακριβώς πράγματα που είναι ίδια με αυτά που θα έκανε ο άνθρωπος. Μεταξύ τους προτιμώ την Όσο γιατί είναι λιγότερες γραμμές κώδικα. Είναι κάπως άκομψο το να βάλεις τη Μέχρις_ότου μέσα στην Αν