2

我想知道是否有人可以帮助我用一种更优雅的方式来编写我正在编写的程序。我的代码如下,我想知道是否有办法将打印总计的部分分离成一个新函数。我试过了,但我总是得到总数为 0,所以我一定是传递了错误的东西。

void printNumbers(int x, double y, double z, double v, int sum, double sum2,int sum3,int sum4){
while(x != 0){
    y = sqrt (x);
    z = pow (x,2);
    v = pow (x,3);
    sum = sum + x;
    sum2 = sum2 + y;
    sum3 = sum3 + z;
    sum4 = sum4 + v;
    cout << "       " << x << setw(12)  << setprecision (4) << y << setw(8) << z <<   setw(8) << v << endl;
    x--;
}
cout << "       total is" << sum << setw(12) << sum2 << setw(8)<< sum3 << setw(8) << sum4 <<    endl;
}

这是我尝试过的,当时我只有一个总数,但它仍然没有工作,只是给出了答案 0:

void printFooters(int sum){

cout << " " << "====================================="<< endl;
   cout << "Totals " << sum << endl << endl;
cout << " " << "====================================="<< endl;
}

这就是我在 main() 中调用它的方式:

printFooters(sum);
4

3 回答 3

4

如果要更新总和,则需要将总和作为参考。

void printNumbers(int x, double y, double z, double v, int& sum, double& sum2,int& sum3,int&  sum4)

如果您不按值传递总和,那么您只需获得总和当前值的副本。

或者,您可以使用指向总和的指针,但这将涉及在访问总和变量时更改语法。

于 2013-04-18T11:50:15.450 回答
0

您应该首先决定输入哪些变量以及应该输出哪些变量。尽量不要对输入和输出都使用一个变量,这通常比有价值更令人困惑。

只有输入值是 x。其他一切都是输出值。在您使用该值的方式中,值的内容仅在函数 printNumbers() 内的本地副本中被修改。他们会在功能结束时迷路。我希望您想从函数输出计算结果(但是 printNumbers 是该函数的错误名称)。

C 和 C++ 总是按值将变量传递给函数参数。这意味着,变量是从参数初始化的,但任何更改都只能在函数内部完成。在函数结束时,副本被丢弃,并且不会更改您传递给它的任何内容。

如果你想从函数中输出,你可以使用 return,或者使用指针或对变量的引用。我建议在 C++ 中使用引用,它们更容易理解和使用。

在函数中使用引用而不是复制的变量。然后,当您在函数内部修改该值时,它将在函数返回后保留修改后的值。

void f1(int in, int out)
{
  out = in + 1;
}

void f2(int in, int &out)
{
  out = in + 1;
}

int o1=-1, o2=-1;
f1(1, o1);
f2(1, o2);

cout << o1 << "," << o2 << endl; // will print -1,2

因此,将您的函数声明为: void printNumbers(int x, double &y, double &z, double &v, int &sum, double &sum2,int &sum3,int &sum4);

然后你可以这样做:

double y,z;
int sum, sum2, sum3, sum4;
printNumbers(4, y, z, sum, sum2, sum3, sum4);
printFooters(sum);

而这一次,它应该打印计算出的任何 printNumbers。请参阅http://www.cprogramming.com/tutorial/references.html了解更多信息,或使用 google。

于 2013-04-18T12:11:00.400 回答
0

您可以将所有这些参数批处理到结构中,并将所有计算和输出分开。
在您的情况下,这可能是矫枉过正,并且是相当多的代码,但无论如何......

struct Powers
{
    double sqroot;
    int one;
    double square;
    double cube;
};

Powers calculatePowers(int x)
{
    Powers powers;
    powers.sqroot = sqrt(x);
    powers.one = x;
    powers.square = x * x;
    powers.cube = x * x * x;
    return powers;
}

struct Sums
{
    int sum1;
    double sum2;
    int sum3;
    int sum4;
};

Sums addPowers(Sums sums, Powers powers)
{
    sums.sum1 += powers.one;
    sums.sum2 += powers.sqroot;
    sums.sum3 += powers.square;
    sums.sum4 += powers.cube;
    return sums;
} 

void printPowers(Powers powers)
{
        cout << "       " << powers.one 
             << setw(12)  << setprecision (4) << powers.sqroot 
             << setw(8)   << powers.square
             << setw(8)   << powers.cube 
             << endl;    
}

void printTotals(Sums sums)
{
    cout << "       total is" 
         << sums.sum1 
         << setw(12) << sums.sum2 
         << setw(8)  << sums.sum3 
         << setw(8)  << sums.sum4 
         << endl;    
}

void doEverything(int x)
{
    Sums sums = {0, 0, 0, 0};
    while (x > 0)
    {
        Powers powers = calculatePowers(x);
        printPowers(powers);
        sums = addPowers(sums, powers);
        x--;
    }
    printTotals(sums);
}
于 2013-04-18T12:51:43.207 回答