ΤΕΣΤ (ΑΣΚΗΣΕΙΣ) ONLINE
98 Tests / Διαγωνίσματα

Κεφάλαιο 19.5 – Σελίδα 125-130 – ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ Γ΄ ΛΥΚΕΙΟΥ – Απαντήσεις – Λύσεις

Εκσφαλμάτωση — Δομές Επανάληψης

Παράδειγμα 6 (σελ. 125)

Στο πρόγραμμα «Ανάγνωση_βαθμολογίας» (κώδικας σε ΓΛΩΣΣΑ [5.11]), αν δοθεί η τιμή -9 από το πληκτρολόγιο τι θα εμφανιστεί στην οθόνη; Εντοπίστε το λογικό λάθος και προτείνετε διόρθωση.

Σκέψη / Μεθοδολογία: Εξετάζουμε αν η σύνθετη συνθήκη «Βαθμός<0 ΚΑΙ Βαθμός>20» μπορεί ποτέ να είναι αληθής για οποιαδήποτε τιμή.

Λύση:

Δοκιμαστική εκτέλεση με -9: η συνθήκη «Βαθμός<0 ΚΑΙ Βαθμός>20» είναι ψευδής (αφού -9 δεν είναι > 20), άρα ο βρόχος δεν εκτελείται καθόλου. Το πρόγραμμα εμφανίζει απευθείας «Καταχωρήθηκε ο βαθμός της εικοσάβαθμης κλίμακας -9», παρότι -9 δεν είναι αποδεκτός βαθμός. Παρατηρούμε ότι κανένας αριθμός δεν μπορεί ταυτόχρονα να είναι <0 ΚΑΙ >20 — η συνθήκη είναι αδύνατο να αληθεύσει ποτέ.

Απάντηση: Θα εμφανιστεί «Καταχωρήθηκε ο βαθμός της εικοσάβαθμης κλίμακας -9» — λανθασμένο αποτέλεσμα, αφού ο βαθμός -9 δεν είναι αποδεκτός. Το λάθος βρίσκεται στη συνθήκη «Βαθμός<0 ΚΑΙ Βαθμός>20», που δεν αληθεύει ποτέ για καμία τιμή (κανένας αριθμός δεν είναι ταυτόχρονα μικρότερος του 0 και μεγαλύτερος του 20), οπότε ο βρόχος επανάληψης δεν εκτελείται ποτέ ανεξαρτήτως εισόδου. Η διόρθωση είναι η αντικατάσταση του λογικού τελεστή ΚΑΙ με Η: «ΟΣΟ Βαθμός<0 Η Βαθμός>20 ΕΠΑΝΑΛΑΒΕ».

Πρόσεξε:

  • Πριν χρησιμοποιήσουμε μια σύνθετη συνθήκη με ΚΑΙ/Η, πρέπει να ελέγξουμε αν είναι λογικά δυνατό να αληθεύσει για κάποια τιμή.

Παράδειγμα 7 (σελ. 127)

Στο πρόγραμμα «Γινόμενο_μη_μηδενικών_αριθμών» (κώδικας σε ΓΛΩΣΣΑ [5.12]), αν δοθούν από το πληκτρολόγιο οι τιμές 4, 3 και 0, ποια θα είναι η τιμή της μεταβλητής «Γινόμενο» που θα εμφανιστεί; Εντοπίστε το λογικό λάθος και προτείνετε διόρθωση.

Σκέψη / Μεθοδολογία: Παρακολουθούμε τη ροή εκτέλεσης της δομής ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ...ΜΕΧΡΙΣ_ΟΤΟΥ, θυμίζοντας ότι σε αυτή τη δομή οι εντολές εκτελούνται πριν ελεγχθεί η συνθήκη τερματισμού.

Λύση:

Εκτέλεση: Γινόμενο=1 → διαβάζει 4, Γινόμενο=4 → διαβάζει 3, Γινόμενο=12 → διαβάζει 0, Γινόμενο=12×0=0 → η συνθήκη Χ=0 αληθεύει, τερματίζει. Το πρόγραμμα εμφανίζει Γινόμενο=0, ενώ το αναμενόμενο (αγνοώντας το μηδέν-σήμα λήξης) είναι 4×3=12. Το λάθος οφείλεται στο ότι ο πολλαπλασιασμός γίνεται πριν ελεγχθεί αν η τιμή είναι το σήμα λήξης (0).

