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

Γενικό Λύκειο => Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον => Θεωρία => Μήνυμα ξεκίνησε από: Wizard στις 10 Μάρ 2006, 05:38:45 μμ

Τίτλος: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: Wizard στις 10 Μάρ 2006, 05:38:45 μμ
Γεια σας!
Από καιρό έψαχνα ένα τέτοιο forum και το βρήκα τώρα. Κάλλιο αργά παρά ποτέ λοιπόν!

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

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

Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: Παναγιώτης Τσιωτάκης στις 10 Μάρ 2006, 09:26:48 μμ

Παραβιάζεται η καθοριστικότητα, δεν έχουμε αλγόριθμο
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: Wizard στις 10 Μάρ 2006, 11:08:54 μμ
Ναι, αλλά στα πλαίσια ενός προγράμματος αυτό θεωρείται λάθος κατά την εκτέλεση, όπως αναφέρει και το βιβλίο στη σελ. 282 για τα λάθη κατά την εκτέλεση ("... η προσπάθεια διαίρεσης ενός αριθμού με το μηδέν,..."). Μήπως στην παράγραφο 6.7 τα λογικά λάθη περιλαμβάνουν και τα λάθη κατά την εκτέλεση;
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: evry στις 11 Μάρ 2006, 10:33:30 πμ

   Αν θέλουμε να μιλήσουμε για λάθη κατά την εκτέλεση τότε θα πρέπει να μιλήσουμε και για λάθη κατά τη μεταγλώττιση, και για λάθη κατά τη σύνδεση. Δεν χρειάζεται να περιπλέκουμε τα πράγματα. Ούτε πρέπει να αντιμετωπίζουμε το βιβλίο σαν ευαγγέλιο και να πιστεύουμε κατά γράμμα ότι λέει.
     Τα λάθη που συμβαίνουν κατά την εκτέλεση προφανώς είναι λογικά. Αυτό πρέπει να ξέρουν οι μαθητές και τίποτα περισσότερο.
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: Wizard στις 11 Μάρ 2006, 02:08:35 μμ
Κι εγώ έτσι πιστεύω, απλώς ένας μαθητής το είχε διαβάσει από μόνος του στο 13ο κεφάλαιο και με ρώτησε. Ευχαριστώ!
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: Παναγιώτης Τσιωτάκης στις 11 Μάρ 2006, 10:01:24 μμ

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

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

Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: Πετροσ στις 12 Μάρ 2006, 02:09:22 μμ
Προφανώς και υφίσταται ο αλγόριθμος! Απλώς του δίνουμε λάθος δεδομένα ως είσοδο. Αυτό μπορεί να οφείλεται είτε σε λάθος του προγραμματιστή (που δεν ξεκαθαρίζει τι ζητά από τον χρήστη) είτε σε λάθος του χρήστη. Ειναι σαφέστατα λάθος κατα την εκτέλεση και αυτός είναι ο ρόλος του ελέγχου δεδομένων... Σε αυτές τις περιπτώσεις νόμίζω γίνετε σαφής ο διαχωρισμός του αλγορίθμου και της υλοποίησης του με τη μορφή προγράμματος υπολογιστή
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: vasiko στις 12 Μάρ 2006, 05:22:15 μμ
Θα συμφωνήσω με τον Παναγιώτη.
Σϋμφωνα με το βιβλίο που διδλασκουμε όταν παραβιάζεται η καθοριστικότητα δεν υφίσταται αλγόριθμος.
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: Πετρος στις 12 Μάρ 2006, 06:38:49 μμ
Αλγόριθμος α1
εμφάνισε 'δώσε ακέραιο διαφορο του 0:'
διαβασε Χ
Υ<--1/Χ
εμφάνισε Υ
Τελος α1

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

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


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

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

Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: evry στις 13 Μάρ 2006, 11:57:12 πμ
Το τμήμα αλγορίθμου  που έδωσε ο vangelis δεν παραβιάζει την καθοριστικότητα

Κώδικας: [Επιλογή]
Διάβασε Χ
Αν Χ<> 0  τοτε
Υ <-- 1/Χ
Τέλος_αν

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

