Το Στέκι των Πληροφορικών

Γενικό Λύκειο => Αλγοριθμική και Προγραμματισμός => Διερμηνευτής της ΓΛΩΣΣΑΣ => Μήνυμα ξεκίνησε από: droopy στις 17 Νοε 2007, 04:33:48 ΜΜ

Τίτλος: πρόβλημα με την Αν ... αλλιώς_αν
Αποστολή από: droopy στις 17 Νοε 2007, 04:33:48 ΜΜ
προσπαθώ να τρέξω τον παρακάτω αλγόριθμο στην Γλώσσα και δίνοντας ίδια τιμή στην μεταβλητή α   
και στην μεταβλητή β (π.χ το 5) δεν τρέχει σωστά.
Ενώ θα έπρεπε να πηγαίνει στο τελευταίο (αλλιώς_αν α = β) μπαίνει στο (αλλιώς_αν β < α)

εχώ κάνει κάποιο λάθος?  :angel: ή βρήκα κάποιο BUG?  >:D

ΠΡΟΓΡΑΜΜΑ πανω_κατω
 
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: πρ
  ΠΡΑΓΜΑΤΙΚΕΣ: α, β
  ΛΟΓΙΚΕΣ: μαντεψες
 
ΑΡΧΗ
 
  ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
    ΓΡΑΨΕ "ο πρώτος παίκτης να δώσει έναν αριθμό"
    ΔΙΑΒΑΣΕ α
  ΜΕΧΡΙΣ_ΟΤΟΥ α >= 0 ΚΑΙ α <= 100
 
  πρ <- 1
  μαντεψες <- ΨΕΥΔΗΣ
 
  ΟΣΟ πρ <= 10 ΚΑΙ μαντεψες = ΨΕΥΔΗΣ ΕΠΑΝΑΛΑΒΕ
   
    ΓΡΑΨΕ "ποιος είναι ο αριθμός? μάντεψε"
    ΔΙΑΒΑΣΕ β
    ΑΝ β > α ΤΟΤΕ
      ΓΡΑΨΕ "ο μυστικος αριθμος είναι μικρότερος"
      πρ <- πρ + 1
    ΑΛΛΙΩΣ_ΑΝ β < α ΤΟΤΕ
      ΓΡΑΨΕ "ο μυστικος αριθμος είναι μεγαλύτερος"
      πρ <- πρ + 1
    ΑΛΛΙΩΣ_ΑΝ β = α ΤΟΤΕ
    ΓΡΑΨΕ "το βρήκες!!!!!!!"
    ΓΡΑΨΕ "με την ", πρ, " προσπάθεια"
      μαντεψες <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
 
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Τίτλος: Απ: πρόβλημα με την Αν ... αλλιώς_αν
Αποστολή από: sstergou στις 17 Νοε 2007, 05:16:26 ΜΜ
Υποπτεύομαι ότι έχει να κάνει με τον πραγματικό τύπο δεδομένων καθώς άμα δηλώσεις τα α,β ακέραιους τότε το πρόγραμμα δουλεύει σωστά.
Τίτλος: Απ: πρόβλημα με την Αν ... αλλιώς_αν
Αποστολή από: alkisg στις 17 Νοε 2007, 06:23:38 ΜΜ
Bug της release candidate (0.9.2.5), η stable έκδοση (0.91β - λήψη από https://alkisg.mysch.gr/downloads) το τρέχει κανονικά.

Γι' αυτό και δεν τις βγάζω κατευθείαν σαν final, γιατί όλο και κάτι ξεφεύγει... 
Έχει να κάνει με την επιλογή "Στρογγυλοποίηση πραγματικών σε συγκρίσεις στο δεκαδικό", έκανα κάτι αλλαγές και τώρα η ΓΡΑΨΕ 1.2 < 1.2 εμφανίζει ΑΛΗΘΗΣ!!! :-[

Ευχαριστώ, αναμένεται επόμενη release τάχιστα! :)

edit: Έτοιμη (https://alkisg.mysch.gr/steki/index.php?topic=1117.msg7295#msg7295)!

Περισσότερες πληροφορίες για το πρόβλημα:
Λόγω πεπερασμένης ακρίβειας των υπολογιστών στην αναπαράσταση των πραγματικών αριθμών, μπορεί κάποια πράξη να έπρεπε να κάνει ακριβώς 1, αλλά τελικά να βγαίνει 1.00000000001.
Όταν αυτήν την τελική τιμή την χρησιμοποιούμε σε συγκρίσεις (π.χ. ΑΝ α=β, ΓΙΑ α ΑΠΟ 1 ΜΕΧΡΙ 10 κτλ) τότε μπορεί να δημιουργηθούν προβλήματα στη διδασκαλία: συνθήκες που θα έπρεπε να ισχύουν να μην ισχύουν, επαναλήψεις να εκτελούνται μία φορά λιγότερη ή περισσότερη απ' ότι περιμέναμε κτλ.

Παράδειγμα #1: Τι προσπαθούμε να αποφύγουμε:
Το παρακάτω στην Pascal, στη C, στη Γλωσσομάθεια κτλ βγάζει ΨΕΥΔΗΣ:
Κώδικας (ΓΛΩΣΣΑ) [Επιλογή]

ΠΡΟΓΡΑΜΜΑ ΠεριορισμένηΑκρίβεια
ΑΡΧΗ
  ΓΡΑΨΕ 10 = 10/3*3 !Πρέπει να τυπώνει ΑΛΗΘΗΣ, αλλά χωρίς "παρέμβαση" δεν το κάνει!
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


Για να αποκρύψει αυτό το πρόβλημα από τους μαθητές, ο Διερμηνευτής στο μενού Εργαλεία » Επιλογές » Καρτέλα ΓΛΩΣΣΑ έχει την επιλογή «Στρογγυλοποίηση πραγματικών σε συγκρίσεις στο δεκαδικό:», με την οποία ουσιαστικά υποχρεώνουμε 1 = 1.00000000001.

Παράδειγμα #2: Επίδειξη του τι θέλουμε για να αποκρύψουμε το πρόβλημα της πεπερασμένης ακρίβειας των υπολογιστών:
Κώδικας (ΓΛΩΣΣΑ) [Επιλογή]

ΠΡΟΓΡΑΜΜΑ ΔοκιμήΣτρογγυλοποιήσεων
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: α, β
ΑΡΧΗ
  α <- 1.00000000001
  β <- 1
  ΓΡΑΨΕ 'Οι πολύ μικρές διαφορές στις συγκρίσεις πραγματικών'
  ΓΡΑΨΕ 'αριθμών συνήθως είναι λόγω περιορισμένης ακρίβειας.'
  ΓΡΑΨΕ 'Για να αποκρύψει αυτήν την προγραμματιστική λεπτομέρεια'
  ΓΡΑΨΕ 'από τους μαθητές ο Διερμηνευτής ακολουθεί τις παρακάτω'
  ΓΡΑΨΕ 'συμβάσεις:'
  ΓΡΑΨΕ α < β                                    !Θέλουμε ΨΕΥΔΗΣ
  ΓΡΑΨΕ α <= β                                   !Θέλουμε ΑΛΗΘΗΣ
  ΓΡΑΨΕ α = β                                    !Θέλουμε ΑΛΗΘΗΣ
  ΓΡΑΨΕ α <> β                                   !Θέλουμε ΨΕΥΔΗΣ
  ΓΡΑΨΕ α >= β                                   !Θέλουμε ΑΛΗΘΗΣ
  ΓΡΑΨΕ α > β                                    !Θέλουμε ΨΕΥΔΗΣ
  ΓΡΑΨΕ                                  !Εκτύπωση κενής γραμμής
  α <- 1
  β <- 1.00000000001
  ΓΡΑΨΕ α < β                                    !Θέλουμε ΨΕΥΔΗΣ
  ΓΡΑΨΕ α <= β                                   !Θέλουμε ΑΛΗΘΗΣ
  ΓΡΑΨΕ α = β                                    !Θέλουμε ΑΛΗΘΗΣ
  ΓΡΑΨΕ α <> β                                   !Θέλουμε ΨΕΥΔΗΣ
  ΓΡΑΨΕ α >= β                                   !Θέλουμε ΑΛΗΘΗΣ
  ΓΡΑΨΕ α > β                                    !Θέλουμε ΨΕΥΔΗΣ
  ΓΡΑΨΕ 'Η ακρίβεια στρογγυλοποίησης μπορεί να οριστεί από το'
  ΓΡΑΨΕ 'μενού Εργαλεία » Ρυθμίσεις » Καρτέλα ΓΛΩΣΣΑ.'
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