Λογικά λάθη και λάθη κατά την εκτέλεση

Ξεκίνησε από Wizard, 10 Μαρ 2006, 05:38:45 ΜΜ

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

Wizard

Γεια σας!
Από καιρό έψαχνα ένα τέτοιο forum και το βρήκα τώρα. Κάλλιο αργά παρά ποτέ λοιπόν!

Το βιβλίο στο 6ο κεφάλαιο αναφέρει 2 κατηγορίες λαθών, τα συντακτικά και τα λογικά λάθη. Δεν αναφέρει καθόλου τα λάθη κατά την εκτέλεση, που αναφέρονται στη σελ. 281, που είναι όμως εκτός ύλης.

Δηλαδή, αν έχουμε τις εντολές "ΔΙΑΒΑΣΕ x" και μετά "α <-- β / x" και ο χρήστης δώσει x=0, τι λέμε στα παιδιά, ότι είναι λογικό λάθος;


P.Tsiotakis


Παραβιάζεται η καθοριστικότητα, δεν έχουμε αλγόριθμο

Wizard

Ναι, αλλά στα πλαίσια ενός προγράμματος αυτό θεωρείται λάθος κατά την εκτέλεση, όπως αναφέρει και το βιβλίο στη σελ. 282 για τα λάθη κατά την εκτέλεση ("... η προσπάθεια διαίρεσης ενός αριθμού με το μηδέν,..."). Μήπως στην παράγραφο 6.7 τα λογικά λάθη περιλαμβάνουν και τα λάθη κατά την εκτέλεση;

evry


   Αν θέλουμε να μιλήσουμε για λάθη κατά την εκτέλεση τότε θα πρέπει να μιλήσουμε και για λάθη κατά τη μεταγλώττιση, και για λάθη κατά τη σύνδεση. Δεν χρειάζεται να περιπλέκουμε τα πράγματα. Ούτε πρέπει να αντιμετωπίζουμε το βιβλίο σαν ευαγγέλιο και να πιστεύουμε κατά γράμμα ότι λέει.
     Τα λάθη που συμβαίνουν κατά την εκτέλεση προφανώς είναι λογικά. Αυτό πρέπει να ξέρουν οι μαθητές και τίποτα περισσότερο.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Wizard

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

P.Tsiotakis


Το πρόγραμμα δεν είναι παρά ένας τρόπος γραφής αλγορίθμου (κεφάλαιο 2, σελίδα 28), εγώ αυτό το βιβλίο διδάσκω

παραβιάζεται η καθοριστικότητα, άρα δεν υφίσταται αλγόριθμος


Πετροσ

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

vasiko

Θα συμφωνήσω με τον Παναγιώτη.
Σϋμφωνα με το βιβλίο που διδλασκουμε όταν παραβιάζεται η καθοριστικότητα δεν υφίσταται αλγόριθμος.

Πετρος

Αλγόριθμος α1
εμφάνισε 'δώσε ακέραιο διαφορο του 0:'
διαβασε Χ
Υ<--1/Χ
εμφάνισε Υ
Τελος α1

Για πείτε μου ποιο κριτήριο δεν πληροί ο παραπάνω αλγόριθμος? Η γνώμη μου είναι οτι πληρεί όλα τα αλγοριθμικά κριτήρια.

Βέβαια αν ο χρήστης δώσει 0 τότε θα δημιουργηθεί ενα σφάλμα κατα την εκτέλεση του προγράμματος. Αυτό δε σημαίνει ότι ο αλγόριθμος δεν εχει καθοριστικότητα.



Vangelis

Και  εγώ με την σειρά μου συμφωνώ με τον Πέτρο.  Σαφώς και υφίσταται  αλγόριθμος και απλά είναι λάθος η εισαγωγή δεδομένων.  Διαφορετικά θα έπρεπε σε κάθε πράξη να ελέγχουμε ένα σωρό πράγματα.  Σύμφωνα με τα λεγόμενα του Παναγιώτη και του/της vasiko  (δηλώστε φύλο βρε παιδιά να μην τα γράφουμε διπλά) η παρακάτω σειρά εντολών είναι αλγόριθμος
Διάβασε Χ
Αν Χ<> 0  τοτε
Υ <-- 1/Χ
Τέλος_αν

Η ερώτηση μου είναι τι θα γίνει αν ο χρήστης στο Διάβασε Χ δώσει όχι αριθμητική τιμή αλλα αλφαριθμητική π.χ το αβ
αυτόματα η εντολή 1/χ δεν ορίζεται άρα και το παραπάνω δεν είναι αλγόριθμος !