Κώδικας: [Επιλογή]
εμφάνισε 'δώσε ακέραιο διαφορο του 0:'
διαβασε Χ
Υ<--1/Χ
εμφάνισε Υ

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

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

Φυσικά το πρόβλημα είναι στη σημασιολογία.
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: alkisg στις 13 Μάρ 2006, 03:08:15 μμ
Χωρίς να κάνω ερμηνεία, να προσθέσω στη συζήτηση το παράδειγμα της σελίδας 189 (ΠΡΟΓΡΑΜΜΑ Στατιστική), το οποίο δεν κάνει έλεγχο για μηδενική τιμή του Ν ενώ διαιρεί με το Ν. Στο πλάι της σελίδας αναφέρει απλά ότι δε γίνεται έλεγχος.
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: Vangelis στις 13 Μάρ 2006, 03:59:23 μμ
envy γράφεις
"Άλλο να δώσεις ένα μήνυμα και άλλο να εξασφαλίζεις ότι για όλες τις εισόδους ο αλγόριθμος τερματίζει. Είναι εντελώς  διαφορετικό πράγμα."   Μα και το δικό μου τμήμα αλγορίθμου δεν τερματίζει για όλες τις τιμές εισόδου.  ʼλλωστε το αναφέρεις παρακάτω με το runtime error!!
Πιστεύω ότι πρόβλημα καθοριστικότητας θα είχαμε αν ορίζαμε μια πράξη που δεν είναι καθορισμένο τι αποτέλεσμα έχει π.χ μια διάιρεση αλφαριθμητικών. Για παράδειγμα το τμήμα εντολών 

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

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

Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: Παναγιώτης Τσιωτάκης στις 13 Μάρ 2006, 05:28:28 μμ
Το οτι αναφέρει στη σελίδα 189 οτι δεν κάνει έλεγχο, σημαίνει οτι ΠΡΕΠΕΙ να κάνει έλεγχο και δεν κάνει γιατί η εστίαση της άσκησης είναι αλλού (μερικές φορές και το βιβλίο είναι αλλού).

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

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

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

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

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

Οι χαρακτήρες είναι μη αναμενόμενες είσοδοι για τη διαίρεση. Άρα αυτός ο έλεγχος ορθότητας δεδομένων δεν αφορά τον αλγόριθμο αλλά την προγραμματιστική του υλοποίηση.
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: alkisg στις 14 Μάρ 2006, 08:34:54 πμ
Χμ... συνήθως με τις ερμηνείες τέτοιων ορισμών δεν τα πάω καλά, ειδικά αν δεν μου αρέσουν! Ο Knuth είχε πει "Definiteness: Each step of the algorithm must be precisely defined..."
Για μένα, το 1/0 στη ΓΛΩΣΣΑ είναι μια χαρά ορισμένο, προκαλεί λάθος χρόνου εκτέλεσης :). Εντάξει, ο αλγόριθμος που κάνει κάτι τέτοιο έχει bug, όχι όμως ότι δεν είναι αλγόριθμος. Σε άλλες γλώσσες αν θέλει κάποιος "πιάνει" αυτό το λάθος με exception handling (όπως αναφέρεται και στο βιβλίο) και συνεχίζει κανονικά την εκτέλεση του προγράμματος. Στη Javascript είναι καλύτερα ορισμένο, επιστρέφει την τιμή infinite (άπειρο).

Ας μην εστιάζουμε μόνο στη διαίρεση με το μηδέν. Αν κατάλαβα καλά, η ερώτηση που μας απασχολεί πλέον είναι: Ένας αλγόριθμος, ο οποίος έχει υλοποιηθεί σε κάποιο προγραμματιστικό περιβάλλον, και ο οποίος είναι δυνατόν να παρουσιάσει λάθος εκτέλεσης, και επομένως (αυτό είναι υπό συζήτηση) να παραβιάσει την καθοριστικότητα, είναι αλγόριθμος ή όχι;

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

