Προς το περιεχόμενο

c++ -- συνάρτηση ως όρισμα σε άλλη -- τι κάνω λάθος?


ggeo1

Προτεινόμενες αναρτήσεις

Δημοσ.

Δεν μπορώ να καταλάβω πως λειτουργεί σωστά το παρακάτω.

Πρέπει η 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;
}

Δημοσ.

Εσύ τον έγραψες αυτόν τον κώδικα ή στον έδωσαν για να τον διορθώσεις ώστε να σου βγάζει 6 και 7;

 

Όπως είναι τώρα, σωστά ΔΕΝ σου βγάζει 6 και 7 ! Έτσι όπως είναι βγάζει ότι να 'ναι (και σωστά βγάζει ότι να 'ναι).

Δημοσ.

Δε δίνεις τιμή στη μεταβλητή x της συνάρτησης runge.

 

Ελπίζω να γνωρίζεις πως ορίζοντας και δίνοντας τιμή σε μία μεταβλητή με το ίδιο όνομα στη main δεν αρκεί, γιατί δεν πρόκειται για την ίδια μεταβλητή... ;)

Δημοσ.

Όχι,εγώ κάνω δοκιμές για να καταλάβω.

 

Και πως δηλ μπορεί να μου βγάλει αυτό που θέλω?

Την αρχικοποίηση του x κάντην στην runge και όχι στη main ;)

 

EDIT: Με πρόλαβε ο φίλος parsifal!

 

Έτσι όπως το χες πριν σου έβγαζε 5 και 5 γιατί το x της runge ο compiler σου το αρχικοποιούσε σε 0. Όμως το στάνταρ της γλώσσας δεν υποχρεώνει αρχικοποιήση σε auto vars... βασικά είναι undefined αν δεν τις αρχικοποιήσεις μόνος σου.

Δημοσ.

Βασικά είναι τελείως λάθος η function runge και η γενικότερη λογική. Μέσα στην runge χρησιμοποιείς unitialized τον x και τυχαίνει να παίρνει την τιμή 0 πότε το αποτέλεσμα είναι συνέχεια 0 + 5.

 

double runge(double (*fact)(double), double x)

{

return (fact(x) + 5.0);

}

Δημοσ.
Ελπίζω να γνωρίζεις πως ορίζοντας και δίνοντας τιμή σε μία μεταβλητή με το ίδιο όνομα στη main δεν αρκεί, γιατί δεν πρόκειται για την ίδια μεταβλητή...

Εντάξει,αυτό το γνωρίζω :rolleyes: ,είπαμε είμαστε ψιλοάσχετοι..

 

Απλά,το σκέφτηκα σα να είχα μια απλή συνάρτηση ,για παράδειγμα αν κάνω :

 

....

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);

}

 

Εντάξει,αυτό καλό! :rolleyes:

Ευχαριστώ!

Δημοσ.

Αλλά απ' ότι κατάλαβα τώρα ,σε συνάρτηση με όρισμα συνάρτηση δε γίνεται αυτό?

 

Μια χαρά γίνεται.

Δεν απάντησα από το προηγούμενο thread διότι βαρέθηκα και είπα να αφήσω κάποιον άλλον καλοθελητή.

 

Οι φίλοι που σου απάντησαν εδώ δεν κατάλαβαν το πραγματικό σου πρόβλημα

(παρόλο που το λέει ο τίτλος του thread).

 

To ερώτημα λοιπόν είναι : πώς μπορεί μια συνάρτηση f(..) που εκτελεί αριθμητικές διεργασίες να λάβει

ως όρισμα μιαν άλλη g(x) ώστε η f να εκτελεί τις πράξεις επί της g ;

(π.χ. μια συνάρτηση που κάνει αριθμητική παραγώγιση, ολοκλήρωση κ.α.)

 

 

Πέραν των παραπάνω, η προσπάθειά σου να εξασκήσεις την C++ μέσω της αριθμητικής ανάλυσης είναι από

τις καλύτερες διδακτικές προσεγγίσεις.

Εγώ έμαθα κάποτε C++ (και) με αυτόν τον τρόπο.

 

-

Δημοσ.

Δηλαδή θέλει να κάνει κάτι σαν το παρακάτω (μπερδεύτηκα) ;

 

>
// -------------------------------------------------------------------------
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 για παράδειγμα;

Δημοσ.

Γιατί όμως να μπλέξει έτσι; Είναι πολύ unreadable αυτός ο κώδικας, δεν βολεύει απλά να καλεί την f μέσα στην g?

 

 

Δεν είναι έτσι.

Aυτό που λες ισοδυναμεί (κάπως) με το να μην χρησιμοποιούνται ορίσματα στις συναρτήσεις αλλά να

έχουν τεθεί ως καθολικές μεταβλητές...

 

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

Η σωστή προσέγγιση είναι να δέχεται ως όρισμα την συνάρτηση f επί της οποίας δρα (δηλ. την εξ. f=0) και να επιστρέφει την ρίζα.

 

Σκέψου το έτσι και θα δεις πόσο σκόπιμο είναι...

 

-

Δημοσ.

Έχω κατα μπερδευτεί ομολογώ :(

 

Εννοώ πως η f() και g() έτσι κι αλλιώς είναι ορισμένες στο ίδιο scope, οπότε δεν υπάρχει πρόβλημα στο να καλεί η μια την άλλη οποτεδήποτε. Θα μπορούσε να περνάει π.χ. ως όρισμα στη g() τις μεταβλητές που πρέπει να περαστούν στην f(), και η g() να καλεί την f() περνώντας της τις μεταβλητές (ορίσματα).

 

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

Δημοσ.

Smirnov και migf1 ,έτσι ακριβώς είναι!

 

Όντως,ασχολούμαι με προβλήματα αριθμητικής ανάλυσης(και για εξάσκηση και γιατί μας έβαζαν τέτοια προβλήματα).

(και ναι θέλω να υλοποιήσω την runge-kutta)

(και Smirnov ,οκ , σε ευχαριστώ για την πολύτιμη βοήθεια σου αυτές τις ημέρες!)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...