Κατηγορίες Λαθών - Εκφαλμάτωση

Ξεκίνησε από Σάκης Δημόπουλος, 28 Δεκ 2019, 07:33:36 ΜΜ

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

Κώστας Τ.

Καλησπέρα, ερώτηση: Το παρακάτω τμήμα προγράμματος σε ποιο είδος λάθους το κατηγοριοποιούμε;

ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 100
     ΔΙΑΒΑΣΕ i
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

Λογικό λάθος;

petrosp13

Εγώ συντακτικό θα το χαρακτήριζα
Θα πρέπει ο μεταγλωττιστής να το εντοπίσει
Διαφορετικά, μάλλον runtime error
Λογικό δεν ταιριάζει καθώς δεν θα φτάσει σε ολοκλήρωση το πρόγραμμα
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

Καραμαούνας Πολύκαρπος

Τερματίζει για οποιαδήποτε τιμή του i > 99

alkisg

Θα το χαρακτήριζα λογικό λάθος γιατί δεν κάνει αυτό που θέλουμε.
Runtime δεν είναι γιατί δεν προκαλεί σφάλμα χρόνου εκτέλεσης, "Runtime error blabla: η εκτέλεση του προγράμματος διακόπηκε".
Συντακτικό δεν είναι γιατί δεν παραβιάζει τους συντακτικούς κανόνες της ΓΙΑ ή της ΔΙΑΒΑΣΕ, παραβιάζει μόνο τις "καλές πρακτικές", τις συστάσεις του βιβλίου.

ΑΝ θεωρούσαμε ότι "η μεταβολή του μετρητή της ΓΙΑ εντός της ΓΙΑ είναι συντακτικό λάθος", τότε θα μπορούσαμε να το πούμε και συντακτικό.

akalest0s

"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

P.Tsiotakis

Δεν πρέπει να τροποποιούμε εντός του βρόχου την τιμή του μετρητή που ελέγχει τη δομή Για.
[Αναφορά στο τετράδιο οδηγιών μαθητή και έγγραφο ΥΠΕΠΘ 43652 / Γ2 / 20 - 4 - 2010.]

Καρκαμάνης Γεώργιος

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

petrosp13

Παράθεση από: alkisg στις 03 Φεβ 2020, 04:40:54 ΜΜ
Runtime δεν είναι γιατί δεν προκαλεί σφάλμα χρόνου εκτέλεσης, "Runtime error blabla: η εκτέλεση του προγράμματος διακόπηκε".

Για i=1 βάζουμε τον χρήστη να του αλλάξει τιμή, κάτι που απαγορεύεται
Γι'αυτό το θεωρώ συντακτικό, ή διαφορετικά runtime


Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

alkisg

Ναι το βασικό ερώτημα εδώ είναι τι σημαίνει αυτή η "απαγόρευση".

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

2) Είναι οδηγία από το Υπουργείο προς τους δημιουργούς των εκάστοτε διερμηνευτών, ώστε να πιάνουν αυτό το πρόβλημα κατά το συντακτικό έλεγχο;
Αν ναι, τότε είναι και λογικό και συντακτικό λάθος.
Ο συντακτικός έλεγχος όμως σε τέτοια ζητήματα συνηθίζεται σε γλώσσες με δυνατότερο συντακτικό, π.χ. "const int x=1; x=2", εκεί εύκολα μπορεί να παραπονεθεί ο compiler ότι το x έχει δηλωθεί με σταθερή τιμή και δεν επιτρέπεται η αλλαγή του.
Το να γίνεται συντακτικός έλεγχος για την αλλαγή του μετρητή της ΓΙΑ είναι πολύ πιο δύσκολο, π.χ.

ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 10
  ΚΑΛΕΣΕ ΚάποιαΔιαδικασία(ι)
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

...εκεί που να ξέρει ο κάθε διερμηνευτής αν η ΚάποιαΔιαδικασία αλλάζει ή όχι το ι.

3) Είναι οδηγία από το Υπουργείο προς τους δημιουργούς των εκάστοτε διερμηνευτών, ώστε να πιάνουν αυτό το πρόβλημα κατά την εκτέλεση;
Αν ναι, τότε είναι και λογικό και λάθος κατά την εκτέλεση.

Αυτό είναι πιο φυσιολογικό από πλευράς υλοποίησης, ακόμα και στην περίπτωση της ΚάποιαΔιαδικασία παραπάνω ο διερμηνευτής μπορεί να ελέγξει κατά την επιστροφή της διαδικασίας ότι μεταβάλλει (copy-out) την τιμή του μετρητή της ΓΙΑ, και επομένως να προκαλέσει "Runtime error 18: απαγορεύεται η αλλαγή του μετρητή της ΓΙΑ".
Και πάλι όμως έχει ένα κενό σημείο, αν τη μεταβάλλει και την κάνει όσο ήταν πριν, θεωρείται λάθος εκτέλεσης ή όχι; (π.χ. copy-in => ι=3, copy-out => ι=3).


Από όλα τα παραπάνω, εγώ θεωρώ ότι το βιβλίο και το Υπουργείο εννοούν το (1)· τα άλλα είναι πολύ ασαφή στην υλοποίησή τους ενώ δεν προσδίδουν διδακτική αξία.

evry