Για μένα, άλλο το "θα πρέπει να ικανοποιεί το κριτήριο της καθοριστικότητας" και άλλο το "αν δεν το ικανοποιεί τότε δεν είναι αλγόριθμος". Αν δεν το ικανοποιεί, απλά έχει bugs.
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: gpapargi στις 14 Μάρ 2006, 10:04:44 πμ
Αυτές οι κουβέντες έχουν ένα πλεονέκτημα σε σχέση με τις κουβέντες σχετικά με το τι ισχύει στη ΓΛΩΣΣΑ. Εδώ μπορούμε να καταφύγουμε στη βιβλιογραφία για να λύσουμε απορίες καθώς τα πράγματα είναι γραμμένα και αλλού. Αντίθετα στη ΓΛΩΣΣΑ τα πράγματα θα μπορούσαν να είναι με τον ένα ή τον άλλο τρόπο και συνήθως το ερώτημα ανάγεται στο τι εννοούν οι συγγραφείς.

Έριξα μια ματιά στον Knuth καθώς και στο δίκτυο και είδα τα εξής:

Κάθε βήμα του αλγορίθμου πρέπει να είναι καθορισμένο με ακρίβεια. Οι πράξεις που πρέπει να εκτελεστούν θα πρέπει να είναι αυστηρά καθορισμένες και απόλυτα σαφείς σε κάθε περίπτωση.

Αν φτάσει σε κάποιο σημείο αυτός που εκτελεί τον αλγόριθμο και πει «τώρα τι κάνουμε;» αυτό σημαίνει ότι παραβιάζεται το κριτήριο της καθοριστικότητας. Πχ το «βάλε λίγο αλάτι» σε μια μαγειρική συνταγή παραβιάζει το κριτήριο της καθοριστικότητας γιατί το «λίγο» είναι σαφές. Η διαίρεση με το 0 επίσης παραβιάζει το κριτήριο της καθοριστικότητας γιατί λέμε σε αυτόν που εκτελεί τον αλγόριθμο να κάνει κάτι που δε γίνεται και φυσικά δεν ξέρει πώς να το κάνει. Η διαίρεση με 0 αναφέρεται σχεδόν παντού σαν παράδειγμα παραβίασης της καθοριστικότητας και νομίζω πως πρέπει να το δεχτούμε.

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

Το να εισάγεις κάποιο χαρακτήρα και να τον βάλεις σα διαιρέτη σε διαίρεση (όπως στο παράδειγμα του Βαγγέλη) είναι περίεργη περίπτωση. Το θέμα είναι αν καταλαβαίνει τι πρέπει να κάνει αυτός που εκτελεί. Εμείς οι άνθρωποι μέσω τις ψευδογλώσσας δεν καταλαβαίνουμε τι πρέπει να κάνουμε. Επίσης η Pascal δεν καταλαβαίνει τι πρέπει να κάνει. Η C όμως καταλαβαίνει. Βέβαια αυτό που καταλαβαίνει δεν έχει καμία σχέση με αυτό που θα θέλαμε εμείς να καταλάβει. Τι να κάνουμε; Άλλος εκτελεί τον αλγόριθμο κάθε φορά. Στη C έχουμε λογικό λάθος.
Τα runtime errors για μένα είναι επίσης λογικά λάθη γιατί τελικά δε γίνεται αυτό που θέλουμε να γίνει.

Το ερώτημα για μένα είναι αν όταν παραβιάζεται κάποιο αλγοριθμικό κριτήριο υφίσταται αλγόριθμος ή όχι. Η λέξη «κριτήριο» είναι βαριά. Σημαίνει ότι καθορίζει (κρίνει) αν ισχύει κάτι ή όχι. Πχ στα κριτήρια ισότητας τριγώνων, αν πληρούνται τα τρίγωνα είναι ίσα, ενώ αν δεν πληρούνται τότε δεν είναι ίσα. Το βιβλίο δείχνει να στρέφεται σε αυτή την κατεύθυνση.