Απάντηση: Θα εμφανιστεί Γινόμενο=0 (λανθασμένο· το αναμενόμενο είναι 12). Το λογικό λάθος οφείλεται στη δομή ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ...ΜΕΧΡΙΣ_ΟΤΟΥ, που εκτελεί τον πολλαπλασιασμό πριν ελέγξει αν η τελευταία τιμή είναι το σήμα λήξης (0), οπότε το 0 συμπεριλαμβάνεται πάντα στο γινόμενο. Διόρθωση: είτε μετατροπή σε ΟΣΟ Χ<>0 ΕΠΑΝΑΛΑΒΕ με τον έλεγχο πριν τον πολλαπλασιασμό, είτε παραμονή στο ΜΕΧΡΙΣ_ΟΤΟΥ αλλά με εμφωλευμένη δομή ΑΝ Χ<>0 ΤΟΤΕ γύρω από την εντολή Γινόμενο <- Χ*Γινόμενο.

Πρόσεξε:

  • Η απλή αλλαγή του τύπου δομής επανάληψης δεν αρκεί από μόνη της — χρειάζεται και η σωστή σειρά ανάγνωσης/υπολογισμού μέσα στον βρόχο.
  • Το «στοιχείο-σήμα λήξης» (εδώ το 0) δεν πρέπει ποτέ να συμμετέχει στον τελικό υπολογισμό.

Δραστηριότητα 3 (σελ. 129)

Στο πρόγραμμα «ΜΟ_Βαθμολογίας» (κώδικας σε ΓΛΩΣΣΑ [5.16]), εκτελέστε το πρόγραμμα με είσοδο 15, 16, 17, -1, καταγράφοντας τις τιμές των μεταβλητών σε πίνακα τιμών (Επανάληψη/Άθροισμα/Πλήθος/Βαθμός/ΜΟ/Οθόνη). Ποια λάθη εντοπίζετε; Προτείνετε διορθώσεις.

Σκέψη / Μεθοδολογία: Παρακολουθούμε προσεκτικά ποιες μεταβλητές ενημερώνονται μέσα στον βρόχο ΟΣΟ...ΕΠΑΝΑΛΑΒΕ, ιδίως αν η μεταβλητή Πλήθος αυξάνεται κάπου.

Λύση:

Πίνακας τιμών: πριν τον βρόχο διαβάζεται Βαθμός=15 (Άθροισμα=0, Πλήθος=0). Στην 1η επανάληψη (Βαθμός=15≥0 αληθής) διαβάζεται νέος Βαθμός=16, Άθροισμα<-0+16=16, Πλήθος παραμένει 0. Στη 2η (Βαθμός=16≥0) διαβάζεται Βαθμός=17, Άθροισμα<-16+17=33, Πλήθος=0. Στην 3η (Βαθμός=17≥0) διαβάζεται Βαθμός=-1, Άθροισμα<-33+(-1)=32, Πλήθος=0. Η συνθήκη -1≥0 είναι ψευδής, ο βρόχος τερματίζει. Στο τέλος: ΜΟ <- Άθροισμα/Πλήθος = 32/0 — διαίρεση με το μηδέν, αντικανονικός τερματισμός. Επιπλέον, ο πρώτος βαθμός (15) που διαβάστηκε πριν τον βρόχο δεν προστέθηκε ποτέ στο Άθροισμα, ενώ αντίθετα ο -1 (το σήμα λήξης) προστέθηκε λανθασμένα.

Απάντηση: Δύο λογικά λάθη εντοπίζονται: (1) Η μεταβλητή Πλήθος αρχικοποιείται στο 0 αλλά ποτέ δεν αυξάνεται μέσα στον βρόχο, οπότε στο τέλος παραμένει 0 και η διαίρεση ΜΟ <- Άθροισμα/Πλήθος προκαλεί αντικανονικό τερματισμό λόγω διαίρεσης με το μηδέν. (2) Ο πρώτος βαθμός που διαβάζεται πριν τον βρόχο δεν προστίθεται ποτέ στο Άθροισμα (ο βρόχος προσθέτει μόνο τους βαθμούς που διαβάζονται μέσα στον βρόχο, δηλαδή έναν λιγότερο), ενώ αντίθετα το τελικό σήμα λήξης (-1) προστίθεται λανθασμένα στο Άθροισμα πριν ελεγχθεί η συνθήκη. Διόρθωση: προσθήκη «Πλήθος <- Πλήθος + 1» μέσα στον βρόχο (πριν την ανάγνωση του επόμενου βαθμού), αναδιάταξη ώστε ο πρώτος βαθμός να προσμετράται σωστά, και έλεγχος «ΑΝ Πλήθος = 0» πριν τη διαίρεση.

Πρόσεξε:

  • Μια μεταβλητή-μετρητής που αρχικοποιείται αλλά ποτέ δεν ενημερώνεται μέσα στον βρόχο είναι από τα πιο συνηθισμένα λογικά λάθη σε δομές επανάληψης.
  • Πρέπει πάντα να ελέγχεται αν το «σήμα λήξης» της εισόδου συμμετέχει λανθασμένα σε έναν υπολογισμό.