#10
Πολύ σωστά ο Άλκης περιγράφει τα προβλήματα που δημιουργούνται από αυτή την χωρίς λογική απαγόρευση που μετά από τόσα χρόνια που διδάσκεται το μάθημα δεν ξέρουμε ακόμα αν είναι λάθος ή κακή πρακτική.
Προφανώς δεν είναι εφικτό ένας μεταγλωττιστής να πιάσει σε compile-time τέτοιο λάθος, αφού η διαδικασία από μόνη της δεν θα ξέρει αν η παράμετρος που δέχεται είναι μετρητής βρόχου, αλλά ούτε και κατά τη κλήση της διαδικασίας μπορεί κάποιος να ξέρει αν η διαδικασία μέσα τροποποιεί τη μεταβλητή.
Υποθέτω μόνο αν απαγορεύσεις σε έναν μετρητή επανάληψης να είναι παράμετρος σε διαδικασία θα το πετύχεις αυτό.
Στο δικό μας μάθημα το λάθος δεν είναι συντακτικό αφού δεν έχουμε πουθενά ορισμένη αυστηρή σύνταξη της ΓΛΩΣΣΑΣ (γιατί μιλάμε για συντακτικά λάθη? Αλγοριθμική δεν κάνουμε?)
αλλά από την άλλη ένα παράδειγμα όπως το παρακάτω δεν παράγει λογικό λάθος, και αλγοριθμικά είναι ολόσωστο αφού δεν παραβιάζει κανένα αλγοριθμικό κριτήριο.
Κώδικας: javascript
Σ <- 0
Διάβασε Α
Για ι από 1 μέχρι 100
    Αν Α = 0 Τότε
         ι <- 101
    Αλλιώς
        Σ <- Σ + Α
       Διάβασε Α
    Τέλος_Αν
Τέλος_Επανάληψης
Γράψε Σ


Επίσης ο παραλογισμός φαίνεται από το γεγονός ότι το παρακάτω τμήμα κώδικα γίνεται δεκτό στο μάθημα

Κώδικας: javascript
Σ <- 0
Διάβασε Α
Όσο ι<=100 και Α<>0 Επανάλαβε
      Σ <- Σ + Α
      Διάβασε Α
      ι <- ι + 1
Τέλος_Επανάληψης
Γράψε Σ


Τα δυο τμήματα κώδικα εκτελούν την ίδια λειτουργία!!!
Το ένα όμως επιτρέπεται και το άλλο όχι!!!  :D
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

tsak

Για εμένα είναι απλά κακή και ανούσια πρακτική. Ούτε ο μεταγλωττιστής το "πιάνει" ούτε στην πορεία βγάζει σφάλμα νομίζω. Απλά είναι προγραμματιστική κακοποίηση 😀

Άκυρο...σε άλλο post ήθελα να απαντήσω

akalest0s

Παράθεση από: P.Tsiotakis στις 03 Φεβ 2020, 07:44:23 ΜΜ
Δεν πρέπει να τροποποιούμε εντός του βρόχου την τιμή του μετρητή που ελέγχει τη δομή Για.
[Αναφορά στο τετράδιο οδηγιών μαθητή και έγγραφο ΥΠΕΠΘ 43652 / Γ2 / 20 - 4 - 2010.]
1. Παναγιώτη, βάσει αυτών που αναφέρεις, ως τι λάθος θα χαρακτήριζες τον εν λόγω κώδικα;

2. Παρεμπιπτόντως, η ανωτέρω απόφαση, ως προς το συγκεκριμένο θέμα της ΓΙΑ, είναι αυθαίρετη. Δηλαδή, από τα δύο χωρία που παρατίθενται, για βιβλίο μαθητή και τετράδιο μαθητή, ΔΕΝ προκύπτει το συμπέρασμα που αναφέρεται αμέσως μετά: "Από τα προαναφερθέντα προκύπτει ότι η ΓΛΩΣΣΑ αποκλείει τη μεταβολή του μετρητή."
Πουθενά δεν την αποκλείει.
Αλλά νομίζω αυτό είναι ένα θέμα που έχει συζητηθεί ξανά στο παρελθόν. Φαντάζομαι η απόφαση είναι απόφαση, και ισχύει πάνω από όλα (δεν είναι έτσι;).
Οπότε γυρίζω στην αρχική ερώτηση:
GOTO 1
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

George Eco

Αποκαλείς μια δυνατότητα bad practice αν γενικά δεν είναι καλό να την ακολουθείς.
Αυτό δε σου απαγορεύει να κάνεις μία εξαίρεση όμως.
Λογικό σφάλμα λοιπόν, αλλά έρχεται και το άλλο ερώτημα.
Αν ήθελα το πρόγραμμα να κάνει ΑΚΡΙΒΩΣ αυτό, γιατί να το θεωρήσω λάθος;
Αν πρέπει οπωσδήποτε να το χαρακτηρίσουμε ως λάθος, πάμε σε λογικό.
Αλλά δε νομίζω να ζητήσουν κάτι τέτοιο έχοντας απαγορεύσει τη μεταβολή του μετρητή εντός της ΓΙΑ.
Βέβαια μετά το 2018, φύλαγε τα ρούχα σου να έχεις τα μισά (μιας κι είδα και τη GOTO)...

akalest0s

Παράθεση από: George Eco στις 05 Φεβ 2020, 04:21:43 ΠΜ
Βέβαια μετά το 2018, φύλαγε τα ρούχα σου να έχεις τα μισά (μιας κι είδα και τη GOTO)...
;D   :P
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK