你如何在c ++中编写一个返回结构的函数原型?

时间:2012-06-13 22:59:22

标签: c++ function-prototypes

我必须为二次方程创建二分程序。以下是两个步骤的说明:

该计划必须符合以下要求:

  1. 二次方程的系数a,b和c应通过名为readCoeffs()的单独函数从键盘读取。该函数应该向调用者返回一个读取了所有3个系数的结构。 t可以是结构的3个字段或具有3个元素数组的单个字段。

  2. 计算根的函数应以具有3个字段的结构形式将结果返回给调用者:root1,root2和exists(用于确定根是否存在的布尔变量)。

  3. 我无法正确编写函数原型和函数标题。当我这样写它们时:

    struct calcRoots(double, double, double, double quadfunc(double), bool&);
    
    struct readCoeffs();
    
    int main(){
    

    我收到错误。我认为Microsoft Visual Studio希望我创建带有大括号和分号的结构。我很失落。非常感谢任何反馈。

    这是我正在使用的整个代码。我不断修改它。这是我在c ++中的第一门课程。我在挣扎。

    /****************************************************************************
    //File: bisect.cpp
    //Finds the root of a function using the bisection method
    #include <iostream>
    #include <cmath>
    #include <fstream>
    using namespace std;
    
    struct coeffStru{
            double a;
            double b;
            double c;};
    struct rootStru{
        double root1;
        double root2;
        bool exists;
                   };
    
    //function prototypes
    struct calcRoots(double, double, double, double f(double),bool&);
    double quadfunc(struct, double);
    struct readcoeffs(coeffStru);
    
    int main() {
        double xLeft=-10.0;
        double xRight=10.0; //end points of interval
        double epsilon;       //exists tolerance
        double root;          //root found by bisect
        bool exists;              //exists flag
    
    //Get tolerance
    cout<< "Enter tolerance: ";
    cin>>epsilon;
    
    struct coeffStru = readcoeffs();
    
    //use bisect calcRoots function to look for root of function f
    struct rootStru = calcRoots(xLeft, xRight, epsilon, quadfunc, exists);
    
    
    
    
    //display result
    if (!exists){
        cout<< "Root found at "<<root
            <<" \nValue of f(x) at root is: "<<f(root);
            system("PAUSE");
            return 0;
               }
    else{
        cout<<"There may be no root in ["<<xLeft<<", "<<xRight<<"]"<<endl;
        system("PAUSE");
        return 0;
        }
    }
    
    
    
    
    //Struct return type readcoeffs function
    struct readcoeffs(coeffStru){
    
        cout<<"Enter values for a,b,and c of a quadratic equation."<<endl;
        cin>>a>>b>>c;
        return struct coeffStru;
                                }
    
    
    
    
    
    
    
    
    //Implements bisection method to find a root of function f
    //in interval [xLeft, xRight].
    //PRE: xLeft, xRight, and epsilon are defined.
    //POST: Returns midpoint of xLeft and xRight if the difference between thses values is <= epsilon. Returns true to exists if there is no root.
    struct calcRoots (double xLeft, double xRight, double epsilon, struct coeffStru, double quadfunc(double), bool& exists) //IN: endpoints of interval for possible root, IN: exists tolerance, IN: the function, OUT: exists flag
    {
        double xMid;                        //midpoint of interval
        double fLeft;
        double fRight;              //function values at xLeft, xRight,
        double fMid;                        //and xMid
    
    
    //Compute function values at initial endpoints of interval
        fLeft = quadfunc(xLeft,coeffStru);
        fRight = quadfunc(coeffStru, xRight);
    
    
        //Repeat while interval > exists tolerance
        while (fabs ( xLeft - xRight) > epsilon)
        {
            //Compute function value at midpoint
            xMid = (xLeft + xRight)/ 2.0;
            fMid = quadfunc(coeffStru, xMid);
    
            //Test function value and reset interval if root not found
            if(fMid ==0.0)      //if xMid is the root
                root1 = xMid;    //set root1 to xMid
            else{ 
                xRight = xMid;
                xMid = (xLeft + xRight)/ 2.0;
                fMid = f(coeffStru, xMid);
                }
                if(fLeft * fMid < 0.0)  //root in [xLeft, xMid]
    
    
    
    
    
            //Display next interval
            cout<< "New interval is [" <<xLeft
                << ", " <<xRight << "]"<<endl;
        }    //ends 1st while loop
    
    
        //If no change of sign in the interval, there is no unique root
        exists = (fLeft * fRight) >0;  //test for same sign - set exists
        if(exists){ 
            return -999.0;      //no 1st root - return to caller
                  }
    
    
        //Return midpoint of last interval
        root1 = (xLeft + xRight) / 2.0;
    //Compute function values at initial endpoints of interval
        fLeft = f(coeffStru, xLeft);
        fRight = f(coeffStru, xRight);
    
    
    
        //Repeat while interval > exists tolerance
        while (fabs ( xLeft - xRight) > epsilon)
        {
            //Compute function value at midpoint
            xMid = (xLeft + xRight)/ 2.0;
            fMid = f(coeffStru, xMid);
    
            //Test function value and reset interval i root not found
            if(fMid ==0.0)      //xMid is the root
                return xMid;    //return the root
            else if (fLeft * fMid < 0.0)  //root in [xLeft, xMid]
                xRight = xMid;
            else                            //root in [xMid, xRight]
                xLeft = xMid;
    
            //Display next interval
            cout<< "New interval is [" <<xLeft
                << ", " <<xRight << "]"<<endl;
         }    //ends 2nd while loop
    
    
        //If no change of sign in the interval, there is no unique root
        exists = (fLeft * fRight) > 0;  //test for same sign - set exists
        if(exists){ 
            return -999.0;      //no 2nd root - return to caller
                  }
    
    
        //Return midpoint of last interval
        root2 = (xLeft + xRight) / 2.0;
    
    return struct rootStru;
    }   //ends calcRoots method
    
    
    
    
    //Function whose root is being found.
    //PRE: x is defined.
    //POST: Returns f (x)
    double quadfunc(struct coeffStru, double x){
        return a * pow(x, 2.0) - b* pow(x, 1.0) + c;}
    
    
    ************************************************************/
    

    我可以想象得到很多错误。我现在的主要问题似乎是通过引用和值传递变量和结构。

4 个答案:

答案 0 :(得分:3)

这是一个两步过程:

(1)定义将保存结果的结构,可能是这样的:

struct ResultType {
    /* ... fields go here ... */
};

(2)原型实际功能:

ResultType calcRoots(double a, double b, double c, double function(double), bool& out);

希望这有帮助!

答案 1 :(得分:2)

struct calcRoots(double, double, double, double quadfunc(double), bool&);

struct本身不是一种类型。您应该说要返回的struct的名称。那么,struct期望返回什么样的calcRoots

答案 2 :(得分:1)

这样的事情:

struct Coefficients
{
    double a, b, c;
};

struct Roots
{
    double root1, root2;
    bool exists;
};

Coefficients readCoeffs() { /* ... */ }

Roots calcRoots(const Coefficients& coefficients) { /* ... */ }

答案 3 :(得分:1)

C ++中的结构就像C语言中的结构一样。你可以用同样的方式定义它们。

struct coeff_t {
   double a;
   double b;
   double c;
};

struct roots_t {
    bool exist;
    double r1;
    double r2;
};

现在,通过这些定义,您可以定义函数原型:

coeff_t readCoeffs();

roots_t calcRoots( coeff_t & coeff );

注意“&amp;”在coeff参数之前,这意味着在C ++中通过引用传递,这意味着编译器将传递地址,并且知道在函数内部取消引用它,但是您可以在函数内将其引用为“coeff”。