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

Γενικό Λύκειο => Γ΄ Λυκείου => Δομή επανάληψης => Μήνυμα ξεκίνησε από: nikolasmer στις 21 Ιαν 2013, 09:32:16 ΜΜ

Τίτλος: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: nikolasmer στις 21 Ιαν 2013, 09:32:16 ΜΜ
Γράφω το παρακάτω

Αρχή_επανάληψης
  Διάβασε x
Μέχρις_ότου x = Α_Μ(x) και x ≥ 0
Όσο x ≠ 1 επανάλαβε
  Αν x mod 2 = 0 τότε
    x ← x/ 2
  αλλιώς
    x ← 3*x + 1
  Τέλος_αν
  Εμφάνισε x
Τέλος_επανάληψης

Γιατί δεν τρέχει στο διερμηνευτή!!;;  :-\
Τίτλος: Απ: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: Νίκος Αδαμόπουλος στις 21 Ιαν 2013, 09:40:07 ΜΜ
Πιστεύεις ότι ο διερμηνευτής έχει θεωρήσει το x σαν ακέραιου τύπου;

Η συνθήκη  x = Α_Μ(x)  ελέγχει αν το x περιέχει αριθμό με ή χωρίς σημαντικά δεκαδικά ψηφία. Υποψιάζομαι ότι επειδή κάτι τέτοιο δεν έχει νόημα να γίνεται σε μεταβλητές ακέραιου τύπου, και επειδή στον διερμηνευτή δεν δηλώνουμε εμείς τον τύπο τους, ίσως αυτός θεωρεί πλέον την x ως πραγματικού τύπου. Επομένως, στη συνέχεια δεν θα μπορεί να εκτελεστεί το  x mod 2.

Ποιον διερμηνευτή έχεις και τι ακριβώς σου εμφανίζει;
Τίτλος: Απ: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: nikolasmer στις 21 Ιαν 2013, 09:49:51 ΜΜ
Του Άλκη το Διερμηνευτή.

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


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

Νίκο τι εννοείς παραπάνω;
Τίτλος: Απ: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: gthal στις 21 Ιαν 2013, 09:54:18 ΜΜ
πιθανότατα γιατί το x/2 είναι πραγματικού τύπου και επιχειρείς να το εκχωρήσεις στον x πού ο διερμηνευτής έχει θεωρήσει (μάλλονα) ως ακέραιο για να συμμετέχει στις div mod
γιαυτό και το x div 2 το δέχεται
Τίτλος: Απ: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: nikolasmer στις 21 Ιαν 2013, 09:56:28 ΜΜ
Μα όταν θα φτάσει στο σημείο της διαίρεσης ο έλεγχος , το χ θα είναι άρτιος και ακέραιος.
Τίτλος: Απ: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: nikolasmer στις 21 Ιαν 2013, 09:58:17 ΜΜ
Και έτσι παίζει

Αν x mod 2 = 0 τότε
    x ← Α_Μ (x/ 2)
  αλλιώς
    x ← 3*x + 1
Τέλος_αν
Τίτλος: Απ: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: Νίκος Αδαμόπουλος στις 21 Ιαν 2013, 09:59:39 ΜΜ
Θέλω να πω πως στον διερμηνευτή ο τύπος μιας μεταβλητής αποφασίζεται αυτόματα και (ενδέχεται να) κλειδώνει στη συνέχεια.
Έτσι αν έχεις

χ<-12.0

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

τ <- χ mod 2

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

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

Επίσης, ενδιαφέρον θα είχε να δούμε την αντίστοιχη συμπεριφορά του διερμηνευτή του Στάθη...
Τίτλος: Απ: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: nikolasmer στις 21 Ιαν 2013, 10:04:28 ΜΜ
Τόσο καιρό που το έλεγα και το ξανάλεγα με τον αρχικό τρόπο που παραθέτω είναι λάθος ή πρέπει να επισημάνω τη διαφορά μόνο για τα προγράμματα και όχι για τους αλγορίθμους που η κατάσταση είναι λίγο πιο φλού;
Τίτλος: Απ: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: nikolasmer στις 21 Ιαν 2013, 10:07:31 ΜΜ
Συγνώμη που ήμουν άτροπος παραπάνω. :-[
Του κυρίου Άλκη Γεωργόπουλου τον Διερμηνευτή χρησιμοποιώ.
Τίτλος: Απ: Αφού είναι ακέραιος άρτιος γιατί δεν "τρέχει"
Αποστολή από: alkisg στις 22 Ιαν 2013, 07:20:02 ΠΜ
Όπως τα λένε παραπάνω οι συνάδελφοι είναι. Δηλαδή, μόλις ο Διερμηνευτής δει κάποια εντολή από την οποία μπορεί να συμπεράνει τον τύπο μιας μεταβλητής, στη συνέχεια αρνείται να δεχτεί εντολές που θεωρούν ότι είναι διαφορετικός τύπος:

Κώδικας (Ψευδογλώσσα) [Επιλογή]

Αλγόριθμος ΤύποιΔεδομένων
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 στις 22 Ιαν 2013, 11:54:03 ΠΜ
Προβληματισμός τέλος.
Ευχαριστώ πολύ.