我很难解决这个问题,需要一种客户名称,客户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
}
答案 0 :(得分:34)
您应该使用在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容器(而不是您的示例代码中的数组),包含客户。
答案 1 :(得分:13)
经常忽略的是,您可以使用基于C的数组实际使用STL范围函数,就像您的示例一样。所以你实际上不必转向使用基于STL的容器(我不会在这里讨论这样做的优点: - ))。
因此,基于Chris的答案,您可以按如下方式调用sort:
std::sort( customers, customers+Count, &customer_sorter);
答案 2 :(得分:2)
您只需要编写一个比较两个CustomerProfile类型的比较函数。完成此功能后,您可以使用STL排序(请参阅http://www.sgi.com/tech/stl/sort.html或http://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
}
这假设您的示例中的'string'类型是char *。如果使用Unicode或多字节类型,则显然必须使用适当的Unicode或多字节比较。 然后你只需用比较函数调用算法。例如。使用qsort:
qsort(c, Count, sizeof(CustomerProfile), CompareCustomerProfiler).
现在如果 是作业,你不应该问这里怎么做......
答案 3 :(得分: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的排序algortihm(再次,google获取信息以及如何将订单传递给它。
答案 4 :(得分: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;
}