18

我很难解决这个问题,它需要一种客户姓名、客户 ID 以及最后的应付金额。我已经计算了整个程序,但无法确定进行排序所需的最后一个原型。我有一个名为 Customers 的结构,我还将提供 int main() 部分。我只需要任何帮助来启动原型 SortData()。

struct Customers {
    string Name;
    string Id;
    float OrderAmount;
    float Tax;
    float AmountDue;
};

const int MAX_CUSTOMERS = 1000;
bool MoreCustomers(int);
Customers GetCustomerData();
void OutputResults(Customers [], int);
void SortData(const int, const int, Customers []);

int main() {
    Customers c[MAX_CUSTOMERS]; 
    int Count = 0;      
    do {
      c[Count++] = GetCustomerData();   
    } while (MoreCustomers(Count));     


    for (int i = 0; i < Count; i++) {
        c[i].Tax = 0.05f * c[i].OrderAmount;        
        c[i].AmountDue = c[i].OrderAmount + c[i].Tax;   
    }

    SortData(0, Count, c);     //0:Sorts by customer name       
    OutputResults(c, Count);            
    GeneralSort(1, Count, c);   //1:Sorts by ID     
    OutputResults(c, Count);        
    GeneralSort(2, Count, c);   //2: Sorts by amount due        
    OutputResults(c, Count);        

    return 0;                       
}


void SortData(const int SortItem, const int count, CustomerProfile c[]) {
     //0: Sort by name
    //1: Sort by ID
    //3: Sort by amount due
}
4

5 回答 5

49

std::sort您应该使用标头中声明的C++ 标准排序函数<algorithm>

当您使用自定义排序函数进行排序时,您必须提供一个谓词函数来说明左侧值是否小于右侧值。因此,如果您想首先按名称排序,然后按 ID 排序,然后按到期金额排序,所有这些都按升序排列,您可以这样做:

bool customer_sorter(Customer const& lhs, Customer const& rhs) {
    if (lhs.Name != rhs.Name)
        return lhs.Name < rhs.Name;
    if (lhs.Id != rhs.Id)
        return lhs.Id < rhs.Id;
    return lhs.AmountDue < rhs.AmountDue;
}

现在,将该函数传递给您的sort调用:

std::sort(customers.begin(), customers.end(), &customer_sorter);

customers这假设您有一个名为包含客户的 STL 容器(而不是数组,就像您在示例代码中使用的那样) 。

于 2009-05-17T01:48:55.447 回答
14

它经常被忽略,您实际上可以将 STL 范围函数与基于 C 的数组一起使用,就像在您的示例中一样。因此,您实际上不必转而使用基于 STL 的容器(我不会在这里讨论这样做的优点 :-))。

因此,基于 Chris 的回答,您可以调用 sort 如下:

std::sort( customers, customers+Count, &customer_sorter);
于 2009-05-17T10:47:45.373 回答
2

您只需要编写一个比较两个 CustomerProfile 类型的比较函数。拥有此功能后,您可以使用 STL 排序(请参阅http://www.sgi.com/tech/stl/sort.htmlhttp://msdn.microsoft.com/en-us/library/ecdecxh1 (VS.80).aspx ) 或旧的 C qsort:http://en.wikipedia.org/wiki/Qsort_(C_Standard_Library)。我建议不要编写自己的排序算法,除非这是家庭作业。您的比较取决于您喜欢使用的技术,它可能看起来像这样:

int CompareCustomerProfile(
   const CustomerProfile* pC1,
   const CustomerProfile* pC2)
{
 int result = strcmp(pC1->name, pC2->name);
 if (0 != result) return result; 

  result = strcmp(pC1->ID, pC2->ID);
  if (0 != result) return result;

  if (pC1->amountDue < pC2->amountDue) return -1;
 if (pC1->amountDue > pC2->amountDue) return 1;

  return 0
}

这假设您示例中的“字符串”类型是 char*。如果您使用 Unicode 或多字节类型,那么显然必须使用适当的 Unicode 或多字节比较。然后,您只需使用比较函数调用该算法。例如。使用 qsort:

qsort(c, Count, sizeof(CustomerProfile), CompareCustomerProfiler).

现在,如果这一个家庭作业,你不应该在这里问怎么做......

于 2009-05-17T02:05:02.990 回答
1

您可以通过创造性的谷歌搜索在 C++ 中找到很多排序实现。唯一的区别是,您不是对数字进行排序,而是对结构进行排序。

因此,无论您将使用的算法中有什么类似的东西if(a[i]<a[j]),都可以调用 `if(isFirstCustomerLowerThanOther(a[i]

现在,创建一个具有以下结构的函数:

bool isFirstCustuomerLowerThanOther(const Customer& firstCustomer, const Customer& secondCustomer)
{
 // Implement based on your key preferences
}

更好的是,如果你使用 C++,你可以使用 STL 的排序算法(同样,谷歌获取信息以及如何将排序传递给它。

于 2009-05-17T01:47:15.043 回答
0

我假设您是编程或 C++ 新手,因此您可能正在寻找以下内容:

#include <search.h> // for the qsort()

int
CompareByName( const void *elem1, const void *elem2 )
{
  return ((Customers*)elem1)->Name > ((Customers*)elem2)->Name? 1 : -1;
}

int
CompareByOrderAmount( const void *elem1, const void *elem2 )
{
  return ((Customers*)elem1)->OrderAmount > ((Customers*)elem2)->OrderAmount? 1 : -1;
}

void SortData( int SortItem, int count, Customers customers[] )
{
  switch (SortItem) {
  case 0:
    qsort(customers, count, sizeof(Customers), CompareByName);
    break;
  case 1:
    qsort(customers, count, sizeof(Customers), CompareByOrderAmount);
    break;
  // ...
  }
}

void test()
{
  Customers cust[10];

  cust[0].Name = "ten";
  cust[1].Name = "six";
  cust[2].Name = "five";
  SortData( 0, 3, cust );
  cout << cust[0].Name << endl;
  cout << cust[1].Name << endl;
  cout << cust[2].Name << endl;
}
于 2009-05-17T11:52:03.067 回答