THMMY.gr

Ηλεκτρονικοί Υπολογιστές και Τεχνικά Θέματα => Προγραμματισμός (C, VB, Delphi, PHP, ASP...) => Topic started by: Nessa NetMonster on May 26, 2004, 13:37:30 pm



Title: Προγραμματάκι QuickBasic
Post by: Nessa NetMonster on May 26, 2004, 13:37:30 pm
Δείτε παιδιά ένα προγραμματάκι σε QuickBasic.

input n
for i=1 to n
input k
rem print mo;"+";k/n;"=";mo+k/n
mo=mo+k/n
next
print mo

Τι κάνει αυτό; Υπολογίζει το μέσο όρο mo n αριθμών, έτσι; Αμ δε! Δοκιμάστε το πχ με n=10 και τους αριθμούς 40 52 64 35 78 90 2 56 101 26. Για να δείτε το παράδοξο σε όλο του το μεγαλείο, βγάλτε το rem από την print και δείτε την πρόσθεση!

Ε, τέτοια πρόσθεση δεν έχω ξαναδεί...


Title: Re:Όποιος μπορεί να μου το εξηγήσει αυτό...
Post by: Lurpak on May 26, 2004, 20:56:49 pm
Τι κάνει αυτό; Υπολογίζει το μέσο όρο mo n αριθμών, έτσι; Αμ δε!

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


Title: Re:Όποιος μπορεί να μου το εξηγήσει αυτό...
Post by: bakeneko on May 27, 2004, 03:46:37 am
'Η και αλλιώς να βάλεις mo=(mo+k)/2 (μέσα στο βρόγχο - εντάξει τώρα μη μου πείτε "βγαίνει λάθος για n=1"  :P )... Αν ασχολείσαι με παιδιά της Micro$oft αυτά παθαίνεις (άσχετο αλλά λέμε τώρα  ;D )


Title: Re:Όποιος μπορεί να μου το εξηγήσει αυτό...
Post by: Lurpak on May 27, 2004, 04:18:41 am
'Η και αλλιώς να βάλεις mo=(mo+k)/2 (μέσα στο βρόγχο)

Βρε Ratt; Πως προέκυψε αυτό;

Nessa ο τύπος που χρησιμοποιείς είναι εν μέρη σωστός (μαθηματικά αλλά όχι προγραμματιστικά) και βγάζει αποτελέσματα αν το πηλίκο δεν είναι άρρητος αριθμός. Επίσης πρόσεξε πως ορίζεις τον mo, αν το έχεις ορίσει integer τοτε θα σου βγάζει πάλι λάθη.


Title: Re:Όποιος μπορεί να μου το εξηγήσει αυτό...
Post by: bakeneko on May 27, 2004, 06:04:13 am
Ναι πριν κοιμηθώ μου ήρθε στο μυαλό το λάθος μου και μπας και προλαβω να το διορθώσω..  :P καλά όλοι χαράματα κάνετε surfing!!? θα έπρεπει να μπει κάπως έτσι
input n
input k
mo=k
for i=2 to n
input k
mo=(mo+k)/n
next
αλλά αυτή η λύση είναι γενικά χάλια γι αυτό απορρίπτεται :P


Title: Re:Όποιος μπορεί να μου το εξηγήσει αυτό...
Post by: Nessa NetMonster on May 27, 2004, 11:14:23 am
Rattlehead... χε χε χε... καλή προσπάθεια. ;D ;D ;D

Ηθικόν δίδαγμα: Ποτέ μη γράφεις πρόγραμμα νυσταγμένος! ;)

Lurpak, το σκέφτηκα αυτό με το mo και ξαναέγραψα το ίδιο πρόγραμμα σε C. Όμως ακόμα και όταν το ορίζω σαν float κάνει τα ίδια και χειρότερα... μάλιστα έχω την εντύπωση ότι σε κάθε επανάληψη αφαιρεί από το mo κάτι σαν 0.0000002 ή 0.0000003, οπότε ανά δυο-τρεις επαναλήψεις εμφανίζεται μειωμένο κατά 0.000001 (αφού εκτυπώνει μόνο 6 δεκαδικά). Επίσης προσέχω να μη βάζω άρρητους (βάζω πλήθος 2, 10 ή 5) αλλά και πάλι για κάποιο λόγο μπερδεύεται.

Τι να πεις; ʼντε να το κάνω και σε Pascal... :(


Title: Re:Όποιος μπορεί να μου το εξηγήσει αυτό...
Post by: Lurpak on May 27, 2004, 11:19:19 am
Nessa γενικά στον προγραμματισμό μπορούν να προκύψουν λαθάκια αυτής της τάξης μεγέθους σε διαιρέσεις. Γι' αυτό καλό θα είναι να ταποφεύγουμε τέτοιου είδους διαιρέσεις σε επαναληπτικές διαδικασίες γιατί τελικά προκύπτει σφάλμα. Γιατί δεν κάνεις ότι όλος ο κόσμος, να υπολογίσεις το sum στην επαναληπτική και μετά με "μία" διαίρεση τον mo;