ggeo1 Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Δεν μπορώ να καταλάβω πως λειτουργεί σωστά το παρακάτω. Πρέπει η f(x) να μου δώσει "6" και η g(x) να δώσει "7" ,όμως παίρνω αποτέλεσμα "5" και για τις δυο. > double f(double x){ return x*x; } double g(double x){ return x+x; } double runge(double (*fact)(double)){ double x; return (fact(x)+5.0); } int main() { double x=1.0; cout <<"\nf(x)= "<<runge(f)<<"\ng(x)= "<<runge(g)<<endl; return 0; }
migf1 Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Εσύ τον έγραψες αυτόν τον κώδικα ή στον έδωσαν για να τον διορθώσεις ώστε να σου βγάζει 6 και 7; Όπως είναι τώρα, σωστά ΔΕΝ σου βγάζει 6 και 7 ! Έτσι όπως είναι βγάζει ότι να 'ναι (και σωστά βγάζει ότι να 'ναι).
parsifal Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Δε δίνεις τιμή στη μεταβλητή x της συνάρτησης runge. Ελπίζω να γνωρίζεις πως ορίζοντας και δίνοντας τιμή σε μία μεταβλητή με το ίδιο όνομα στη main δεν αρκεί, γιατί δεν πρόκειται για την ίδια μεταβλητή...
ggeo1 Δημοσ. 2 Αυγούστου 2011 Μέλος Δημοσ. 2 Αυγούστου 2011 Όχι,εγώ κάνω δοκιμές για να καταλάβω. Και πως δηλ μπορεί να μου βγάλει αυτό που θέλω?
migf1 Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Όχι,εγώ κάνω δοκιμές για να καταλάβω. Και πως δηλ μπορεί να μου βγάλει αυτό που θέλω? Την αρχικοποίηση του x κάντην στην runge και όχι στη main EDIT: Με πρόλαβε ο φίλος parsifal! Έτσι όπως το χες πριν σου έβγαζε 5 και 5 γιατί το x της runge ο compiler σου το αρχικοποιούσε σε 0. Όμως το στάνταρ της γλώσσας δεν υποχρεώνει αρχικοποιήση σε auto vars... βασικά είναι undefined αν δεν τις αρχικοποιήσεις μόνος σου.
godlike Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Βασικά είναι τελείως λάθος η function runge και η γενικότερη λογική. Μέσα στην runge χρησιμοποιείς unitialized τον x και τυχαίνει να παίρνει την τιμή 0 πότε το αποτέλεσμα είναι συνέχεια 0 + 5. double runge(double (*fact)(double), double x) { return (fact(x) + 5.0); }
ggeo1 Δημοσ. 2 Αυγούστου 2011 Μέλος Δημοσ. 2 Αυγούστου 2011 Ελπίζω να γνωρίζεις πως ορίζοντας και δίνοντας τιμή σε μία μεταβλητή με το ίδιο όνομα στη main δεν αρκεί, γιατί δεν πρόκειται για την ίδια μεταβλητή... Εντάξει,αυτό το γνωρίζω ,είπαμε είμαστε ψιλοάσχετοι.. Απλά,το σκέφτηκα σα να είχα μια απλή συνάρτηση ,για παράδειγμα αν κάνω : .... int main() { double x=1.0; cout <<"\nf(x)= "<<runge(f)<<"\ng(x)= "<<runge(g)<<endl; cout <<f(x); return 0; } θα μου δώσει τη σωστή τιμή της συνάρτησης f. Αλλά απότι κατάλαβα τώρα ,σε συνάρτηση με όρισμα συνάρτηση δε γίνεται αυτό? Ευχαριστώ όλους! double runge(double (*fact)(double), double x) { return (fact(x) + 5.0); } Εντάξει,αυτό καλό! Ευχαριστώ!
V.I.Smirnov Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Αλλά απ' ότι κατάλαβα τώρα ,σε συνάρτηση με όρισμα συνάρτηση δε γίνεται αυτό? Μια χαρά γίνεται. Δεν απάντησα από το προηγούμενο thread διότι βαρέθηκα και είπα να αφήσω κάποιον άλλον καλοθελητή. Οι φίλοι που σου απάντησαν εδώ δεν κατάλαβαν το πραγματικό σου πρόβλημα (παρόλο που το λέει ο τίτλος του thread). To ερώτημα λοιπόν είναι : πώς μπορεί μια συνάρτηση f(..) που εκτελεί αριθμητικές διεργασίες να λάβει ως όρισμα μιαν άλλη g(x) ώστε η f να εκτελεί τις πράξεις επί της g ; (π.χ. μια συνάρτηση που κάνει αριθμητική παραγώγιση, ολοκλήρωση κ.α.) Πέραν των παραπάνω, η προσπάθειά σου να εξασκήσεις την C++ μέσω της αριθμητικής ανάλυσης είναι από τις καλύτερες διδακτικές προσεγγίσεις. Εγώ έμαθα κάποτε C++ (και) με αυτόν τον τρόπο. -
migf1 Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Δηλαδή θέλει να κάνει κάτι σαν το παρακάτω (μπερδεύτηκα) ; > // ------------------------------------------------------------------------- double f( double x ) { return x+5; } // ------------------------------------------------------------------------- void g( double (*func)(double), double x ) { printf("%g\n", 2.0 * func(x) ); return 0; } // ------------------------------------------------------------------------- int main( void ) { g( &f, 100 ); return; } Για να βγάλει έξοδο 210 για παράδειγμα;
V.I.Smirnov Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Aκριβώς !! Eξάλλου το "runge()" που έχει στο post #1 υποδηλώνει ότι ο φίλος μαστορεύει κάτι για αριθμητική λύση δ.ε. ... -
migf1 Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Γιατί όμως να μπλέξει έτσι; Είναι πολύ unreadable αυτός ο κώδικας, δεν βολεύει απλά να καλεί την f μέσα στην g?
παπι Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Δες και http://www.cplusplus.com/reference/std/functional/
V.I.Smirnov Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Γιατί όμως να μπλέξει έτσι; Είναι πολύ unreadable αυτός ο κώδικας, δεν βολεύει απλά να καλεί την f μέσα στην g? Δεν είναι έτσι. Aυτό που λες ισοδυναμεί (κάπως) με το να μην χρησιμοποιούνται ορίσματα στις συναρτήσεις αλλά να έχουν τεθεί ως καθολικές μεταβλητές... Έστω ότι γράφεις μια ρουτίνα π.χ. για αριθμητική λύσης μιας εξίσωσης. Η σωστή προσέγγιση είναι να δέχεται ως όρισμα την συνάρτηση f επί της οποίας δρα (δηλ. την εξ. f=0) και να επιστρέφει την ρίζα. Σκέψου το έτσι και θα δεις πόσο σκόπιμο είναι... -
migf1 Δημοσ. 2 Αυγούστου 2011 Δημοσ. 2 Αυγούστου 2011 Έχω κατα μπερδευτεί ομολογώ Εννοώ πως η f() και g() έτσι κι αλλιώς είναι ορισμένες στο ίδιο scope, οπότε δεν υπάρχει πρόβλημα στο να καλεί η μια την άλλη οποτεδήποτε. Θα μπορούσε να περνάει π.χ. ως όρισμα στη g() τις μεταβλητές που πρέπει να περαστούν στην f(), και η g() να καλεί την f() περνώντας της τις μεταβλητές (ορίσματα). Αν έχω καταλάβει δηλαδή τι θέλουμε να κάνουμε (δεν είμαι σίγουρος πως έχω καταλάβει πάντως ).
ggeo1 Δημοσ. 2 Αυγούστου 2011 Μέλος Δημοσ. 2 Αυγούστου 2011 Smirnov και migf1 ,έτσι ακριβώς είναι! Όντως,ασχολούμαι με προβλήματα αριθμητικής ανάλυσης(και για εξάσκηση και γιατί μας έβαζαν τέτοια προβλήματα). (και ναι θέλω να υλοποιήσω την runge-kutta) (και Smirnov ,οκ , σε ευχαριστώ για την πολύτιμη βοήθεια σου αυτές τις ημέρες!)
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.