c ++ sort med structs

stemmer
14

Jeg har en hard tid med dette problemet som krever en slags kundenavn, kunde IDer, og til slutt beløpet. Jeg har hele programmet tenkte, men kan ikke finne ut den siste prototypen som trengs for å gjøre sorteringen. Jeg har en struct kalt Kunder, og jeg vil gi den int main () del også. Jeg trenger bare hjelp GT startet på prototype 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
}
Publisert på 17/05/2009 klokken 01:39
kilden bruker
På andre språk...                            


5 svar

stemmer
33

Du bør bruke C ++ 's standard sorteringsfunksjon, std::sorterklærte i <algorithm>spissen.

Når du liksom bruke en tilpasset sorteringsfunksjon, må du gi et predikat funksjon som sier om den venstre verdien er mindre enn den høyre verdi. Så hvis du vil sortere etter navn først, deretter etter ID, så av beløpet, alt i stigende rekkefølge, du kan gjøre:

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

Nå går den funksjonen til sortsamtalen:

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

Dette foruts har du en STL container (og ikke en matrise, som du har i ditt eksempelkode) kalt customersinneholder kunder.

Svarte 17/05/2009 kl. 01:48
kilden bruker

stemmer
13

Dens ofte oversett at du faktisk kan bruke STL utvalg funksjoner med C basert arrays, som i ditt eksempel. Så du trenger faktisk ikke å flytte over til å bruke en STL basert container (jeg vil ikke diskuterer verdien av å gjøre det her :-)).

Så, bygger på svar fra Chris, du kan påberope sort som følger:

std::sort( customers, customers+Count, &customer_sorter);
Svarte 17/05/2009 kl. 10:47
kilden bruker

stemmer
2

Du trenger bare å skrive en sammenligning funksjon som sammenligner to CustomerProfile typer. Når du har denne funksjonen, kan du bruke enten STL slag (se http://www.sgi.com/tech/stl/sort.html eller http://msdn.microsoft.com/en-us/library/ecdecxh1 (VS.80) .aspx ) eller den gamle C qsort: http://en.wikipedia.org/wiki/Qsort_(C_Standard_Library) . Jeg vil råde mot å skrive din egen sorteringsalgoritmen, med mindre dette er en hjemmelekse. Din sammenligning avhenger av teknologien du ønsker å bruke, kan det se gjøre noe som dette:

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
}

Dette forutsetter at 'strengen' type i ditt eksempel er en char *. Hvis du bruker Unicode eller flerbyte typer deretter riktig Unicode eller multibyte sammenligning må brukes, selvsagt. Så du ville bare ringe algoritmen, med sammenligning funksjon. Eg. bruke qsort:

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

Nå hvis dette er en hjemmelekse, bør du ikke spørre her hvordan du gjør det ...

Svarte 17/05/2009 kl. 02:05
kilden bruker

stemmer
1

Du kan finne mange sorter implementeringer i C ++ med kreativ googling .. Den eneste forskjellen er at i stedet for å sortere tall, er du sortering structs.

Så uansett hvor det er noe som if(a[i]<a[j])i algoritmen vil du bruke, ringe som `if (isFirstCustomerLowerThanOther (a [i]

Nå oppretter en funksjon med følgende struktur:

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

Enda bedre, hvis du bruker C ++ kan du bruke STL tallet slags algortihm (igjen, google for info og for hvordan å passere en bestilling til det.

Svarte 17/05/2009 kl. 01:47
kilden bruker

stemmer
0

Jeg antar at du er ny på programmering eller i C ++, så her er det du sannsynligvis er ute etter:

#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;
}
Svarte 17/05/2009 kl. 11:52
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more