Μετατροπή Μέχρις_ότου σε Όσο

Ξεκίνησε από vistrian, 29 Ιαν 2017, 07:41:55 ΜΜ

« προηγούμενο - επόμενο »

vistrian

Καλησπέρα

Με ρωτάει ένας μαθητής ότι θέλει να κάνει έλεγχο δεδομένων για να διαβάζει έναν αριθμό ο οποίος θα πρέπει να είναι θετικός ακέραιος άρτιος αριθμός και μου έγραψε τον παρακάτω κώδικα

Αρχή_επανάληψης
Διάβασε αρ
Μέχρις_ότου αρ >0 και αρ mod 2 = 0

Έπειτα μου είπε ότι ο τελεστής DIV ή MOD θα πρέπει να είναι θετικός για να μπορεί να εκτελεστεί η εντολή αρ MOD 2 = 0 άρα στον παραπάνω κώδικα κατά την είσοδο ενός αρνητικού αριθμού θα έχουμε το εξής: ο έλεγχος αρ>0 θα βγάλει ΨΕΥΔΗΣ ενώ ο έλεγχος αρ MOD 2 = 0 θα παραβιάζει το κριτήριο της καθοριστικότητας. Ως λύση έδωσε την παρακάτω

Αρχή_επανάληψης
Διάβασε αρ
Μέχρις_ότου αρ >0 και Α_Τ(αρ) mod 2 = 0

Και έπειτα χωρίς την χρήση της Συνάρτησης Α_Τ()

Αρχή_επανάληψης
         Αρχή_επανάληψης
               Διάβασε
αρ
     Μέχρις_ότου αρ >0
Μέχρις_ότου αρ mod 2 = 0 

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

φ ← Ψευδής
Όσο φ = Ψευδής επανάλαβε
  Εμφάνισε "Δώσε αριθμό"
  Διάβασε αρ
Όσο αρ ≤ 0 επανάλαβε
    Εμφάνισε "Δώσε αριθμό"
    Διάβασε αρ
Τέλος_επανάληψης
Αν αρ mod 2 = 0 τότε
    φ ← Αληθής
  Τέλος_αν
Τέλος_επανάληψης
Εμφάνισε
αρ 

σχόλια – παρατηρήσεις  ::)
VR in Computing

ilias_skg

Και πάλι λάθος είναι τα τμήματα προγράμματος, διότι δεν ελέγχεις κάπου ότι ο αριθμός είναι ακέραιος, άλλωστε τα div mod ισχύουν μόνο για θετικούς ακέραιους αριθμούς όπως είπε ο μαθητής σου. Αν για παράδειγμα σου δώσει τον αριθμό 1.5 τι θα κάνει το πρόγραμμα;

evry

Στους τελεστές div/mod δεν παραβιάζεται το κριτήριο της καθοριστικότητας αν είναι αρνητικοί. Το κριτήριο αυτό παραβιάζεται αν δεν είναι ακέραιοι.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

vistrian

Παράθεση από: ilias_skg στις 30 Ιαν 2017, 09:27:12 ΠΜ
Και πάλι λάθος είναι τα τμήματα προγράμματος, διότι δεν ελέγχεις κάπου ότι ο αριθμός είναι ακέραιος, άλλωστε τα div mod ισχύουν μόνο για θετικούς ακέραιους αριθμούς όπως είπε ο μαθητής σου. Αν για παράδειγμα σου δώσει τον αριθμό 1.5 τι θα κάνει το πρόγραμμα;

κατά τη δήλωση της μεταβλητής έχει δηλωθεί ως ακέραια
VR in Computing

vistrian

Παράθεση από: evry στις 30 Ιαν 2017, 10:06:39 ΠΜ
Στους τελεστές div/mod δεν παραβιάζεται το κριτήριο της καθοριστικότητας αν είναι αρνητικοί. Το κριτήριο αυτό παραβιάζεται αν δεν είναι ακέραιοι.

και αν είναι αρνητικός τότε τι γίνεται; δεν παραβιάζεται κανένα κριτήριο; αφού σύμφωνα με την οδηγία πρέπει να είναι θετικός ο αριθμός
VR in Computing

evry

Η οδηγία λέει ότι δεν πρέπει τα παιδιά να χρησιμοποιούν αρνητικούς αριθμούς με div και mod για παιδαγωγικούς λόγους. π.χ. αν το δοκιμάσεις στον διερμηνευτή δουλεύει μια χαρά. Οι τελεστές χρησιμοποιούνται κανονικά, απλά δεν είναι στην ύλη μας.
πιο συγκεκριμένα:
Παράθεση
Η αντιμετώπιση αυτών των περιπτώσεων από την ΓΛΩΣΣΑ
ξεφεύγει από το σκοπό του σχολικού βιβλίου και γι' αυτό οι δύο τελεστέοι πρέπει να
θεωρούνται πάντοτε θετικοί ακέραιοι. Επομένως, ασκήσεις ή προβλήματα που
δίνονται στους μαθητές για επεξεργασία και απαιτείται η χρήση της MOD πρέπει
πάντοτε να αναφέρονται σε θετικούς ακέραιους αριθμούς.

What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gbougioukas

Παράθεση από: evry στις 30 Ιαν 2017, 10:06:39 ΠΜ
Στους τελεστές div/mod δεν παραβιάζεται το κριτήριο της καθοριστικότητας αν είναι αρνητικοί. Το κριτήριο αυτό παραβιάζεται αν δεν είναι ακέραιοι.

Ο ορισμός των ιδιοτήτων του αλγορίθμου στο βιβλίο της ΑΕΠΠ είναι από το βιβλίο του Donald E. Knuth "The Art of Computer Programming". Ο συγγραφέας εκεί δίνει το παράδειγμα του αλγόριθμου Ε (του Ευκλείδη) και αναφέρει ρητά ότι παραβιάζεται το κριτήριο της καθοριστικότητας αν τα τελούμενα των τελεστών MOD και DIV δεν είναι θετικά (για την ακρίβεια, βέβαια, αυτό αφορά μόνο τον διαιρέτη ενώ για τον διαιρετέο ισχύει το μη-αρνητικό):

"In Algorithm E, the criterion of definiteness as applied to step E1 means that the reader is supposed to understand exactly what it means to divide m by n and what the remainder is. In actual fact, there is no universal agreement about what this means if m and n are not positive integers; what is the remainder of −8 divided by −π? What is the remainder of 59/13 divided by zero? Therefore the criterion of definiteness means we must make sure that the values of m and n are always positive integers whenever step E1 is to be executed. This is initially true, by hypothesis; and after step E1, r is a nonnegative integer that must be nonzero if we get to step E3. So m and n are indeed positive integers as required."
Art of Computer Programming, The: Volume 1: Fundamental Algorithms, 3rd Edition

Με άλλα λόγια αν ο διερμηνευτής ήταν σύμφωνος με την οδηγία του υπουργείου που αναφέρει ο vistrian θα έπρεπε να αντιμετωπίζει τα αρνητικά τελούμενα των MOD και DIV όπως ακριβώς την διαίρεση με το 0. Εφιστάται η δέουσα προσοχή, διότι οι μαθητές θα δώσουν εξετάσεις με βάση το βιβλίο και τις οδηγίες του υπουργείου και όχι με βάση τον διερμηνευτή, την γλωσσομάθεια ή την java.
Γιώργος Μπουγιούκας
Computer Science (BSc), Bioinformatics & Neuroinformatics (MSc)
https://gbougioukas.wordpress.com/
https://apothesis.eap.gr/handle/repo/54953