C ++对两个配对整数数组的“百分比”进行排序

时间:2015-11-15 08:21:57

标签: c++ arrays sorting pointers casting

我有一个带有2个“配对”整数数组newNumerator []和newDenominator []的程序,它们都有9个整数。我编写了一个按升序对它们进行排序的函数,但是我不确定它是否正常工作,因为我还没有成功编译它。我也有一些类型转换的问题。这是函数定义 -

void sortData(int *newNumerator[], int *newDenominator[], int newSize)
{
    int temp1;
    int temp2;
    bool swap;
    int count = 0;
    double percentageLeft = 100.0 * static_cast<double>(newNumerator[count]) / newDenominator[count];
    double percentageRight = 100.0 * static_cast<double>(newNumerator[count + 1]) / newDenominator[count + 1];

    do
    {  swap = false;
        for(count = 0; count < (newSize - 1); count++)
        {
            if(percentageLeft > percentageRight)
            {
                temp1 = *newNumerator[count];
                *newNumerator[count] = *newNumerator[count + 1];
                *newNumerator[count + 1] = temp1;

                temp2 = *newDenominator[count];
                *newDenominator[count] = *newDenominator[count + 1];
                *newDenominator[count + 1] = temp2;

                swap = true;
            }
        }
    } while (swap);
}

我遇到的类型转换问题是使用percentageLeft和percentageRight,因为newNumerator []和newDenominator []是整数指针,但要获得它们的“百分比”,我需要它是一个双精度型。不知道该怎么做。基本上我只需要弄清楚如何解决这个问题,并知道我的功能是否达到了它的目的。任何帮助表示赞赏,如果有什么我可以进一步澄清,请告诉我

3 个答案:

答案 0 :(得分:2)

我建议使用STL进行排序。使事情变得更简单,更容易理解。

#include <vector>
#include <algorithm>

struct Ratio
{
    int numerator;
    int denominator;

    double toDouble() const
    {
        return static_cast<double>(numerator)
             / static_cast<double>(denominator);
    }

    bool operator < (Ratio const& other) const
    {
        return toDouble() < other.toDouble();
    }
};

void main()
{
    std::vector<Ratio> ratios = { {1, 2}, {5, 7}, {2, 11} };
    std::sort(ratios.begin(), ratios.end());
}

处理原始数组并手动排序几乎总是更乏味且容易出错的方法。

请参阅http://en.cppreference.com/w/cpp/algorithm/sorthttp://en.cppreference.com/w/cpp/container/vector以供参考

答案 1 :(得分:1)

你说:

  

我有一个带有2个“配对”整数数组newNumerator []和newDenominator []

的程序

然而,您的功能定义为:

 When I create < row >
    | < name > |
    | < height > |
    | < eyecolor > |
    | < code > |
    Then I should receive a code of < code >
    Examples:
        | name | height | eyecolor | code |
        | Bob  | 5'2"   | green    | 200  |
        | Ted  | 4'9"   | blue     | 200  |

我认为应该是:

void sortData(int *newNumerator[], int *newDenominator[], int newSize) 

如果情况确实如此,则行:

void sortData(int newNumerator[], int newDenominator[], int newSize) 

需要:

temp1 = *newNumerator[count];
*newNumerator[count] = *newNumerator[count + 1];
*newNumerator[count + 1] = temp1;

temp2 = *newDenominator[count];
*newDenominator[count] = *newDenominator[count + 1];
*newDenominator[count + 1] = temp2;

答案 2 :(得分:1)

您遇到的主要错误是您向b.size()提供了错误的值。稍后你通过解除引用正确使用它们,但在演员表中你缺少它。

您需要的是:

static_cast<>

添加括号以明确说明解除引用的内容。

此外,如果您不是更改实际的数组指针,而只是更改数组的内容,则可以完全删除解除引用的麻烦。如果将函数定义为

double percentageLeft = 100.0 * static_cast<double>((*newNumerator)[count]) / *newDenominator[count];
double percentageRight = 100.0 * static_cast<double>((*newNumerator)[count + 1]) / *newDenominator[count + 1];

每次使用时都可以使用普通索引而无需解除引用。