Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"

Ξεκίνησε από nikolasmer, 21 Ιαν 2013, 09:32:16 ΜΜ

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

nikolasmer

Γράφω το παρακάτω

Αρχή_επανάληψης
  Διάβασε 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.

Ποιον διερμηνευτή έχεις και τι ακριβώς σου εμφανίζει;

nikolasmer

Του Άλκη το Διερμηνευτή.

Έβαλα div και τρέχει μια χαρά


  Αν x mod 2 = 0 τότε
    x ← x div 2
  αλλιώς
    x ← 3*x + 1
  Τέλος_αν

Νίκο τι εννοείς παραπάνω;
Μερεντίτης Νικόλαος
Πληροφορικός

gthal

πιθανότατα γιατί το x/2 είναι πραγματικού τύπου και επιχειρείς να το εκχωρήσεις στον x πού ο διερμηνευτής έχει θεωρήσει (μάλλονα) ως ακέραιο για να συμμετέχει στις div mod
γιαυτό και το x div 2 το δέχεται
Φιλικά,
Γιώργος Θαλασσινός

nikolasmer

Μα όταν θα φτάσει στο σημείο της διαίρεσης ο έλεγχος , το χ θα είναι άρτιος και ακέραιος.
Μερεντίτης Νικόλαος
Πληροφορικός

nikolasmer

Και έτσι παίζει

Αν x mod 2 = 0 τότε
    x ← Α_Μ (x/ 2)
  αλλιώς
    x ← 3*x + 1
Τέλος_αν
Μερεντίτης Νικόλαος
Πληροφορικός

Νίκος Αδαμόπουλος

Θέλω να πω πως στον διερμηνευτή ο τύπος μιας μεταβλητής αποφασίζεται αυτόματα και (ενδέχεται να) κλειδώνει στη συνέχεια.
Έτσι αν έχεις

χ<-12.0

ο διερμηνευτής θεωρεί ότι η χ είναι πραγματικού τύπου, οπότε στη συνέχεια το

τ <- χ mod 2

δεν μπορεί να εκτελεστεί.

Βέβαια όλα αυτά εξαρτώνται από την κατασκευή του διερμηνευτή, όπου εκεί μπορεί να έχουν προβλεφθεί διάφορες περιπτώσεις και "κόλπα"... Οπότε στη συγκεκριμένη περίπτωση, ο πιο αρμόδιος να απαντήσει θα ήταν ο Άλκης;)

Επίσης, ενδιαφέρον θα είχε να δούμε την αντίστοιχη συμπεριφορά του διερμηνευτή του Στάθη...

nikolasmer

Τόσο καιρό που το έλεγα και το ξανάλεγα με τον αρχικό τρόπο που παραθέτω είναι λάθος ή πρέπει να επισημάνω τη διαφορά μόνο για τα προγράμματα και όχι για τους αλγορίθμους που η κατάσταση είναι λίγο πιο φλού;
Μερεντίτης Νικόλαος
Πληροφορικός

nikolasmer

Συγνώμη που ήμουν άτροπος παραπάνω. :-[
Του κυρίου Άλκη Γεωργόπουλου τον Διερμηνευτή χρησιμοποιώ.
Μερεντίτης Νικόλαος
Πληροφορικός

alkisg

Όπως τα λένε παραπάνω οι συνάδελφοι είναι. Δηλαδή, μόλις ο Διερμηνευτής δει κάποια εντολή από την οποία μπορεί να συμπεράνει τον τύπο μιας μεταβλητής, στη συνέχεια αρνείται να δεχτεί εντολές που θεωρούν ότι είναι διαφορετικός τύπος:

Κώδικας: Ψευδογλώσσα
Αλγόριθμος ΤύποιΔεδομένων
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
Τέλος_επανάληψης
Τέλος ΤύποιΔεδομένων


Ε, εμένα δεν μου φαίνεται καλό να περιμένουμε μέχρι τη δεύτερη επανάληψη για να εμφανίσουμε ένα πρόβλημα που φαίνεται και στο συντακτικό έλεγχο, πριν καν πάμε να τρέξουμε το πρόγραμμα. Άλλοι φυσικά θα έχουν αντίθετη γνώμη, "αφού δεν έχουμε τύπους δεδομένων, δεν πειράζει να είναι στη μία επανάληψη σωστό και στην άλλη λάθος, ανάλογα με την τιμή των μεταβλητών".

Οπότε εγώ θα πρότεινα να αποφύγεις τέτοια παραδείγματα ώστε να μη χρειαστεί να μπεις σε λεπτομέρειες για τους τύπους δεδομένων πριν ακόμα φτάσεις στη ΓΛΩΣΣΑ.

nikolasmer

Μερεντίτης Νικόλαος
Πληροφορικός