1

这就是问题:编写一个具有五个参数的函数 minMax 的定义。前三个参数是整数。最后两个由函数设置为前三个参数值中的最大值和最小值。该函数不返回值。

该函数可以按如下方式使用:

int a = 31, b = 5, c = 19, big, small; 
minMax(a, b, c, &big, &small); /* big is now 31; small is now 5 */ 

这是我的代码:

void minMax(int x, int y, int z, int* big, int* small)
{
  if (x < y && x < z)

    *small = x;

  else if (y < x && y < z)

    *small = y;

  else if (z < x && z < y)

    *small = z;

  if (x > y && x > z)

    *big = x;

    else if (y > x && y > z)

    *big = y;

  else if (z > x && z > y)

    *big = z;
  }

这是我得到的错误:

您的函数没有更改 的值small。确保在函数中取消引用它。

不知道出了什么问题?

谢谢。

4

3 回答 3

6

我看到一个直接的问题。

你认为当你传递数字时会1发生1什么7

也许您可能要考虑使用<=and>=而不仅仅是<and >

由于该错误消息看起来与我以前见过的任何编译器错误都不一样(并且代码在语法上有效的),我建议该消息来自一个测试工具,它可能:

  • big/small值设置为传入的数字以外的数字(例如,-9999)。
  • 使用测试数据(例如1,1,7)调用函数。
  • 检查输出变量以确保它们已更改为正确的值。

此外,它不是世界上最易读的代码(无意冒犯)。如果您可以以一种一目了然的方式构建代码(包括适当的注释),那么您将有成群的未来程序员歌颂您并崇拜您的名字:-)

像这样的东西比许多这些else if结构更清楚地显示了意图(IMNSHO):

// Populate big/small based on max/min of x, y and z.

void minMax (int x, int y, int z, int *big, int *small) {
    // Set by default to x, only change if others are bigger.

    *big = x;
     if (y > *big)   *big = y;
     if (z > *big)   *big = z;

    // Same for small but with reversed comparisons.

    *small = x;
     if (y < *small) *small = y;
     if (z < *small) *small = z;
}
于 2012-12-12T01:54:05.177 回答
4

我不确定什么不起作用。看起来这基本上可以工作,但结构可以更好。

也许是这样的:

void minMax(int x, int y, int z, int* big, int* small)
{
    *big = *small = x;

    if (y > *big)
        *big = y;
    if (y < *small)
        *small = y;
    if (z > *big)
        *big = z;
    if (z < *small)
        *small = z;
  }
于 2012-12-12T01:56:34.753 回答
0

错误信息

您的函数没有更改 的值small。确保在函数中取消引用它。

…似乎来自您的老师提供给您的测试工具。

无论如何,这是正确的:您可以选择一些值,您的函数不会将任何内容分配给*small.

例如,使用a,b相同c的值,您的函数将什么都不做。


反正,

对于未来的问题,请提供一个完整的示例程序来演示该问题。

这样人们就不必猜测和使用不可靠的心灵感应。


此外,作业要求您实现一个签名不好的函数。

它教授了一种 Bad Way™ 来设计功能。

这是一个可能的普通 C++ 函数签名:

void getMinAndMax( int& smallest, int& largest, int a, int b, int c )

这是现代 C++ 技术的一个更好的签名:

std::pair<int, int> minAndMax( int a, int b, int c )

后一个函数的名称没有get前缀是因为它是一个面向表达式的函数,比如sinand cos(你不会写getSinor getCos,对吗?),而第一个函数的前缀的存在仅仅是为了使命名命令,以反映它不是面向表达式的函数,而是面向动作的函数。

当然,使用 C++11 可以让函数接受任意数量的参数。除了在我写这篇文章时,Visual C++ 还不能正确地支持它。例如,这里是std::min来自 C++11 标准库的签名:

template<class T, class Compare>
T min(initializer_list<T> t, Compare comp);

使用 C++03,可以通过接受模板类型的单个容器参数在某种程度上做到这一点。

于 2012-12-12T02:01:58.983 回答