Το έχουμε ξαναθίξει το θέμα. Τόσα προγράμματα στην πράξη δεν τερματίζουν ποτέ αλλά τρέχουν σα deamons στο background (ftp servers, mail servers). Μου φαίνεται χοντρό το να μην αποκαλούμαι αυτά αλγορίθμους επειδή παραβιάζουν την περατότητα. Εγώ θα χρησιμοποιούσα μια λιγότερο βαριά λέξη. Θα τα έλεγα «χαρακτηριστικά αλγορίθμων» ας πούμε. Ακόμα και στις πανελλήνιες το 2005 (θέμα 1Α2) ρωτάει πιο κριτήριο δεν ικανοποιεί ο παρακάτω αλγόριθμος. Και δίνει ένα ατέρμονα  βρόχο. Σύμφωνα με το σκεπτικό αυτό θα έπρεπε να μην το αποκαλεί αλγόριθμο. Δεν ξέρω… μου φαίνεται χοντρό το να μην αποκαλείς αλγόριθμο κάτι που παραβιάζει κάποιο κριτήριο.

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

ΥΓ
Τώρα είδα ότι έστειλες και εσύ ʼλκη. Δε σε έχω διαβάσει ακόμα. Στέλνω και εγώ και τα ξαναλέμε.
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: evry στις 14 Μάρ 2006, 04:09:50 μμ
   Κατ'αρχήν όσον αφορά το μάθημα πιστεύουμε ότι λέει το βιβλίο και είμαστε όλοι ευτυχισμένοι (εκτός από τους μαθητές :-) ).
   Εγώ εκφράζω την καθοριστικότητα ενός αλγορίθμου με τα εξής λόγια στους μαθητές "Αν γνωρίζουμε για όλες τις δυνατές εισόδους του αλγορίθμου ποια θα είναι η έξοδος τότε ο αλγόριθμος πληρεί το κριτήριο της καθοριστικότητας"

   Γενικότερα τώρα τα κριτήρια του αλγορίθμου έχουν θεωρητική σημασία. Η επιστήμη της πληροφορικής δεν βασίζεται στο ρήτο "ότι δέχεται ο compiler είναι σωστό" ή "κάνουμε το σταυρό μας να τρέξει". Υπάρχουν σοβαρές θεωρητικές βάσεις τις οποίες οι περισσότεροι αγνοούν και νομίζουν ότι η πληροφορική είναι η επιστήμη του ποντικιού, του joystick και στην καλύτερη περίπτωση του Internet.
     Η θεωρία της πληροφορικής η οποία πήρε ουσιαστικά υπόσταση  από τον Turing όταν ο ίδιος απέδειξε ότι δεν μπορεί να κατασκευαστεί αλγόριθμος ο οποίος να αποφασίζει αν ένας άλλος αλγόριθμος τερματίζει ή όχι, διδάσκεται στα πανεπιστήμια ως θεωρία υπολογισμού.
     Τα κριτήρια ενός αλγορίθμου έχουν σημασία όταν μελετάμε τον αλγόριθμο από τη θεωρητική σκοπιά του, δηλαδή όταν θέλουμε να αποδείξουμε ότι έχει κάποιες συγκεκριμένες ιδιότητες.
     Για έναν προγραμματιστή αυτό δε σημαίνει τίποτα. Το μόνο που τον ενδιαφέρει είναι να δουλέψει το πρόγραμμά του. Υπάρχουν πολλοί καλοί προγραμματιστές οι οποίοι ούτε ξέρουν ούτε θέλουν να μάθουν τα αλγοριθμικά κριτήρια γιατί αυτό που έχουν φτιάξει δεν τους νοιάζει αν είναι αλγόριθμος. Είναι μια υπολογιστική διαδικασία κωδικοποιημένη σε κάποια γλώσσα προγραμματισμού όπως η παρακάτω :

      for (int i=1 ; ; i++)
  {
      cin >> a;
      if (!a)     
         break;
  }

Πάντως το παραπάνω είναι αλγόριθμος έτσι;

και μια και μιλάμε για το πρακτικό κομμάτι του προγραμματισμού τι θα λέγατε για την παρακάτω άσκηση; Έχει θέση στο μάθημα της ΑΕΠΠ;

