Στο πρόγραμμα «Αντίτιμο_εισιτηρίου» (κώδικας σε ΓΛΩΣΣΑ [5.7]), εντοπίστε το λογικό λάθος χρησιμοποιώντας σενάρια ελέγχου με ηλικία 17, 18 και 19 έτη, και προτείνετε διόρθωση.
Σκέψη / Μεθοδολογία: Δοκιμάζουμε τιμές ακριβώς στο όριο της συνθήκης (18) καθώς και μία τιμή πριν και μία μετά, και συγκρίνουμε το αναμενόμενο αποτέλεσμα (βάσει εκφώνησης) με αυτό που παράγει το πρόγραμμα.
Λύση:
Για ηλικία=17: η συνθήκη ηλικία>18 είναι ψευδής, το πρόγραμμα δίνει Αντίτιμο=0,5 — σωστό. Για ηλικία=18: η συνθήκη ηλικία>18 είναι ψευδής, το πρόγραμμα δίνει Αντίτιμο=0,5, ενώ η εκφώνηση λέει ότι όποιος έχει συμπληρώσει τα 18 πληρώνει κανονικό (1) — λάθος. Για ηλικία=19: η συνθήκη είναι αληθής, Αντίτιμο=1 — σωστό. Το λάθος εντοπίζεται στη συνθήκη: πρέπει να είναι ηλικία>=18 και όχι ηλικία>18.
Απάντηση: Το λογικό λάθος βρίσκεται στη συνθήκη «ΑΝ ηλικία > 18 ΤΟΤΕ», που αποκλείει λανθασμένα την ηλικία 18 από το κανονικό εισιτήριο. Πρέπει να διορθωθεί σε «ΑΝ ηλικία >= 18 ΤΟΤΕ», ώστε όποιος έχει συμπληρώσει ακριβώς τα 18 να πληρώνει κανονικό εισιτήριο, σύμφωνα με την εκφώνηση.
Πρόσεξε:
Στο πρόγραμμα «Χρέωση_ύδρευσης» (κώδικας σε ΓΛΩΣΣΑ [5.8]), δοκιμάστε τα σενάρια κυβικά=-1, 0, 2, 10, 11, 20, 21. Εντοπίστε τα λογικά λάθη και προτείνετε διορθώσεις.
Σκέψη / Μεθοδολογία: Υπολογίζουμε το αναμενόμενο ποσό οφειλής με βάση την κλιμακωτή χρέωση της εκφώνησης (πάγιο 8€ + 0,4€/κυβικό ως τα 10 + 0,5€/κυβικό ως τα 20 + 0,6€/κυβικό πάνω από 20) και το συγκρίνουμε με την πραγματική έξοδο του προγράμματος για κάθε τιμή.
Λύση:
Για κυβικά=-1,0,2,10,11,20 το πρόγραμμα δίνει σωστά αποτελέσματα. Για κυβικά=21 το αναμενόμενο ποσό είναι 8+10×0,4+10×0,5+1×0,6=17,6€, αλλά ο τύπος στο ΑΛΛΙΩΣ υπολογίζει μόνο 10×0,4+10×0,5+(κυβικά-20)×0,6=9,6€ — λείπει το πάγιο μέσα στον τύπο. Επιπλέον, η τελική εντολή εμφάνισης ελέγχει λανθασμένα «ΑΝ κυβικά < 0» αντί να εμφανίζει την οφειλή για κάθε αποδεκτή (μη αρνητική) τιμή.
Απάντηση: Δύο λογικά λάθη εντοπίζονται: (1) Στον κλάδο ΑΛΛΙΩΣ (κυβικά > 20) λείπει το πάγιο 8€ από τον τύπο — η σωστή εντολή είναι «οφειλή <- 8 + 10×0,4 + 10×0,5 + (κυβικά - 20)×0,6». (2) Η τελική εντολή εμφάνισης της οφειλής ελέγχει «ΑΝ κυβικά < 0 ΤΟΤΕ» αντί «ΑΝ κυβικά >= 0 ΤΟΤΕ», με αποτέλεσμα να μην εμφανίζεται ποτέ η οφειλή σε καμία αποδεκτή περίπτωση.
Πρόσεξε:
Στο πρόγραμμα «Υπολογισμός_αντιτίμου_εισιτηρίου» (κώδικας σε ΓΛΩΣΣΑ [5.10]), εντοπίστε τυχόν λογικά λάθη που οδηγούν σε λανθασμένα αποτελέσματα και προτείνετε διορθώσεις.
Σκέψη / Μεθοδολογία: Συγκρίνουμε τους δύο κλάδους ΑΝ/ΑΛΛΙΩΣ_ΑΝ: στον πρώτο (κατηγορία=1) το αντίτιμο πολλαπλασιάζεται με το πλήθος, ενώ στον δεύτερο (κατηγορία=2) πρέπει να ελέγξουμε αν γίνεται το ίδιο.
Λύση:
Στον κλάδο κατηγορία=1: Αντίτιμο <- πλήθος*Κανονικό_εισιτήριο — σωστό, πολλαπλασιάζει με το πλήθος. Στον κλάδο κατηγορία=2: Αντίτιμο <- Μειωμένο_εισιτήριο — λείπει ο πολλαπλασιασμός με το πλήθος, οπότε το αντίτιμο υπολογίζεται πάντα ως 0,5€ ανεξαρτήτως πλήθους.
Απάντηση: Το λογικό λάθος βρίσκεται στον κλάδο «ΑΛΛΙΩΣ_ΑΝ κατηγορία = 2»: η εντολή «Αντίτιμο <- Μειωμένο_εισιτήριο» δεν πολλαπλασιάζει με το πλήθος των εισιτηρίων, σε αντίθεση με τον πρώτο κλάδο. Η σωστή εντολή είναι «Αντίτιμο <- πλήθος*Μειωμένο_εισιτήριο».
Πρόσεξε:
