Απορία στην ΓΙΑ

Ξεκίνησε από tkon, 02 Ιουν 2017, 02:33:04 ΜΜ

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

George Eco

#60
Για ι Από 5 μέχρι 4 με_βημα 0 δεν θα εκτελεστεί η ΓΙΑ άρα δεν θα έχουμε πρόβλημα.
Εντάξει κατάλβα, η δήλωση ως δήλωση καθ όλα είναι λάθος. Ναι αντιληπτό. Συμφωνώ bugman.


Στην επαναληπτική δομή ΓΙΑ η επαναληπτική διαδικασία δεν ικανοποιεί το κριτήριο της περατότητας μόνο στην περίπτωση που το Βήμα είναι μηδέν.

Και πάλι λάθος διατύπωση. Μου φταίει φιλολογικά το "μόνο". αν αντί για " μόνο στην περίπτωση που το Βήμα είναι μηδέν." βάλουμε "πάντοτε όταν το Βήμα είναι μηδέν" πιστεύω πως βγάζει νόημα. Σα διατύπωση είναι τουλάχιστο ατυχής. Γι' αυτό και τη χαρακτηρίζω λάθος ως ερώτηση. Επιζητά να βρεις κι άλλο τρόπο να σπάσεις τη περατότητα. Εσύ μου λές πως με 0 δε σπάει πάντα η περατότητα κι έχεις και δίκιο. Διπλό το κακό.


Με τη μόνη επιπλέον παρατήρηση πως ο Διερμηνευτής δεν εκτελεί καν το κώδικα.
Θα πρέπει να ανατρέξουμε σε άλλη γλώσσα για να το συμπεράνουμε αλλά η ουσία παραμένει ίδια και λίγη σημασία έχουν τα άλλα.


Μανώλη:

Για κ  από -10 μέχρι 10 με_βήμα 0 νομίζω γενικά πως εκετελείται η FOR επειδη το 0 αντιμετωπίζεται ως θετικός, άρα και θα είναι επ άπειρον η εκτέλεση.
Το έχω διασταυρώσει αυτό από άλλη γλώσσα προγραμματισμού.


Αυτά ισχύουν στη περίπτωση  Για κ  από -10 μέχρι 10 με_βήμα 0


Αν το πας  Για κ  από 10 μέχρι -10 με_βήμα 0 σε μια άλλη γλώσσα, ας πουμε VB χάριν του ότι είναι διαδεδωμένη...



Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        For i = 10 To -10 Step 0
            MsgBox("Τesting!")
        Next
    End Sub
End Class


...κι Ω τι έκπληξη, δεν εκτελείται.

Ενώ το παρακάτω εκτελείται επ άπειρον:

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        For i = -10 To 10 Step 0
            MsgBox("Τesting!")
        Next
    End Sub
End Class



Στη ΓΛΩΣΣΑ το 0 απλά εμποδίζει την εκτέλεση κώδικα, θεωρώντας ότι θα βγάλει infinite loop σε κάθε περίπτωση. (Έκδοση 1.5.1.3)


ΠΡΟΓΡΑΜΜΑ Τεστάρω
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ -10 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ 0
    ΓΡΑΨΕ "ΤΕΣΤ"
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Τεστάρω

ΕΞΟΔΟΣ: Η τιμή του βήματος είναι μηδέν, επομένως η εντολή «Για» δεν πρόκειται να τερματίσει ποτέ




Ωστόσο θα μπορούσε απλώς να μην εκτελέσει τη ΓΙΑ στη παρακάτω  περίπτωση:

ΠΡΟΓΡΑΜΜΑ Τεστάρω
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 10 ΜΕΧΡΙ -10 ΜΕ_ΒΗΜΑ 0
    ΓΡΑΨΕ "ΤΕΣΤ"
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Τεστάρω

Ο ΔΙΕΡΜΗΝΕΥΤΗΣ το αντιμετωπίζει με τον ίδιο τρόπο όμως.
ΕΞΟΔΟΣ: Η τιμή του βήματος είναι μηδέν, επομένως η εντολή «Για» δεν πρόκειται να τερματίσει ποτέ

