Αποστολέας Θέμα: πρόβλημα με την Αν ... αλλιώς_αν  (Αναγνώστηκε 2325 φορές)

droopy

  • Θαμώνας
  • ***
  • Μηνύματα: 36
  • you know what... i'm happy
πρόβλημα με την Αν ... αλλιώς_αν
« στις: 17 Νοέ 2007, 04:33:48 μμ »
προσπαθώ να τρέξω τον παρακάτω αλγόριθμο στην Γλώσσα και δίνοντας ίδια τιμή στην μεταβλητή α   
και στην μεταβλητή β (π.χ το 5) δεν τρέχει σωστά.
Ενώ θα έπρεπε να πηγαίνει στο τελευταίο (αλλιώς_αν α = β) μπαίνει στο (αλλιώς_αν β < α)

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

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

sstergou

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 983
  • Program or be Programmed
    • pseudoglossa.gr
Απ: πρόβλημα με την Αν ... αλλιώς_αν
« Απάντηση #1 στις: 17 Νοέ 2007, 05:16:26 μμ »
Υποπτεύομαι ότι έχει να κάνει με τον πραγματικό τύπο δεδομένων καθώς άμα δηλώσεις τα α,β ακέραιους τότε το πρόγραμμα δουλεύει σωστά.
Στάθης Στέργου - sstergouATgmailDOTcom - http://www.pseudoglossa.gr

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 4801
    • alkisg@im.sch.gr
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Απ: πρόβλημα με την Αν ... αλλιώς_αν
« Απάντηση #2 στις: 17 Νοέ 2007, 06:23:38 μμ »
Bug της release candidate (0.9.2.5), η stable έκδοση (0.91β - λήψη από http://alkisg.mysch.gr/downloads) το τρέχει κανονικά.

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

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

edit: Έτοιμη!

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

Παράδειγμα #1: Τι προσπαθούμε να αποφύγουμε:
Το παρακάτω στην Pascal, στη C, στη Γλωσσομάθεια κτλ βγάζει ΨΕΥΔΗΣ:
Κώδικας: Text
  1. ΠΡΟΓΡΑΜΜΑ ΠεριορισμένηΑκρίβεια
  2. ΑΡΧΗ
  3.   ΓΡΑΨΕ 10 = 10/3*3 !Πρέπει να τυπώνει ΑΛΗΘΗΣ, αλλά χωρίς "παρέμβαση" δεν το κάνει!
  4. ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
  5.  

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

Παράδειγμα #2: Επίδειξη του τι θέλουμε για να αποκρύψουμε το πρόβλημα της πεπερασμένης ακρίβειας των υπολογιστών:
Κώδικας: Text
  1. ΠΡΟΓΡΑΜΜΑ ΔοκιμήΣτρογγυλοποιήσεων
  2. ΜΕΤΑΒΛΗΤΕΣ
  3.   ΠΡΑΓΜΑΤΙΚΕΣ: α, β
  4. ΑΡΧΗ
  5.   α <- 1.00000000001
  6.   β <- 1
  7.   ΓΡΑΨΕ 'Οι πολύ μικρές διαφορές στις συγκρίσεις πραγματικών'
  8.   ΓΡΑΨΕ 'αριθμών συνήθως είναι λόγω περιορισμένης ακρίβειας.'
  9.   ΓΡΑΨΕ 'Για να αποκρύψει αυτήν την προγραμματιστική λεπτομέρεια'
  10.   ΓΡΑΨΕ 'από τους μαθητές ο Διερμηνευτής ακολουθεί τις παρακάτω'
  11.   ΓΡΑΨΕ 'συμβάσεις:'
  12.   ΓΡΑΨΕ α < β                                    !Θέλουμε ΨΕΥΔΗΣ
  13.   ΓΡΑΨΕ α <= β                                   !Θέλουμε ΑΛΗΘΗΣ
  14.   ΓΡΑΨΕ α = β                                    !Θέλουμε ΑΛΗΘΗΣ
  15.   ΓΡΑΨΕ α <> β                                   !Θέλουμε ΨΕΥΔΗΣ
  16.   ΓΡΑΨΕ α >= β                                   !Θέλουμε ΑΛΗΘΗΣ
  17.   ΓΡΑΨΕ α > β                                    !Θέλουμε ΨΕΥΔΗΣ
  18.   ΓΡΑΨΕ                                  !Εκτύπωση κενής γραμμής
  19.   α <- 1
  20.   β <- 1.00000000001
  21.   ΓΡΑΨΕ α < β                                    !Θέλουμε ΨΕΥΔΗΣ
  22.   ΓΡΑΨΕ α <= β                                   !Θέλουμε ΑΛΗΘΗΣ
  23.   ΓΡΑΨΕ α = β                                    !Θέλουμε ΑΛΗΘΗΣ
  24.   ΓΡΑΨΕ α <> β                                   !Θέλουμε ΨΕΥΔΗΣ
  25.   ΓΡΑΨΕ α >= β                                   !Θέλουμε ΑΛΗΘΗΣ
  26.   ΓΡΑΨΕ α > β                                    !Θέλουμε ΨΕΥΔΗΣ
  27.   ΓΡΑΨΕ 'Η ακρίβεια στρογγυλοποίησης μπορεί να οριστεί από το'
  28.   ΓΡΑΨΕ 'μενού Εργαλεία » Ρυθμίσεις » Καρτέλα ΓΛΩΣΣΑ.'
  29. ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
  30.