2016-12-11 2 views
2

Ich arbeite an einem Programm, das eine "Animal Adoption Agency" nachahmt. Ich lese aus der Datei, die eine Liste von Tiernamen, Rasse, Alter, Preis und Geschlecht enthält. Ich habe zwei Akten, jeweils eine für Katzen und Hunde.Sortierung mehrerer Arrays unterschiedlicher Typen aus einer Lesedatei

Der Benutzer kann die Liste nach den oben aufgeführten Kategorien sortieren. Ich habe derzeit eine for-Schleife, die genau die Kategorie sortiert, die sie wählen; Die anderen Kategorien werden sich jedoch nicht entsprechend ordnen. Ich bin mir nicht sicher, wie ich das anstellen soll. Hier ist eine verkürzte Version meines Codes, der nur den Zugriff auf den Hundeteil und die Sortierung nach Namen erlaubt, anstatt eine Auswahl zu haben, wie sortiert werden soll.

#include <iostream> 
    #include <fstream> 
    #include <istream> 
    #include <cctype> 
    #include <string> 
    #include <string.h> 
    #include <cstring> 
    #include <iomanip> 
    #include <vector> 
    #include <algorithm> 
    using namespace std; 

    int animalMenu, animalCount, animAge[50], animPrice[50], entry = 0, total; 
    string animType, animName[50], animBreed[50], animSex[50], takeHomeWith; 
    ifstream animalInform; 
    const int WIDTH = 8, BIG_WIDTH = 12; 

    void sortingHat(string[]); 
    void innerSorting(string[], int); 

    int main() { 
      animalInform.open("Dog Information.txt"); 
      animType = "dogs"; 

      // SET NUMBER OF ANIMALS IN FILE 
      animalInform >> animalCount; 
      cout << "There are " << animalCount << " " << animType << "! \n"; 

      // SETS ALL THE VALUES BY READING FROM FILE 
      for (int entry = 0; entry < animalCount; entry++) { 
       animalInform >> animName[entry] >> animBreed[entry] >> animAge[entry] >> animPrice[entry] >> animSex[entry]; 
       cout << setw(BIG_WIDTH) << animName[entry] << setw(BIG_WIDTH) << animBreed[entry] << setw(WIDTH) << animAge[entry] << setw(WIDTH) << animPrice[entry] << setw(WIDTH) << animSex[entry] << endl; 
      } 
      // CLOSE FILE 
      animalInform.close(); 

      // CALL FUNCTION TO SORT (BY NAME ONLY) 
      sortingHat(animName); 
      cout << endl; 
      // DISPLAY NEWLY SORTED LIST 
      for (int entry = 0; entry < animalCount; entry++) { 
       cout << setw(BIG_WIDTH) << animName[entry] << setw(BIG_WIDTH) << animBreed[entry] << setw(WIDTH) << animAge[entry] << setw(WIDTH) << animPrice[entry] << setw(WIDTH) << animSex[entry] << endl; 
      } 
      system("pause"); 
    } 

    void sortingHat(string sortingString[]) 
    { // SORTS DATA AND PUTS IT IN ORDER, ALPHABETICAL -- 
     for (int outer = 0; outer <= animalCount; outer++) 
     { 
      for (int entry = 0; entry <= (animalCount - 2); entry++) { 
       string temporary[50]; 
       if (sortingString[entry] > sortingString[entry + 1]) 
        innerSorting(sortingString, entry); 
      } 
     } 
    } 

    void innerSorting(string sorter[], int entry) 
    { 
     string temporary[50]; 
     temporary[entry] = sorter[entry]; 
     sorter[entry] = sorter[entry + 1]; 
     sorter[entry + 1] = temporary[entry]; 
    } 

Also habe ich offensichtlich nichts, was die anderen Einträge folgen würde. Also, wenn ich Namen wählen, sortiert werden, meine Ausgabe (das ist, was in meiner Datei geschrieben wird) wird aus gehen

Brienne Shepard 6 $150 F 
Jon Labrador 3 $200 M 
Aemon ShihTzu 10 $50 M 

zu

Aemon Shepard 6 $150 F 
Brienne Labrador 3 $200 M 
Jon ShihTzu 10 $50 M 

Und ich will es, dies zu tun (wenn die Wahl nach Namen sortieren):

+0

Haben Sie Vektoren in der Klasse verwendet? –

+0

@CaptainGiraffe nein - sie sagte uns, wir könnten Vektoren verwenden, wenn wir das wollten. Würden Sie diese anstelle von Arrays empfehlen? –

+0

Immer. Ein Vektor adoptable_animals; würde für die einfachste Lösung sorgen. Ihre Sortierbedingung würde sich dann abhängig von den Sortierkriterien ändern. –

Antwort

0

Wenn ich Sie richtig verstanden habe, haben Sie eine Reihe von Arrays, die Tiermerkmale enthalten. Und Sie werden nach einem Merkmal sortieren, so dass alle Arrays sortiert werden. Wenn ja, können Sie eine gemeinsame Funktion für alle Arrays schreiben.

Zum Beispiel

enum SortType { SortByName, /* other types of sorting */, SortByAge }; 

//... 

void bubble_sort(std::string animName[], 
        /* other characteristics */ 
        int animAge[], 
        size_t n, 
        SortType type) 
{ 
    for (size_t last; not (n < 2); n = last) 
    { 
     for (size_t i = last = 1; i < n; i++) 
     { 
      bool less = false; 
      switch (type) 
      { 
      case SortByName: 
       less = animName[i] < animName[i-1]; 
       break; 
      /* other cases */ 
      case SortByAge: 
       less = animAge[i] < animAge[i-1]; 
       break; 
      } 

      if (less) 
      { 
       /* swapping elements of all the arrays */ 
       last = i; 
      } 
     } 
    } 
} 

berücksichtigen, dass diese Swap-Funktion

void innerSorting(string sorter[], int entry) 
{ 
    string temporary[50]; 
    ^^^^^^^^^^^^^^^^^^^^ 
    temporary[entry] = sorter[entry]; 
    sorter[entry] = sorter[entry + 1]; 
    sorter[entry + 1] = temporary[entry]; 
} 

nicht einen Array von Strings verwendet werden soll. Es kann geschrieben werden wie

void innerSorting(string sorter[], size_t entry) 
{ 
    string temporary; 
    ^^^^^^^^^^^^^^^^^ 
    temporary = sorter[entry]; 
    sorter[entry] = sorter[entry + 1]; 
    sorter[entry + 1] = temporary; 
} 
Verwandte Themen