Κατά τη γνώμη μου δεν έχει πολλή σημασία. Γιατί να βάλω βήμα 0 εξ αρχής; Κι αν θέλω να δοκιμάσω προγραμματιστικά εξωτικές περιπτώσεις, ας πάω στην ΟΣΟ όπως προλαλήσαντες συνάδελφοι είπαν. Το βήμα δεν έχει νόημα άλλωστε αν δεν υπάρχει. Η κουβέντα είναι θεωρητική, δε πιστεύω ποτέ του Υπουργείο να βγάλει θέμα πάνω στο να προγραμματίσουμε κάτι, πάνω σε άτοπη λογική.

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


alkisg

Παράθεση από: George Eco στις 15 Αυγ 2019, 09:01:38 ΜΜ
Ωστόσο Άλκη, είναι καλό να το δεις αυτό, καθώς θα μπορούσε να συμπεριφέρεται ο Διερμηνευτής διαφορετικά ανάλογα τη περίπτωση.

Γιώργο δεν διάβασα το θέμα, τυχαία έπεσε το μάτι μου στο "Άλκη", μπορείς να δώσεις ένα συγκεκριμένο παράδειγμα όπου ο Διερμηνευτής κάνει διαφορετικά πράγματα από ό,τι περιμένεις; Απ' όσο ξέρω, ο Διερμηνευτής υλοποιεί τη ΓΙΑ όπως περιγράφει το βιβλίο.
https://alkisg.mysch.gr/ΓΛΩΣΣΑ/ΓΙΑ/

George Eco

#62
Άλκη ΟΧΙ η ΓΙΑ νομίζω προσωπικά πως μια χαρά δουλεύει στα πλαίσια του μαθήματος.

Στα πλαίσια του πως αντιμετωπίζεται η ΓΙΑ σε άλλες γλώσσες αναφέρομαι.


Στο παρακάτω, σε άλλη γλώσσα, βλέπε BASIC, δε θα το έτρεχε απλά. Δεν οδηγεί σε infinite loop, δε το τρέχει ποτέ και συνεχίζει παρακάτω.

ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 10 ΜΕΧΡΙ -10 ΜΕ_ΒΗΜΑ 0
    ΓΡΑΨΕ "Δε θα τρέξει ποτέ"
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΕΣΤ

O Διερμηνευτής ωστόσο επιστρέφει:
Η τιμή του βήματος είναι μηδέν, επομένως η εντολή «Για» δεν πρόκειται να τερματίσει ποτέ.
Έτσι δε θα το τρέξει, ως μια infinite loop περίπτωση, που είναι η παρακάτω (από -10 σε 10):

ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ -10 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ 0
    ΓΡΑΨΕ "Επ άπειρον."
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΕΣΤ


Κι επειδή λοιπόν μιλάμε για το πώς αντιμετωπίζεται το ΒΗΜΑ = 0 τόσο στο μάθημα όσο και στη ΓΛΩΣΣΑ και το Διερμηνευτή, έρχομαι και ρωτάω, ίσως μας φωτήσεις σε αυτό.

Διδάσκουμε τι γίνεται αν το Βήμα το θέσουμε 0; Το θεωρούμε σφάλμα; Το απαγορεύουμε; Γιατί αν μέχρι εκεί φτάνει η διδασκαλία, τότε όχι μόνο μια χαρά είναι ο Διερμηνευτής, αλλά κι η θεωρητική ερώτηση που μελετάω είναι ΕΝΤΕΛΩΣ άστοχη.

Γενικά πολλή βαβούρα για το τίποτα απ' οτι έχω καταλάβει, αλλά αν διδάσκουμε διαφορετική συμπεριφορά αναλόγως τη ΓΙΑ, τότε πρέπει να το δούμε.

Από τη στιγμή που αντιμετωπίζεται όπως τη περιγράφει γενικά το βιβλίο, τότε κανένα απολύτως πρόβλημα. Αναμένω να μου πεις αν είναι αυτή η προβλεπόμενη συμπεριφορά.


alkisg

Παράθεση από: George Eco στις 15 Αυγ 2019, 10:36:19 ΜΜ
Στο παρακάτω, σε άλλη γλώσσα, βλέπε BASIC, δε θα το έτρεχε απλά. Δεν οδηγεί σε infinite loop, δε το τρέχει ποτέ και συνεχίζει παρακάτω.