Να γράψετε ένα πρόγραμμα το οποίο να τυπώνει τον εαυτό του
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: alkisg στις 14 Μάρ 2006, 05:19:13 μμ
@gpapargi: απ' ότι βλέπω συμφωνούμε σε όλα εκτός από το κομμάτι της διαίρεσης! Το παρακάτω κομμάτι σε javascript (=διαίρεση με το μηδέν) δεν παραβιάζει το κριτήριο της καθοριστικότητας, αλλά της περατότητας:
Κώδικας: [Επιλογή]
var N = 1/0; //Αυτό εκτελείται κανονικά και το Ν γίνεται άπειρο
for (var i = 0; i < N; i++) !Άπειρο loop
  document.write(i, N);

@evry: πώς είναι δυνατόν να λυθεί αυτή η άσκηση χωρίς αρχεία;
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: evry στις 14 Μάρ 2006, 06:25:46 μμ

@alkisg
Κατ'αρχήν όσον αφορά την javascript δεν πρόκειται για γλώσσα προγραμματισμού αλλα για script γλώσσα η οποία κατά τη γνώμη μου παραβιάζει όλα τα κριτήρια που πρέπει να πληρεί μια γλώσσα προγραμματισμού. Η γλώσσα αυτή είναι ένα καλό παράδειγμα για να δει κάποιος πόσο απέχει η θεωρία από την πράξη. Μια γλώσσα στην οποία όλα είναι φλου, είναι από τις πιο δημοφιλείς γλώσσες που χρησιμοποιούνται για τη δημιουργία δυναμικών ιστοσελίδων.

Τώρα όσον αφορά την άσκηση:
   Δεν χρειάζεται να χρησιμοποιήσεις αρχεία. Το πρόβλημα μπορεί να λυθεί αν ορίσεις ένα πίνακα από ΧΑΡΑΚΤΗΡΕΣ μέσα στον όποιο θα έχεις αρκετές από τις γραμμές κώδικα του προγράμματός σου. Στη συνέχεια θα χρησιμοποιήσεις επαναληπτική δομή για να εμφανίσεις τα περιεχόμενα του  πίνακα 2 ή 3 φορές. Με λίγο πειραματισμό βγαίνει.
  Δηλαδή η άσκηση μπορεί να γίνει κανονικά στη ΓΛΩΣΣΑ. Απλά ορίζεις ένα κατάλληλο πίνακα με χαρακτήρες.

Τώρα αν ψάξεις στο google για "self reproducing programs" θα βρεις διάφορα ενδιαφέροντα sites όπως είναι το
http://www.nyx.net/~gthompso/quine.htm
που έχει τέτοια προγράμματα σε όλες σχεδόν τις γλώσσες.

Επίσης μια καλή εργασία περί του θέματος υπάρχει στο
http://www.cgl.uwaterloo.ca/~csk/washington/paper/toc.html

Το συγκεκριμένο θέμα το συνάντησα πρώτη φορά όταν μου το έβαλε άσκηση κάποιος. Μετά από καιρό διάβασα την ομιλία του Ken Thomson για το βραβείο Turing (τα αντίστοιχα Nobel πληροφορικής) που πήρε. Μπορείς να βρεις την ομιλία του στο
http://cm.bell-labs.com/who/ken/trust.html η οποία μάλιστα αναφέρεται στο πως μπορείς να υποκλέψεις τα πάντα εμφυτεύοντας ένα δούρειο ίππο μέσα σε έναν μεταγλωττιστή.

Η υλοποίηση ενός τέτοιου προγράμματος δεν είναι κάτι δύσκολο, αλλά δεν είναι και κάτι απλό. Θα μπλεχτείς σίγουρα στην αρχή αλλά είναι πολύ καλή άσκηση για έναν πρωτοετή φοιτητή πληροφορικής.
Φυσικά ότι πρόγραμμα και να φτιάξεις βλέπεις στο διαδίκτυο κάτι λύσεις όπως η

Κώδικας: [Επιλογή]
char*f="char*f=%c%s%c;%cmain(){printf(f,34,f,34,10,10);}%c";
    main(){printf(f,34,f,34,10,10);}

και καταλαβαίνεις ότι   C RULES !!!

Πρόσεξε ότι στο άρθρο του ο Ken Thomson λέει πως η άσκηση δεν ήταν να φτιάξεις ένα τέτοιο πρόγραμμα, αυτό εννοείται. Το δύσκολο κατά αυτόν είναι να φτιάξεις το μικρότερο δυνατό πρόγραμμα!!!!

