c ++ sortinger avec structs

J’ai un problème avec ce problème qui nécessite une sorte de noms de clients, d’identifiants de clients et enfin le montant dû. J’ai tout le programme compris, mais je ne peux pas trouver le dernier prototype nécessaire pour faire le sorting. J’ai une structure appelée Customers et je fournirai également la partie int main (). J’ai juste besoin d’aide pour démarrer sur le prototype SortData ().

struct Customers { ssortingng Name; ssortingng 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 } 

Vous devez utiliser la fonction de sorting standard de C ++, std::sort , déclarée dans l’en-tête .

Lorsque vous effectuez un sorting à l’aide d’une fonction de sorting personnalisée, vous devez fournir une fonction de prédicat indiquant si la valeur de gauche est inférieure à la valeur de droite. Donc, si vous voulez sortinger d’abord par nom, puis par ID, puis par montant dû, le tout par ordre croissant, vous pouvez faire:

 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; } 

Maintenant, passez cette fonction à votre appel de sort :

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

Cela suppose que vous avez un conteneur STL (et non un tableau, comme dans votre exemple de code) appelé customers contenant des clients.

On oublie souvent que vous pouvez réellement utiliser les fonctions de plage STL avec des tableaux basés sur C, comme dans votre exemple. Donc, vous n’avez pas besoin de passer à un conteneur basé sur STL (je ne discuterai pas du bien-fondé de le faire ici :-)).

Donc, en s’appuyant sur la réponse de Chris, vous pouvez invoquer le type comme suit:

 std::sort( customers, customers+Count, &customer_sorter); 

Il vous suffit d’écrire une fonction de comparaison qui compare deux types CustomerProfile. Une fois que vous avez cette fonction, vous pouvez utiliser le sorting STL (voir http://www.sgi.com/tech/stl/sort.html ou http://msdn.microsoft.com/en-us/library/ecdecxh1 (VS.80) .aspx ) ou l’ancien qsort en C: http://en.wikipedia.org/wiki/Qsort_(C_Standard_Library) . Je vous déconseille d’écrire votre propre algorithme de sorting, sauf s’il s’agit d’un devoir. Votre comparaison dépend de la technologie que vous aimez utiliser. Elle pourrait ressembler à ceci:

 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 } 

cela suppose que le type ‘ssortingng’ dans votre exemple est un char *. Si vous utilisez des types Unicode ou multi-octets, la comparaison Unicode ou multi-octets appropriée doit évidemment être utilisée. Ensuite, vous appelez simplement l’algorithme, avec votre fonction de comparaison. Par exemple. en utilisant qsort:

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

Maintenant, s’il s’agit d’ un devoir, vous ne devriez pas demander ici comment le faire …

Vous pouvez trouver de nombreuses implémentations de sorting en C ++ avec la recherche google créative. La seule différence est qu’au lieu de sortinger les nombres, vous sortingez les structures.

Donc, partout où il y a quelque chose comme if(a[i] dans l'algorithme que vous utiliserez, passez un appel comme `if (isFirstCustomerLowerThanOther (un [i]

Maintenant, créez une fonction avec la structure suivante:

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

Mieux encore, si vous utilisez C ++, vous pouvez utiliser l’algorithme de sorting de la STL (encore une fois, google pour plus d’informations et pour savoir comment passer un ordre à cet ordre.

Je suppose que vous êtes novice en programmation ou en C ++, alors voici ce que vous recherchez probablement:

 #include  // 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; }