Νομίζω ότι αυτό είναι ασαφές, εξαρτάται και από τη γλώσσα και από την υλοποίηση (π.χ. μπορεί gwbasic να κάνει έτσι και qbasic να κάνει γιουβέτσι) και ακόμα και από το αν κάνεις for από -10 μέχρι 10 ή το αντίθετο. Τι νόημα έχει;

Μια γρήγορη παράθεση από τοβιβλίο καθηγητή:
Παράθεση από: Σελίδα 71
Ας σημειωθεί ότι οι τιμές από, μέχρι, βήμα μπορούν να είναι οποιεσδήποτε εφ
όσον ισχύουν οι επόμενοι περιορισμοί.
• από <= μέχρι με βήμα > 0
• από >= μέχρι με βήμα < 0
• βήμα ≠ 0

Εφόσον λοιπόν το αναφέρει ως περιορισμό, γιατί να μην το αναφέρουμε κι εμείς έτσι απλά και να ξεμπερδεύουμε;

Έχω καιρό να κοιτάξω τα βιβλία, νομίζω ότι παρόμοια πράγματα ανέφερε και σε άλλο σημείο.

George Eco

#64
Ναι Άλκη δε διαφωνώ καθόλου, εγκρίνω κι επαυξάνω. Το ζήτημα τέθηκε για την αρχική ερώτηση του thread αυτού που θίγει την απαγόρευση αυτή.
Κι όντως δε βρίσκω νόημα να αλλάξει συμπεριφορά ο Διερμηνευτής, είναι μακρυά από κάθε διδακτικό στόχο. Από τη στιγμή που γλώσσα από γλώσσα διαφέρουν στο πως αντιμετωπίζουν πράγματα κι από τη στιγμή που υπάρχουν ρητές οδηγίες πως το βήμα δε γίνεται 0 τέλος.
Κι οι περιορισμοί εμποδίζουν τα παράδοξα, οπότε τελειώνει εδώ αυτό το θέμα.

Βρίσκω την ερώτηση εντελώς άστοχη.
Τη παραθέτω ξανά: "Στην επαναληπτική δομή ΓΙΑ η επαναληπτική διαδικασία δεν ικανοποιεί το κριτήριο της περατότητας μόνο στην περίπτωση που το Βήμα είναι μηδέν"

Η φράση μόνο στην περίπτωση που το Βήμα είναι μηδέν αρχικά παραβιάζει το κανόνα να είναι διάφορο του μηδενός το βήμα. Αυτό αυτόματα δίνει το δικαίωμα στο μαθητή να σκεφτεί να κάνει κάποια ζαβολιά κι αυτός, για να σπάσει τη περατότητα. Τα παιδιά θα δοκιμάσουν , θα εστιάσουν και θα βρουν ενδεχομένως πως μπορούν να κάνουν επέμβαση στη μεταβλητή της ΓΙΑ εκ των έσω της, που στα πλαίσια του μαθήματος απαγορεύεται να γίνεται και λογικό το βρίσκω βάσει διδακτικών στόχων. Εναλλακτικά ίσως δοκιμάσουν να παίξουν με αρνητικό βήμα σε αρχική τιμή μικρότερη της τελικής. Αλλά αφού η άσκηση σκασίλα της για μία απαγόρευση, τότε σκασίλα της και για το δικό τους ατόπημα. Δε πάμε με δύο μέτρα και δύο σταθμά.

Αν θέλουμε απάντηση σε αυτό λοιπόν, με σύντομη επεξήγηση, θα έλεγα, ΛΑΘΟΣ, διότι υπάρχουν κι άλλοι κανόνες που μπορείς να παραβιάσεις και να έχεις ατέερμονη λούπα.


Δηλαδή σαν ερώτηση, από φιλολογική σκοπιά αν το δεις, δεν έχει να προσφέρει τίποτα παραπάνω από το να μπερδέψει ένα μαθητή έτοιμο να πάει να δώσει εξετάσεις.


bugman

Ο Διερμηνευτής έχει πρόβλημα.
Εξετάζει το βήμα αν είναι 0 στην αρχή και βγάζει λάθος κατά την εκτέλεση αν πράγματι είναι.

