Γράφω το παρακάτω
Αρχή_επανάληψης
Διάβασε x
Μέχρις_ότου x = Α_Μ(x) και x ≥ 0
Όσο x ≠ 1 επανάλαβε
Αν x mod 2 = 0 τότε
x ← x/ 2
αλλιώς
x ← 3*x + 1
Τέλος_αν
Εμφάνισε x
Τέλος_επανάληψης
Γιατί δεν τρέχει στο διερμηνευτή!!;; :-\
Πιστεύεις ότι ο διερμηνευτής έχει θεωρήσει το x σαν ακέραιου τύπου;
Η συνθήκη x = Α_Μ(x) ελέγχει αν το x περιέχει αριθμό με ή χωρίς σημαντικά δεκαδικά ψηφία. Υποψιάζομαι ότι επειδή κάτι τέτοιο δεν έχει νόημα να γίνεται σε μεταβλητές ακέραιου τύπου, και επειδή στον διερμηνευτή δεν δηλώνουμε εμείς τον τύπο τους, ίσως αυτός θεωρεί πλέον την x ως πραγματικού τύπου. Επομένως, στη συνέχεια δεν θα μπορεί να εκτελεστεί το x mod 2.
Ποιον διερμηνευτή έχεις και τι ακριβώς σου εμφανίζει;
Του Άλκη το Διερμηνευτή.
Έβαλα div και τρέχει μια χαρά
Αν x mod 2 = 0 τότε
x ← x div 2
αλλιώς
x ← 3*x + 1
Τέλος_αν
Νίκο τι εννοείς παραπάνω;
πιθανότατα γιατί το x/2 είναι πραγματικού τύπου και επιχειρείς να το εκχωρήσεις στον x πού ο διερμηνευτής έχει θεωρήσει (μάλλονα) ως ακέραιο για να συμμετέχει στις div mod
γιαυτό και το x div 2 το δέχεται
Μα όταν θα φτάσει στο σημείο της διαίρεσης ο έλεγχος , το χ θα είναι άρτιος και ακέραιος.
Και έτσι παίζει
Αν x mod 2 = 0 τότε
x ← Α_Μ (x/ 2)
αλλιώς
x ← 3*x + 1
Τέλος_αν
Θέλω να πω πως στον διερμηνευτή ο τύπος μιας μεταβλητής αποφασίζεται αυτόματα και (ενδέχεται να) κλειδώνει στη συνέχεια.
Έτσι αν έχεις
χ<-12.0
ο διερμηνευτής θεωρεί ότι η χ είναι πραγματικού τύπου, οπότε στη συνέχεια το
τ <- χ mod 2
δεν μπορεί να εκτελεστεί.
Βέβαια όλα αυτά εξαρτώνται από την κατασκευή του διερμηνευτή, όπου εκεί μπορεί να έχουν προβλεφθεί διάφορες περιπτώσεις και "κόλπα"... Οπότε στη συγκεκριμένη περίπτωση, ο πιο αρμόδιος να απαντήσει θα ήταν ο Άλκης! ;)
Επίσης, ενδιαφέρον θα είχε να δούμε την αντίστοιχη συμπεριφορά του διερμηνευτή του Στάθη...
Τόσο καιρό που το έλεγα και το ξανάλεγα με τον αρχικό τρόπο που παραθέτω είναι λάθος ή πρέπει να επισημάνω τη διαφορά μόνο για τα προγράμματα και όχι για τους αλγορίθμους που η κατάσταση είναι λίγο πιο φλού;
Συγνώμη που ήμουν άτροπος παραπάνω. :-[
Του κυρίου Άλκη Γεωργόπουλου τον Διερμηνευτή χρησιμοποιώ.
Όπως τα λένε παραπάνω οι συνάδελφοι είναι. Δηλαδή, μόλις ο Διερμηνευτής δει κάποια εντολή από την οποία μπορεί να συμπεράνει τον τύπο μιας μεταβλητής, στη συνέχεια αρνείται να δεχτεί εντολές που θεωρούν ότι είναι διαφορετικός τύπος:
Αλγόριθμος ΤύποιΔεδομένων
x ← 4
x ← x/2
x ← x mod 2
Τέλος ΤύποιΔεδομένων
Αυτό λοιπόν βγάζει το παρακάτω μήνυμα λάθους στη γραμμή x ← x mod 2:
Παράθεση
Δεν είναι δυνατή η πράξη «mod» με τα δοθέντα ορίσματα.
«x»: πραγματική μεταβλητή
«2»: ακέραια σταθερά
Το x/2 ο Διερμηνευτής το θεωρεί πραγματική έκφραση, ανεξαρτήτως από το αν το x τύχει κατά την εκτέλεση να είναι ζυγός ή όχι,
οπότε και το x είναι πραγματική μεταβλητή,
αλλά στη συνέχεια το x mod 2 υπαγορεύει ότι το x έπρεπε να είναι ακέραιο, εξ ου και το μήνυμα λάθους.
Παράθεση από: nikolasmer στις 21 Ιαν 2013, 10:04:28 ΜΜ
Τόσο καιρό που το έλεγα και το ξανάλεγα με τον αρχικό τρόπο που παραθέτω είναι λάθος ή πρέπει να επισημάνω τη διαφορά μόνο για τα προγράμματα και όχι για τους αλγορίθμους που η κατάσταση είναι λίγο πιο φλού;
Κατά τη γνώμη μου ναι λάθος είναι, αλλά είναι στις γκρι περιοχές όπου τα λάθη είναι ...σχετικά. Για παράδειγμα, το pseudoglossa.gr του Στάθη το τρέχει χωρίς πρόβλημα. Όμως, το pseudoglossa το παρακάτω το θεωρεί προβληματικό μόνο κατά τη δεύτερη επανάληψη:
Αλγόριθμος ΤύποιΔεδομένων
Για ι από 4 μέχρι 5
Εμφάνισε ι
x ← ι/2
x ← x mod 2
Τέλος_επανάληψης
Τέλος ΤύποιΔεδομένων
Ε, εμένα δεν μου φαίνεται καλό να περιμένουμε μέχρι τη δεύτερη επανάληψη για να εμφανίσουμε ένα πρόβλημα που φαίνεται και στο συντακτικό έλεγχο, πριν καν πάμε να τρέξουμε το πρόγραμμα. Άλλοι φυσικά θα έχουν αντίθετη γνώμη, "αφού δεν έχουμε τύπους δεδομένων, δεν πειράζει να είναι στη μία επανάληψη σωστό και στην άλλη λάθος, ανάλογα με την τιμή των μεταβλητών".
Οπότε εγώ θα πρότεινα να αποφύγεις τέτοια παραδείγματα ώστε να μη χρειαστεί να μπεις σε λεπτομέρειες για τους τύπους δεδομένων πριν ακόμα φτάσεις στη ΓΛΩΣΣΑ.
Προβληματισμός τέλος.
Ευχαριστώ πολύ.