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

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

Ασκήσεις

Παράδειγμα 9 (σελ. 134)

Να αναπτύξετε πρόγραμμα σε ΓΛΩΣΣΑ που να διαβάζει τα μηνιαία έσοδα και τα μηνιαία έξοδα μιας επιχείρησης για το πρώτο εξάμηνο του έτους και να τα καταχωρεί σε πίνακες. Μέσω συνάρτησης να υπολογίζει το πλήθος των μηνών που είχαν ζημιά (έσοδα < έξοδα). Τέλος, να εμφανίζει το πλήθος των μηνών που είχαν ζημιά. Δίνεται το πρόγραμμα (κώδικας [5.19]). i) Εκτελέστε το πρόγραμμα για τις τιμές εισόδου των πινάκων 5.8 και 5.9 και συμπληρώστε τον πίνακα τιμών 5.10. Ποια τιμή θα πάρει η μεταβλητή «Μήνες_με_ζημία» μετά την ολοκλήρωση; Με βάση την εκφώνηση πόσοι μήνες είχαν πραγματικά ζημιά; ii) Ποια λάθη εντοπίσατε; Προτείνετε διορθώσεις.

Σκέψη / Μεθοδολογία: Παρακολουθούμε την κλήση της συνάρτησης προσεκτικά — ποιο όρισμα αντιστοιχίζεται σε ποια παράμετρο — γιατί η συνάρτηση 'δουλεύει' σωστά ως κώδικας, αλλά ενδέχεται να μετράει διαφορετικό μέγεθος από αυτό που ζητά η εκφώνηση.

Λύση:

  • Η κλήση 'Υπολογισμός(ΕΣΟΔΑ, ΕΞΟΔΑ)' αντιστοιχίζει ΕΣΟΔΑ→Πίνακας1, ΕΞΟΔΑ→Πίνακας2.
  • Η συνθήκη μέσα στη συνάρτηση είναι 'Πίνακας2[I] < Πίνακας1[I]', δηλαδή 'ΕΞΟΔΑ[I] < ΕΣΟΔΑ[I]' — αυτό μετράει μήνες με ΚΕΡΔΟΣ, όχι ζημία.
  • Εκτελώντας με τα δεδομένα (Έσοδα: 2000,2000,2300,2500,1800,2100 / Έξοδα: 2000,2200,2300,2100,1500,2000), η συνθήκη Έξοδα<Έσοδα είναι αληθής στους μήνες 4,5,6 → Πλήθος=3.
  • Ελέγχοντας τα ίδια δεδομένα ως προς την πραγματική ζημία (Έσοδα<Έξοδα): μόνο ο 2ος μήνας έχει 2000<2200 — άρα 1 μήνας είχε πραγματική ζημιά, όχι 3.

Απάντηση: i) Η μεταβλητή 'Μήνες_με_ζημία' παίρνει τελικά την τιμή 3. Όμως με βάση την εκφώνηση (ζημία = έσοδα < έξοδα) μόνο ο 2ος μήνας είχε πραγματικά ζημιά (2000<2200) — δηλαδή 1 μήνας, όχι 3. ii) Το λάθος βρίσκεται στην κλήση της συνάρτησης (γραμμή 12): τα ορίσματα ΕΣΟΔΑ και ΕΞΟΔΑ δόθηκαν με λάθος σειρά, με αποτέλεσμα η συνάρτηση να μετρά μήνες κέρδους αντί για μήνες ζημίας. Διόρθωση (οποιαδήποτε αρκεί): (α) αλλαγή της κλήσης σε 'Υπολογισμός(ΕΞΟΔΑ, ΕΣΟΔΑ)', (β) αλλαγή της δήλωσης παραμέτρων σε 'ΣΥΝΑΡΤΗΣΗ Υπολογισμός(Πίνακας2, Πίνακας1)', ή (γ) αλλαγή της συνθήκης σε 'ΑΝ Πίνακας1[I] < Πίνακας2[I] ΤΟΤΕ'.

Πρόσεξε:

  • Το σφάλμα δεν βρίσκεται μέσα στο σώμα της συνάρτησης — ο κώδικάς της είναι εσωτερικά σωστός. Το πρόβλημα είναι η σειρά ορισμάτων κατά την ΚΛΗΣΗ, κάτι που εύκολα διαφεύγει σε έλεγχο κώδικα που εξετάζει μόνο τη συνάρτηση μεμονωμένα.

Δραστηριότητα 5 (σελ. 137)

Να αναπτύξετε πρόγραμμα σε ΓΛΩΣΣΑ που να διαβάζει έναν ακέραιο αριθμό ν, να υπολογίζει μέσω συνάρτησης το παραγοντικό του (ν! = 1×2×...×ν) και να το εμφανίζει. Δίνεται το πρόγραμμα (κώδικας [5.20]). i) Εκτελέστε το πρόγραμμα για την τιμή εισόδου 4 και καταγράψτε τις τιμές των μεταβλητών κατά την εκτέλεση της συνάρτησης στον πίνακα τιμών 5.12. ii) Ποια λάθη εντοπίσατε; Προτείνετε διορθώσεις.

Σκέψη / Μεθοδολογία: Παρακολουθούμε την αρχική τιμή του συσσωρευτή γινομένου Π και τη συγκρίνουμε με το ουδέτερο στοιχείο του πολλαπλασιασμού.

Λύση:

  • Η μεταβλητή Π αρχικοποιείται στο 0 (γραμμή 15).
  • Σε κάθε επανάληψη εκτελείται 'Π <- ΠΙ' — αφού Π=0 από την αρχή, το γινόμενο παραμένει 0 σε κάθε βήμα (01=0, 02=0, 03=0, 0*4=0).
  • Η συνάρτηση επιστρέφει τελικά Π=0, οπότε το πρόγραμμα εμφανίζει 'Παραγοντικό=0' αντί για το σωστό 24.

Απάντηση: i) Για Ν=4, η μεταβλητή Π παραμένει 0 σε όλες τις επαναλήψεις (01=0, 02=0, 03=0, 04=0), ενώ ο μετρητής Ι παίρνει διαδοχικά τις τιμές 1,2,3,4. Η συνάρτηση επιστρέφει Π=0. ii) Το λάθος είναι η αρχικοποίηση του συσσωρευτή γινομένου στο 0 (γραμμή 15: 'Π <- 0'), ενώ το ουδέτερο στοιχείο του πολλαπλασιασμού είναι το 1. Διόρθωση: η γραμμή 15 πρέπει να γίνει 'Π <- 1'. Με αυτή τη διόρθωση, η εκτέλεση δίνει Π=1(αρχικό)→11=1→12=2→23=6→64=24, δηλαδή σωστά 4!=24.

Πρόσεξε:

  • Η αρχικοποίηση συσσωρευτή πρέπει να ταιριάζει με την πράξη: 0 για άθροισμα, 1 για γινόμενο — μια λανθασμένη αρχικοποίηση 'μηδενίζει' κάθε επόμενο γινόμενο, όσο σωστός κι αν είναι ο υπόλοιπος βρόχος.