1

二次方程式の二分プログラムを作成する必要があります。2つの個別の手順の手順は次のとおりです。

プログラムは、次の要件を満たす必要があります。

  1. 二次方程式の係数a、b、およびcは、。という名前の別の関数によってキーボードから読み取られるものとしますreadCoeffs()。関数は、3つの係数すべてが読み取られた構造を呼び出し元に返します。tは、構造体の3つのフィールド、または3要素の配列を持つ単一のフィールドにすることができます。

  2. ルートを計算する関数は、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

4 に答える 4

3

これは2段階のプロセスです。

(1)結果を保持する構造体を定義します。おそらく次のようになります。

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

(2)実際の関数のプロトタイプを作成します。

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

お役に立てれば!

于 2012-06-13T23:03:40.530 に答える
2
struct calcRoots(double, double, double, double quadfunc(double), bool&);

structそれ自体はタイプではありません。返される構造体の名前を言う必要があります。では、どのようなものが返ってくるstructcalcRoots期待されているのでしょうか。

于 2012-06-13T23:01:57.593 に答える
1

このようなもの:

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

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

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

Roots calcRoots(const Coefficients& coefficients) { /* ... */ }
于 2012-06-13T23:03:48.407 に答える
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 );

coeff引数の前にある「&」に注意してください。これは、C ++で参照によって渡されることを意味します。これは、コンパイラがアドレスを渡し、関数内でアドレスを逆参照することを知っていることを意味しますが、関数内では「coeff」として参照できます。

于 2012-06-13T23:15:03.323 に答える