【问题标题】:Function + Reference Variables - Programming Assignment - C++函数 + 引用变量 - 编程作业 - C++
【发布时间】:2015-07-17 21:15:57
【问题描述】:

整天都在做这件事,无法弄清楚我错过了什么。不想求助于这里寻求帮助,但我不得不。

本练习假设引用三个int参数,并将它们的值按升序排列,使第一个参数的值最小,第二个参数的值居中,第三个参数的值最大。

代码编译良好,但数字不按顺序排列。它会一起跳过我的函数,直接从 main 中显示变量。

#include <iostream>

using namespace std;

//Function prototype
void smallSort(int&, int&, int&);

//Main
int main()
{
    int a = 100, b = 25, c = 20;

    smallSort(a, b, c);

    cout << a << endl;
    cout << b << endl;
    cout << c << endl;

    return 0;
}

void smallSort(int &valu1, int &valu2, int &valu3)
{
    int tempVal1 = 0, tempVal2 = 0, tempVal3 = 0;

    if (valu1 > valu2 && valu1 > valu3)
    {
        tempVal1 = valu1;
        valu1 = tempVal1;
        if (valu2 > valu3)
        {
            tempVal2 = valu2;
            tempVal3 = valu3;
            valu2 = tempVal2;
            valu3 = tempVal3;
        }

        else if (valu3 > valu2)
        {
            tempVal2 = valu3;
            tempVal3 = valu2;
            valu2 = tempVal3;
            valu3 = tempVal2;
        }
    }

    else if (valu2 > valu1 && valu2 > valu3)
    {
        tempVal1 = valu2;
        valu2 = tempVal1;
        if (valu1 > valu3)
        {
            tempVal2 = valu1;
            tempVal3 = valu3;
            valu1 = tempVal2;
            valu3 = tempVal3;
        }

        else if (valu3 > valu1)
        {
            tempVal2 = valu3;
            tempVal3 = valu1;
            valu3 = tempVal2;
            valu1 = tempVal3;
        }

        else if (valu3 > valu1 && valu3 > valu2)
        {
            tempVal1 = valu3;
            valu3 = tempVal1;
            if (valu2 > valu1)
            {
                tempVal2 = valu2;
                tempVal3 = valu1;
                valu2 = tempVal2;
                valu1 = tempVal3;
            }

            else if (valu1 > valu2)
            {
                tempVal2 = valu1;
                tempVal3 = valu2;
                valu1 = tempVal2;
                valu2 = tempVal3;
            }

        }

    }
}

【问题讨论】:

  • 那么你的代码有什么错误?
  • 代码编译正常,但数字不按顺序排列。它似乎一起跳过了我的函数,只是直接从 main 显示变量。
  • 看看tempVal1 = valu1; valu1 = tempVal1;。它什么也没做。将值复制到 temp,然后将 temp 复制回相同的值。其余的也这样做。最终结果是没有动作。

标签: c++ function reference swap


【解决方案1】:

你的函数太复杂了。这也是错误的,因为至少它没有考虑到变量可以彼此相等。

它看起来像这个演示程序中显示的那样。它使用冒泡排序方法

#include <iostream>

void smallSort( int &valu1, int &valu2, int &valu3 )
{
    if ( valu2 < valu1 )
    {
        int tmp = valu1;
        valu1 = valu2;
        valu2 = tmp;
    }

    if ( valu3 < valu2 )
    {
        int tmp = valu2;
        valu2 = valu3;
        valu3 = tmp;
    }

    if ( valu2 < valu1 )
    {
        int tmp = valu1;
        valu1 = valu2;
        valu2 = tmp;
    }
}

int main()
{
    int a = 2, b = 3, c = 1;

    std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;

    smallSort( a, b, c );

    std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
}

程序输出是

a = 2, b = 3, c = 1
a = 1, b = 2, c = 3

也可以代替这样的代码块

    if ( valu2 < valu1 )
    {
        int tmp = valu1;
        valu1 = valu2;
        valu2 = tmp;
    }

你可以使用标准函数std::swap。例如

    if ( valu2 < valu1 ) std::swap( valu2, valu1 );

在这种情况下,函数看起来像

#include <iostream>
#include <utility>

void smallSort( int &valu1, int &valu2, int &valu3 )
{
    if ( valu2 < valu1 ) std::swap( valu2, valu1 );

    if ( valu3 < valu2 ) std::swap( valu3, valu2 );

    if ( valu2 < valu1 ) std::swap( valu2, valu1 );
}

//...

【讨论】:

  • 在第一行打错字。 太复杂了
  • @user4581301 谢谢。:)
  • 感谢@VladfromMoscow 对初学者的巨大帮助
  • @MIKERAND 初学者应该互相帮助。:)
  • @VladfromMoscow 尊重。总有一天我会转告的:)
【解决方案2】:

我认为公平地说你有点复杂,但没关系。

我认为,如果您一次只比较两个整数,它可能会帮助您压缩代码,这样您就不必在尽可能多的逻辑中进行硬编码。 我在谷歌上快速搜索了一个源代码,发现了这个:https://codereview.stackexchange.com/questions/64758/sort-three-input-values-by-order 请务必查看该帖子中的 cmets,因为它们也应该对您有所帮助。

此外,通过 google 查找源代码非常容易,它会帮到你很多,尤其是在你还在学习的时候!

【讨论】:

    【解决方案3】:

    C++11 替代方案

    #include <iostream>
    #include <array>
    #include <algorithm>
    using namespace std;
    
    int main() {
        array<int, 3> arr = { 100, 25, 20 };
        sort(arr.begin(), arr.end());
        for (int & i : arr) cout << i << endl;
    }
    

    输出

    20
    25
    100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-08
      • 2014-01-15
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2020-08-20
      • 2018-11-26
      • 1970-01-01
      相关资源
      最近更新 更多