Στο παρακάτω πρόγραμμα θα πάρουμε το ΤΕΛΟΣ, ενώ αν βάλουμε βήμα z - 5 (δηλαδή 0) το πρόγραμμα βγάζει λάθος: Η τιμή του βήματος είναι μηδέν, επομένως η εντολή «Για» δεν πρόκειται να τερματίσει ποτέ.
Έχει αναφερθεί και από τον  George Eco, όμως διαφωνώ με την άποψή του ότι ο μαθητής θα σκεφτεί πώς να αλλάξει την μεταβλητή εντός της ΓΙΑ. Αυτό που θα συμβεί, αν έχει δει κάποτε το μήνυμα του διερμηνευτή, είναι ότι  αν το βήμα είναι μηδέν τότε η ΓΙΑ δεν πρόκειται να τερματίσει ποτέ, πράγμα που δεν ισχύει πάντα, αφού η σειρά είναι: Πρώτα ελέγχουμε αν το βήμα είναι αρνητικό, αν όχι πάμε για την εκτέλεση με θετικό βήμα αλλιώς με αρνητικό. Με θετικό βήμα κοιτάμε αν η τιμή ΜΕΧΡΙ είναι μικρότερη ή ίση με τη τιμή ΑΠΟ, και αν όχι τερματίζουμε την επανάληψη χωρίς να εκτελέσουμε τον κώδικά στο εσωτερικό της. Αν δεν τερματίσουμε την επανάληψη τότε πρέπει να τσεκάρουμε αν το βήμα είναι μηδέν και να βγάλουμε λάθος.


ΠΡΟΓΡΑΜΜΑ ΕΝΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i, z
ΑΡΧΗ
  z <- 5
  ΓΙΑ i ΑΠΟ 5 ΜΕΧΡΙ 4 ΜΕ_ΒΗΜΑ z - 4
    ΓΡΑΨΕ i
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΡΑΨΕ "ΤΕΛΟΣ"
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


Ή θα βγάζει "μη επιτρεπτή τιμή βήματος 0", ή θα τρέξει κανονικά και θα εμφανίσει το ΤΕΛΟΣ, όπως γίνεται για οποιοδήποτε αρνητικό βήμα.

Πάντως αν αφήσουμε το διερμηνευτή έτσι, στο ερώτημα Σ/Λ η απάντηση είναι ΛΑΘΟΣ επειδή το βήμα στη ΓΙΑ δεν δέχεται μηδενική τιμή.

George Eco

#66
Bugman

Το παρακάτω παραβιάζει τον κανόνα με αρχικές τελικές και βήμα, με αρχική > τελικής

ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 10 ΜΕΧΡΙ -10 ΜΕ_ΒΗΜΑ 1
    ΓΡΑΨΕ "ΔΕ ΘΑ ΤΡΕΞΩ"
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ "ΤΕΛΟΣ"
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΕΣΤ


Δε τρέχει.
Δες το τώρα ανάποδα.


ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ2
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ -10 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ -1
    ΓΡΑΨΕ "ΔΕ ΘΑ ΤΡΕΞΩ"
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ "ΤΕΛΟΣ"
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΕΣΤ2


Το ίδιο. Δε τρέχει ο βρόχος πάλι.
Ίδια συμπεριφορά έχει κι η Visual Basic.





ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 10 ΜΕΧΡΙ -10 ΜΕ_ΒΗΜΑ 0
    ΓΡΑΨΕ "ΔΕ ΘΑ ΤΡΕΞΩ"
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ "ΤΕΛΟΣ"
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΕΣΤ


Εμποδίζεται η εκτέλεση


ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ -10 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ 0
    ΓΡΑΨΕ "ΕΤΡΕΞΑ"
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΡΑΨΕ "ΤΕΛΟΣ"
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΕΣΤ


Εμποδίζεται η εκτέλεση.




Εσένα το παράδειγμα τι κάνει;

ΠΡΟΓΡΑΜΜΑ ΕΝΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i, z
ΑΡΧΗ
  z <- 5
  ΓΙΑ i ΑΠΟ 5 ΜΕΧΡΙ 4 ΜΕ_ΒΗΜΑ z - 4
    ΓΡΑΨΕ i
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΡΑΨΕ "ΤΕΛΟΣ"
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ





ΓΙΑ i ΑΠΟ 5 ΜΕΧΡΙ 4 ΜΕ_ΒΗΜΑ 1 κάνει.
Αναμενόμενη συμπεριφορά λοιπόν. Πού βρίσκεται το πρόβλημα ακριβώς;


alkisg