Και μετά καθόμαστε και ασχολούμαστε με τις ασάφειες του βιβλίου της ΑΕΠΠ
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: alkisg στις 14 Μάρ 2006, 09:57:53 μμ
//start offtopic
@evry: για την javascript δεν έχεις δίκιο... οι γλώσσες προγραμματισμού αναπτύσσονται ανάλογα με τις εκάστοτε ανάγκες και δεν είναι αναγκαίο να είναι όλες strongly typed... σε παραπέμπω στο reintroduction to javascript (http://www.freestuff.gr/forums/viewtopic.php?t=21175) από έναν guru της γλώσσας, μεταφρασμένο στα ελληνικά από κάποιον φίλο μου (και πορωμένο javascript-άκια)! Ειδικά τα object prototypes είναι πολύ έξυπνη ιδέα, μακάρι να την είχαν και άλλες γλώσσες...

Για το self reproducing πρόγραμμα: δεν είχα καταλάβει την εκφώνηση! Οκ, θα βρω μια σύντομη εκδοχή σε ΓΛΩΣΣΑ και θα επανέλθω!
//end offtopic
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: evry στις 14 Μάρ 2006, 10:48:21 μμ
Κοίτα, δεν αφόρισα την javascript απλά πιστεύω ότι είναι υπερβολικά loosely typed με αποτέλεσμα να συμβαίνουν πιο εύκολα runtime errors. Σίγουρα για αυτό που φτιάχθηκε κάνει πολύ καλά τη δουλειά της και μερικές φορές νοιώθεις πραγματικά ότι σου λύνει τα χέρια όμως δεν τη θεωρώ καλό παράδειγμα όταν μιλάμε για προγραμματισμό.

   Όσον αφορά αυτό που είπες σχετικά με τα object prototypes, ναι είναι καλή ιδέα όσον αφορά τον προγραμματισμό και όχι όσον αφορά γενικότερα την τεχνολογία λογισμικού. Το συγκεκριμένο είδος προγραμματισμού (object-based ή prototype-based) είναι η αδυναμία μου. Μπορείς να κάνεις φοβερά πράγματα όπως η δυναμική κληρονομικότητα και άλλα. Έχει απίστευτη ευελιξία όμως είναι είδος προγραμματισμού το οποίο θέλει πολύ ικανούς προγραμματιστές σε αντίθεση με γλώσσες όπως η Java που σε παίρνει από το χεράκι. Είχα κάνει παλιά μια εργασία πάνω σε αυτές τις γλώσσες και συγκεκριμένα πάνω στη Self που είναι καθαρή object based γλώσσα (http://research.sun.com/self/), δεν ορίζεις κλάσεις αλλά μόνο αντικείμeνα. Δυστυχώς όμως η γλώσσα αυτή εγκαταλείφθηκε μια και το κεφάλι της ομάδας ο Chambers πήγε να δουλέψει σε άλλη ομάδα της SUN (μάλλον στη Java). Επίσης αν θυμάμαι καλά ο interpreter πoυ είχαν φτιάξει ήταν μόνο για unix.

Αυτά , πάω να διαβάσω το tutorial για javascript, καλό φαίνεται :-)

//start offtopic
@evry: για την javascript δεν έχεις δίκιο... οι γλώσσες προγραμματισμού αναπτύσσονται ανάλογα με τις εκάστοτε ανάγκες και δεν είναι αναγκαίο να είναι όλες strongly typed... σε παραπέμπω στο reintroduction to javascript (http://www.freestuff.gr/forums/viewtopic.php?t=21175) από έναν guru της γλώσσας, μεταφρασμένο στα ελληνικά από κάποιον φίλο μου (και πορωμένο javascript-άκια)! Ειδικά τα object prototypes είναι πολύ έξυπνη ιδέα, μακάρι να την είχαν και άλλες γλώσσες...

Για το self reproducing πρόγραμμα: δεν είχα καταλάβει την εκφώνηση! Οκ, θα βρω μια σύντομη εκδοχή σε ΓΛΩΣΣΑ και θα επανέλθω!
//end offtopic
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: alkisg στις 15 Μάρ 2006, 12:51:10 πμ
//start offtopic
Δυστυχώς η ΓΛΩΣΣΑ δεν επιτρέπει και πολλά κολπάκια... Ούτε καν newline δεν μπορεί να γραφεί χωρίς ξεχωριστή ΓΡΑΨΕ! :( 35 γραμμές λοιπόν:
[glossa]ΠΡΟΓΡΑΜΜΑ ΓράφωΤονΕαυτόΜου
ΜΕΤΑΒΛΗΤΕΣ
  ΧΑΡΑΚΤΗΡΕΣ: Χ[19]
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  Χ[1] <- ''''
  Χ[2] <- '  Χ['
  Χ[3] <- '] <-'
  Χ[4] <- 'ΠΡΟΓΡΑΜΜΑ ΓράφωΤονΕαυτόΜου'
  Χ[5] <- 'ΜΕΤΑΒΛΗΤΕΣ'
  Χ[6] <- '  ΧΑΡΑΚΤΗΡΕΣ: Χ[19]'
  Χ[7] <- '  ΑΚΕΡΑΙΕΣ: ι'
  Χ[8] <- 'ΑΡΧΗ'
  Χ[9] <- '  ΓΙΑ ι ΑΠΟ 4 ΜΕΧΡΙ 8'
  Χ[10] <- '  ΓΡΑΨΕ Χ[ι]'
  Χ[11] <- '  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ'
  Χ[12] <- '  ΓΡΑΨΕ Χ[2], 1, Χ[3], Χ[1], Χ[1], Χ[1], Χ[1]'
  Χ[13] <- '  ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ 19'
  Χ[14] <- '  ΓΡΑΨΕ Χ[2], ι, Χ[3], Χ[1], Χ[ι], Χ[1]'
  Χ[15] <- '  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ'
  Χ[16] <- '  ΓΙΑ ι ΑΠΟ 9 ΜΕΧΡΙ 19'
  Χ[17] <- '  ΓΡΑΨΕ Χ[ι]'
  Χ[18] <- '  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ'
  Χ[19] <- 'ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ'
  ΓΙΑ ι ΑΠΟ 4 ΜΕΧΡΙ 8
    ΓΡΑΨΕ Χ[ι]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΡΑΨΕ Χ[2], 1, Χ[3], Χ[1], Χ[1], Χ[1], Χ[1]
  ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ 19
    ΓΡΑΨΕ Χ[2], ι, Χ[3], Χ[1], Χ[ι], Χ[1]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΙΑ ι ΑΠΟ 9 ΜΕΧΡΙ 19
    ΓΡΑΨΕ Χ[ι]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ[/glossa]
//end offtopic
Τίτλος: Απ: Λογικά λάθη και λάθη κατά την εκτέλεση
Αποστολή από: gpapargi στις 15 Μάρ 2006, 11:22:45 μμ
Άλκη καθόλου δε διαφωνούμε στο θέμα της διαίρεσης. Απλά όταν έγραψα αυτά που έγραψα δεν ειχα στο νου μου μια γλωσσα που χειρίζεται από μόνη της τη διαίρεση αλλά τις γλώσσες που δεν τη χειρίζονται. Προφανώς η javascript καταλαβαίνει ότι γίνεται διαίρεση με 0 και γυρίζει άπειρο χωρίς να κάνει τη διαίρεση. Δηλαδή κάνει κάτι σαν αυτό που κάνουμε εμείς σε γλώσσες που δε διαιρούν με 0 διακρίνοντας περιπτώσεις. Η ουσία είναι νομίζω αυτό που έραψα:
«Το βασικό δηλαδή είναι αυτός που εκτελεί τον αλγόριθμο να ξέρει κάθε φορά τι πρέπει να κάνει.»

Η javascript  ξέρει τι πρέπει να κάνει ενώ άλλες γλώσσες όχι και πρέπει εμείς να χειριστούμε την κατάσταση. Προφανώς στην javascript η διαίρεση με 0 δεν παραβιάζει την καθοριστικότητα.

Εδώ βέβαια ίσως κάποιος μαθηματικός να θέσει μια ένσταση του στυλ «Η διαίρεση με 0 δεν κάνει άπειρο, απλά δεν ορίζεται, όπως δεν ορίζεται και η συνάρτηση 1/χ^2 στο 0.» Δηλαδή να σου πει ότι 1/0 δεν κάνει άπειρο αλλά δεν ορίζεται. Όπως και η 1/χ^2 στο 0 δεν παίρνει τιμή άπειρο αλλά δεν ορίζεται.

Γενικά υπάρχουν διαφωνίες μεταξύ μαθηματικών και άλλων επιστημών που έχουν άμεση σχέση με τα μαθηματικά. Πχ η συνάρτηση  dirac που στο 0 είναι άπειρο και παντού αλλού είναι 0, για τους μαθηματικούς δεν είναι και πολύ συνάρτηση. Οι φυσικοί όμως ορίζουν και το ολοκλήρωμά της.

Αλλά αυτό δεν αλλάζει τα όσα λέμε. Ότι κι αν συμφωνήσουμε ότι σημαίνει η διαίρεση με 0 μπορούμε να φτιάξουμε μια γλώσσα ώστε να κάνει αυτό ακριβώς. Το βασικό είναι αυτός που εκτελεί τον αλγόριθμο να μην αναρωτηθεί «τι πρέπει να κάνω τώρα;»

Evry είμαι από αυτούς που θέλουν η γνώση στην πληροφορική να έχει από κάτω της βαθύ θεωρητικό υπόβαθρο. Γι αυτό και όταν παράγω ένα τύπο (έστω και για την ΑΕΠΠ) τον συνοδεύω από απόδειξη. Εδώ όμως στα αλγοριθμικά κριτήρια υπάρχουν μπλεξίματα. Πχ το βιβλίο λέει στο κριτήριο της εισόδου ότι «Καμία, μία ή περισσότερες τιμές πρέπει να δίνονται ως είσοδοι στον αλγόριθμο».
Δηλαδή μπορεί στον αλγόριθμο να δίνεται ως είσοδος και «καμία» τιμή. Ποια η διαφορά του να πούμε «αυτός ο αλγόριθμος έχει για είσοδο καμία τιμή» με το να πούμε «αυτός ο αλγόριθμος δεν έχει είσοδο». Τι είδους κριτήριο είναι αυτό που πρέπει να ικανοποιείται απαραίτητα;

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

Επίσης για το θέμα του προγράμματος που εκτυπώνει τον εαυτό του θέλω να πω τα εξής:
Οι γριφώδης καταστάσεις ήταν ανέκαθεν το χόμπυ μου. Έχω πιάσει τον εαυτό μου να βελτιώνεται πολύ σε θέματα μαθηματικών αλλά και κατασκευής αλγορίθμων μέσα από αυτό το χόμπυ.
Πιστεύω ότι πρόκειται για μια πρώτης τάξεως γυμναστική μυαλού που μπορεί να βελτιώσει το μαθητή σε θέματα αυτοσχεδιασμού σε όλα τα μαθήματα (μαθηματικά, φυσική, ΑΕΠΠ). Έτσι ενθαρρύνω τους μαθητές να ασχολούνται με τέτοια. Το πρόβλημα είναι ότι, αν και θα το ήθελα, δεν μπορώ να θέσω ένα τέτοιο πρόβλημα ευθέως στα πλαίσια κάποιου μαθήματος. Καμιά φορά (εκτός μαθήματος) το κάνω με σκοπό να κεντρίσω το ενδιαφέρον τους και να ακονίσω το μυαλό τους. Αυτό αυξάνει και το ενδιαφέρον των μαθητών και δίνει χρώμα στο μάθημα.Σε όλους αρέσουν τα λεγόμενα «ψυχαγωγικά μαθηματικά» αλλά η ύλη του μαθήματος είναι περιοριστική. Νομίζω ότι το θέμα του προγράμματος που εκτυπώνει το εαυτό του, μπορεί να τεθεί με τη διευκρίνηση ότι πρόκειται για μια ενδιαφέρουσα σπαζοκεφαλιά, είναι εκτός των στενών πλαισίων της ΑΕΠΠ και έχει σκοπό να εξασκήσει την πρωτοτυπία των μαθητών.