evry

Το τμήμα αλγορίθμου  που έδωσε ο vangelis δεν παραβιάζει την καθοριστικότητα

Διάβασε Χ
Αν Χ<> 0  τοτε
Υ <-- 1/Χ
Τέλος_αν


αλλά η παρακάτω υπολογιστική διαδικασία που έδωσε ο Πέτρος

εμφάνισε 'δώσε ακέραιο διαφορο του 0:'
διαβασε Χ
Υ<--1/Χ
εμφάνισε Υ


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

Όσον αφορά το πρόβλημα που είπε ο Βαγγέλης με τα αλφαριθμητικά μου θύμησε όταν μάθαινα προγραμματισμό σε pascal που όταν έδινες αντί για αριθμό κάποιο χαρακτήρα σου πέταγε ένα μεγαλοπρεπές runtime error.
   Αυτό όμως πιστεύω ότι είναι θέμα της γλώσσας προγραμματισμού. Για παράδειγμα στη C που όλοι οι χαρακτήρες μετατρέπονται στον αντίστοιχο ASCII κωδικό δεν θα είχαμε κανένα πρόβλημα.

Φυσικά το πρόβλημα είναι στη σημασιολογία.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

alkisg

Χωρίς να κάνω ερμηνεία, να προσθέσω στη συζήτηση το παράδειγμα της σελίδας 189 (ΠΡΟΓΡΑΜΜΑ Στατιστική), το οποίο δεν κάνει έλεγχο για μηδενική τιμή του Ν ενώ διαιρεί με το Ν. Στο πλάι της σελίδας αναφέρει απλά ότι δε γίνεται έλεγχος.

Vangelis

envy γράφεις
"Άλλο να δώσεις ένα μήνυμα και άλλο να εξασφαλίζεις ότι για όλες τις εισόδους ο αλγόριθμος τερματίζει. Είναι εντελώς  διαφορετικό πράγμα."   Μα και το δικό μου τμήμα αλγορίθμου δεν τερματίζει για όλες τις τιμές εισόδου.  ʼλλωστε το αναφέρεις παρακάτω με το runtime error!!
Πιστεύω ότι πρόβλημα καθοριστικότητας θα είχαμε αν ορίζαμε μια πράξη που δεν είναι καθορισμένο τι αποτέλεσμα έχει π.χ μια διάιρεση αλφαριθμητικών. Για παράδειγμα το τμήμα εντολών 

Διάβασε Χ
Υ <-- 1//Χ   
Εμφάνισε Χ

Σαφώς δεν αποτελεί αλγόριθμο αφού δεν υπάρχει πράξη // (ή τουλάχιτον δεν ξέρουμε τι αποτέλεσμα έχει).


P.Tsiotakis

Το οτι αναφέρει στη σελίδα 189 οτι δεν κάνει έλεγχο, σημαίνει οτι ΠΡΕΠΕΙ να κάνει έλεγχο και δεν κάνει γιατί η εστίαση της άσκησης είναι αλλού (μερικές φορές και το βιβλίο είναι αλλού).

Στον ορισμό της καθοριστικότητας αναφέρει ξεκάθαρα πότε παραβιάζεται το κριτήριο αυτό, το οποίο αν παραβιάζεται δεν υφίσταται αλγόριθμος.

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

Στα λογικά λάθη εκτελούνται οι εντολές, αλλά το αποτέλεσμα δεν είναι αυτό που αναμενόταν από την επεξεργασία...

Με εκτίμηση,

graeep

Συμφωνώ με evry. Μην ορίζοντας τι θα συμβεί αν χ=0 δεν παραβιάζουμε απλά το κριτήριο της καθοριστικότητας, αλλα τον ίδιο τον ορισμό της διαίρεσης.
Μην ξεχνάμε επίσης ότι η διαίρεση είναι η πιο ελλειπώς υλοποιημένη βασική μαθηματική πράξη στους υπολογιστές.
Βέβαια δεν μπορώ να ισχυριστώ ότι ένας αλγόριθμος εκτελεί απαραίτητα επιστημονικά ορθές διαδικασίες. Είναι όμως απαραίτητο να καθορίζεται΄πλήρως η απόκρισή στις αναμενόμενες εισόδους.

Αναμενόμενες είσοδοι για μια διάίρεση είναι όλοι οι αριθμοί και το 0. Πρέπει λοιπόν να ορίσω σαφώς τι θα συμβεί σε κάθε περίπτωση.

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