Παράθεση από: bugman στις 16 Αυγ 2019, 05:39:44 ΠΜ
Ο Διερμηνευτής έχει πρόβλημα.
Εξετάζει το βήμα αν είναι 0 στην αρχή και βγάζει λάθος κατά την εκτέλεση αν πράγματι είναι.
...

Δεν πολυκατάλαβα το επιχείρημά σου. Εννοείς ότι ο Διερμηνευτής καλά κάνει και σταματάει την εκτέλεση του προγράμματος, αλλά το μήνυμα που εμφανίζει δεν είναι κατάλληλο;

"Η τιμή του βήματος είναι μηδέν, επομένως η εντολή «Για» δεν πρόκειται να τερματίσει ποτέ"

...επειδή πιθανώς σε κάποια υλοποίηση μπορεί με τα κατάλληλα όρια να έκανε μηδέν επαναλήψεις αντί για άπειρες;

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

Αλλά ακόμα και εκτός πλαισίων ΑΕΠΠ, δεν νομίζω ότι ένα τέτοιο μήνυμα που λες (με όλες τις περιπτώσεις ορίων και υλοποίησης) θα ήταν πιο κατανοητό στους μαθητές.


Υ.Γ. τώρα κοίταξα την αρχική ερώτηση του θέματος· για μένα, η ερμηνεία του βιβλίου είναι ότι δεν παραβιάζει την περατότητα αλλά είναι λάθος εκτέλεσης, αντίστοιχο με την διαίρεση με το μηδέν, εξ ου και η αντίστοιχη υλοποίηση στο Διερμηνευτή. Αλλά προφανώς η ερώτηση είναι άστοχη· γιατί να εξετάζουμε ερμηνείες και όχι γνώσεις;

Άλλο αντίστοιχο παράδειγμα είναι div/mod με αρνητικούς· εφόσον δόθηκε απαγόρευση από το Υπουργείο, πλέον δεν θα πρέπει να είναι σφάλμα καθοριστικότητας ή επιλογή στα μενού του Διερμηνευτή, αλλά σφάλμα χρόνου εκτέλεσης.

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

To sum up, η άποψή μου είναι:

  • Ασάφεια βιβλίου => σφάλμα καθοριστικότητας => αντίστοιχη επιλογή στα μενού του Διερμηνευτή
  • Απαγόρευση βιβλίου => σφάλμα συντακτικό ή χρόνου εκτέλεσης
  • Προβλήματα καθοριστικότητας => δεν γίνεται να απαντήσεις για περατότητα κλπ πριν λύσεις την καθοριστικότητα
  • Ερώτηση εξεταστή σε αυτά => αστοχία ερώτησης :)

bugman

Έδωσα το παράδειγμα με ένα υπολογιζόμενο βήμα πριν την εκτέλεση για να δείξω ότι ενδέχεται ένα πρόγραμμα να θέσει το βήμα στο 0 κατά την εκτέλεση. Επειδή ο Διερμηνευτής σε τέτοια περίπτωση σταματάει χωρίς να δει άλλες τιμές, ενώ σε άλλες γλώσσες δεν γίνεται κάτι τέτοιο, η αναφορά γίνεται περισσότερο ως διευκρίνιση για πιθανά προβλήματα σε μελλοντικά προγράμματα. Όσο για την άσκηση Σ/Λ και αφού αναφέρθηκε και η περίπτωση του ακέραιου υπόλοιπου με αρνητικό αριθμό, το λάθος βασίζεται στον ορισμό της Γλώσσας, όπως μη επιτρεπτό μηδενικό βήμα και αντίστοιχα μη επιτρεπτός αρνητικός ακέραιος μετά το mod. Διδακτικά αυτοί οι περιορισμοί δεν εξηγούνται, τους θεωρούμε δεδομένους αλλά καλό είναι να λέμε ότι ισχύουν για το μάθημα και μόνο.

Να προσθέσω επιπλέον ότι στο παρακάτω παράδειγμα θα πάρουμε ατέρμονη επανάληψη, χωρίς να έχουμε μηδενικό βήμα στον διερμηνευτή!

ΠΡΟΓΡΑΜΜΑ ααα
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: κ
ΑΡΧΗ
  ΓΙΑ κ ΑΠΟ 1000000000000.0 ΜΕΧΡΙ 100000000000000000000000.0 ΜΕ_ΒΗΜΑ 0.000000000000000000000000000000001
    ΓΡΑΨΕ κ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

alkisg

Παράθεση από: bugman στις 16 Αυγ 2019, 12:13:24 ΜΜ
Διδακτικά αυτοί οι περιορισμοί δεν εξηγούνται, τους θεωρούμε δεδομένους αλλά καλό είναι να λέμε ότι ισχύουν για το μάθημα και μόνο.

Γιώργο να θυμάσαι ότι εσύ δεν είσαι καθηγητής αλλά εμείς είμαστε, οπότε κάπου το context μας είναι διαφορετικό. Για εμάς είναι προφανές ότι όλοι οι περιορισμοί της ΓΛΩΣΣΑΣ και του Διερμηνευτή ισχύουν μόνο για το μάθημα, δεν χρειάζεται κάθε φορά να κάνουμε διευκρίνηση. Εσύ έχεις στο μυαλό σου την δικιά σου M2000 πώς λέγεται οπότε λογικό είναι να έχεις άλλο πλαίσιο.

Παράθεση από: bugman στις 16 Αυγ 2019, 12:13:24 ΜΜ
Να προσθέσω επιπλέον ότι στο παρακάτω παράδειγμα θα πάρουμε ατέρμονη επανάληψη, χωρίς να έχουμε μηδενικό βήμα στον διερμηνευτή!

Αυτό δεν έχει σχέση με τη ΓΙΑ ούτε με το Διερμηνευτή, είναι θέμα της αρχιτεκτονικής των πραγματικών αριθμών, και περιγράφεται στο https://alkisg.mysch.gr/ΓΛΩΣΣΑ/Τύποι_δεδομένων/:

"...Έτσι αν για παράδειγμα προσπαθήσουμε να προσθέσουμε έναν πολύ μικρό αριθμό στο 1, το άθροισμα θα είναι πάλι 1!"

George Eco

#70
Παράθεση από: bugman στις 16 Αυγ 2019, 12:13:24 ΜΜ
Να προσθέσω επιπλέον ότι στο παρακάτω παράδειγμα θα πάρουμε ατέρμονη επανάληψη, χωρίς να έχουμε μηδενικό βήμα στον διερμηνευτή!

ΠΡΟΓΡΑΜΜΑ ααα
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: κ
ΑΡΧΗ
  ΓΙΑ κ ΑΠΟ 1000000000000.0 ΜΕΧΡΙ 100000000000000000000000.0 ΜΕ_ΒΗΜΑ 0.000000000000000000000000000000001
    ΓΡΑΨΕ κ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


Bugman
Αυτό που θίγεις εδώ είναι  πολύ ενδιαφέρον.
Ανάγει ένα φιλοσοφικό ερώτημα. Ή μήπως σημασιολογικό;

Τι ορίζουμε ακριβώς ως ατέρμονη επανάληψη;

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

Αλλά πρακτικά, με την υπολογιστική δύναμη που έχει ο μέσος χρήστης σήμερα σπίτι του, αυτό θα μοιάζει με μια ατέρμονη  επανάληψη.
Μου κάνεις εντύπωση, γιατί αυτό το επιχείρημα μου το έθιξε κι ένας εγκάρδιος φίλος μου.
Ναι σε εύλογο χρονικό διάστημα ο Η/Υ δε θα το ολοκληρώσει κι αν μιλήσουμε θεωρητικά και για  1.7 χ 10^308 ακόμα χειρότερα.
Προφανώς το 10 στη 308η δύναμη είναι αστρονομικό.
Αν έιχαμε έναν Η/Υ που μπορούσε να κάνει 10 ^ 310 πράξεις το δευτερόλεπτο, ο αλγόριθμος θα λάμβανε τέλος σύντομα.  Διότι είναι πεπερασμένα και πάλι τα βήματα, απλά πάρα πολλά.
Δε μπορούμε να εξισώσουμε το άπειρο με αριθμό, οσοδήποτε μεγάλος κι αν είναι.

Ωστόσο, το ερώτημα παραμένει. Αν σε εύλογο χρονικό διάστημα δε τελειώσει μια δομή επανάληψης, αλλά θέλει ξέρω γω 3 δις χρόνια, θεωρείται ατέρμονη  επανάληψη;
Παραβιάζεται ο κανόνας  της περατότητας σε αυτή τη περίπτωση;
Ωραία αυτά τα ερωτήματα γιατί αν σκάσει κάνα παιδί με τέτοια ερώτηση, είναι ωραίο να έχουμε κάποια απάντηση.


Ας το απλουστεύσουμε λίγο...
ΠΡΟΓΡΑΜΜΑ Ακραίες_Τιμές
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: κ
ΑΡΧΗ
  ΓΙΑ κ ΑΠΟ 1.0 ΜΕΧΡΙ 2.0 ΜΕ_ΒΗΜΑ 0.000000000000000000000000000000001
    ΓΡΑΨΕ κ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Ακραίες_Τιμές


Εμφανίζει 1.00 συνεχώς αλλά δεν είναι ατέρμονο. Απλά απαιτεί πολλά βήματα για να φανεί το 1.01 κι αυτό αποδεικνύεται με μια πιο light εκδοχή:

ΠΡΟΓΡΑΜΜΑ Ακραίες_Τιμές_β
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: κ
ΑΡΧΗ
  ΓΙΑ κ ΑΠΟ 1.0 ΜΕΧΡΙ 2.0 ΜΕ_ΒΗΜΑ 0.00001
    ΓΡΑΨΕ κ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Ακραίες_Τιμές_β





alkisg

@George, δεν είναι "πάρα πολλές επαναλήψεις". Είναι όντως άπειρες.
Το πρόγραμμα του bugman δεν θα τελειώσει ποτέ, ούτε σε π.χ. 1 δις χρόνια.

Οι πραγματικοί αριθμοί δεν έχουν άπειρη ακρίβεια στον υπολογιστή.
Έτσι αν πεις i=1 και μετά i<-i+0.000000000000000000000000000000001, το ι δεν θα αλλάξει καθόλου μα καθόλου, επειδή ο πλησιέστερος πραγματικός αριθμός στο επιθυμητό αποτέλεσμα 1.000000000000000000000000000000001 που μπορεί να αναπαραστήσει ο υπολογιστής είναι πάλι το 1.

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

George Eco

Α μιλάμε για αυτό το τύπο σφάλματος. Κατάλαβα.
Σε αυτή τη περίπτωση όμως είναι θέμα της γλώσσας ή του hardware, όχι του αλγορίθμου.
Θέλω να πω, δε παραβιάζεται η περατότητα από τον αλγόριθμο αλλά από τα όρια της χρησιμοποιούμενης τεχνολογίας.
Σε άλλο hardware φέρει πειν μελλοντικό ίσως τρέξει κι όχι επ άπειρον.

Αλλά αν είναι έτσι όπως τα λέει, τότε έχει δίκιο.

Σε αυτή λοιπόν τη περίπτωση ρωτάω εγώ τώρα...
Η θεωρητική ΓΛΩΣΣΑ, στο χαρτί, όπως πρωτοσχεδιάστηκε, θεωρεί πως αυτό σπάει τον κανόνα της περατότητας;
Γιατί ο περιορισμός είναι του Διερμηνευτή, όχι της ΓΛΩΣΣΑΣ.

alkisg

Παράθεση από: George Eco στις 18 Αυγ 2019, 07:59:27 ΠΜ
Η θεωρητική ΓΛΩΣΣΑ, στο χαρτί, όπως πρωτοσχεδιάστηκε, θεωρεί πως αυτό σπάει τον κανόνα της περατότητας;
Γιατί ο περιορισμός είναι του Διερμηνευτή, όχι της ΓΛΩΣΣΑΣ.

Ναι, τον σπάει. Κανένα ψηφιακό υπολογιστικό σύστημα δεν θα μπορέσει ποτέ να αποθηκεύσει αριθμούς με άπειρη ακρίβεια. Για παράδειγμα, ο αριθμός π έχει άπειρα δεκαδικά ψηφία και θα χρειαζόταν άπειρη RAM για να αποθηκευτεί (που δεν μπορεί να υπάρξει αφού η ύλη του σύμπαντος είναι πεπερασμένη) και άπειρο χρόνο για την εκτέλεση έστω και μόνο μία πράξης πάνω στα άπειρα ψηφία του (δηλαδή για να υπολογίσουμε το 2*π θα χρειαζόμασταν άπειρο χρόνο).

Μόνο σε αναλογικούς (!) υπολογιστές θα μπορούσαν να αρθούν αυτοί οι περιορισμοί· ας μην ξεφύγουμε εκεί.

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

George Eco

#74
bugman όλες οι γλώσσες έχουν περιορισμούς, γιατί ο περιορισμός προκύπτει από το hardware όπως παρακάτω λέει ο Άλκης πολύ σωστά.
Κι αυτό ήταν το επιχείρημα του φίλου μου. Κι απ' ότι φαίνεται έχει δίκιο. Κι είπε ακριβώς αυτό που λες Άλκη, παραθέτοντας παροίμοιο παράδειγμα με του bugman.
Άρα λοιπόν, άστοχη η ερώτηση μεν, αλλά εντούτοις, η απάντηση είναι ΛΑΘΟΣ, έχοντας δίκιο ο bugman κι εκμεταλλευόμενος τους περιορισμούς του τρέχοντος hardware.
Αναρωτιέμαι πώς θα φαντάζει αυτό που γράφω σε 20 χρόνια...

Να δούμε πάλι τον παρακάτω κώδικα...

ΠΡΟΓΡΑΜΜΑ Ακραίες_Τιμές
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: κ
ΑΡΧΗ
  ΓΙΑ κ ΑΠΟ 1.0 ΜΕΧΡΙ 2.0 ΜΕ_ΒΗΜΑ 0.000000000000000000000000000000001
    ΓΡΑΨΕ κ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Ακραίες_Τιμές



Στη περίπτωση που ένα παιδί μου φέρει κάνα τέτοιο "ξόρκι" σα το παραπάνω και μου πει "Είναι πεπερασμένα τα βήματα, θεωρητικά τελειώνει" τι του απαντώ;
Γιατί στο λέω αυτό. Αν στο μέλλον μιλάμε για TB RAM και τα λοιπά συναφή, και περισσότερα bit bus επεξεργαστές κ.ο.κ. τότε ΑΥΤΟ το παράδειγμα θα τρέξει, διότι οι περιορισμοί μπορεί δυναμικά να αίρονται.
Ναι οκ θα υπάρξει μετά παράδειγμα με βήμα  0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 και θα λέει τώρα ΑΥΤΟ κάνει ατέρμονη επανάληψη. Αλλά σε θεωρητικό επίπεδο πιστεύω πως ο ΑΛΓΟΡΙΘΜΟΣ δε σπάει τον κανόνα της περατότητας έτσι. Πιστεύεις πως τον σπάει; Μιλάω πάντα για τη θεωρητική ΓΛΩΣΣΑ που δίνουν οι μαθητές Πανελλήνιες σε χαρτί. Δε μιλάω για άπειρη ακρίβεια λοιπόν, όχι όχι όχι. Μιλάω όμως πάνω στο θεωρητικό του θέματος. Γιατί αν το πάμε εκτός ορίων hardware, έχουμε ξεφύγει. Οπότε στο μελλον τα όρια αυτά θα διευρυνθηούν. Αλλά και πάλι θα υπάρξει ένα νέο όριο γιατί οι πόροι είναι πάλι πεπερασμένοι. Και τα λοιπά και τα λοιπά.  Σε θεωρητικό επίπεδο λοιπόν, αν πάρω τη ΓΛΩΣΣΑ καθ' αυτή και πω, θεωρητικά πως ο Η/Υ μου μπορεί να το διαχειριστεί, τότε δε σπάει η περατότητα. Το επιχείρημά μου το βασίζω αντιστρέφοντας το τρέχον.

Αν πηγαίναμε τη ΓΛΩΣΣΑ πίσω στο χρόνο σε Η/Υ που μπορούσαν να διαχειριστούν μέχρι ξέρω 'γω 2 δεκαδικά ψηφία κι έλεγα Από 1.0 μέχρι 2.0 βήμα = 0.0001 θα γινόταν το ίδιο. Σήμερα όμως, αυτό είναι αλγόριθμος που θα λήξει σύντομα όταν εκτελεστεί, γιατί πολύ απλά ένας σημερινός Η/Υ μπορεί.
Αντιμετωπίζουμε λοιπόν τη ΓΛΩΣΣΑ θεωρητικά, ή την αντιμετωπίζουμε βάσει του τρέχοντος hardware;
Συγγνώμη Άλκη για το προβλημάτισμό μου, αλλά μου κινείται η περιέργεια τώρα!  :D :angel: