2017-08-15 2 views
-1

Ich versuche ein Programm zu erstellen, das Informationen in einem dynamischen Array von Strukturen empfängt und speichert. Und das Programm sollte die Teams sortieren und anzeigen, die überdurchschnittlich, durchschnittlich und unterdurchschnittlich sind. Das ist bisher mein Code. . Also was ich tue, ist, dass ich die Benutzereingabe erhalte, die die Eingabe prüft, bevor ich sie im dynamischen Struktur-Array ablege. Dann zeige ich schließlich alle Informationen an, die in der Struktur gespeichert sind. Hier ist die Ausgabe, die ich gerade bekomme und ich bin mir nicht sicher, warum ich diese negativen Zahlen bekomme. DankAbrufen von Werten aus dynamischem Strukturarray

How many teams do you want to store? 2 
Enter the name of the team 1:Vikings 
Enter the team 1 percentage: 90 
Enter the name of the team 2:PackersGreen Bay Packers 
Enter the team 2 percentage: 80 
Above Average : 
Vikings 90% 
PackersGreen Bay Packers 80% 
Average : 
5.00136e-317% 
None 
Below Average : 
None 
9.25737e-306% 

Hier ist mein Code.

#include <iostream> 
#include <string> 
#include <cstring> 

using namespace std; 


int main() 
{ 

    struct aboveAverage 
    { 
     string name9; 
     double percentage1; 
    }; 

    struct average 
    { 
     string name10; 
     double percentage2; 
    }; 

    struct belowAverage 
    { 
     string name11; 
     double percentage3; 
    }; 

    int numOfteams; 
    double userInput; 

    cout << "How many teams do you want to store? "; 
    cin >> numOfteams; 
    cin.get(); 

    aboveAverage * arrayOfAboveAverage = new aboveAverage[numOfteams]; 
    average * arrayOfAverage = new average[numOfteams]; 
    belowAverage * arrayOfbelowAverage = new belowAverage[numOfteams]; 

    for (int i = 0; i < numOfteams; i++) 
    { 
    start: 
     int x = i + 1; 
     string name5; 
     cout << "Enter the name of the team " << x << ":"; 
     getline(cin, name5); 

     cout << "Enter the team " << x << " percentage: "; 
     cin >> userInput; 
     cin.get(); 



     if (userInput >= 66 && userInput <= 100) 
     { 
      arrayOfAboveAverage[i].percentage1 = userInput; 
      arrayOfAboveAverage[i].name9 = name5; 
     } 

     else if (userInput <= 66 && userInput >= 33) 
     { 
      arrayOfAverage[i].name10 = name5; 
      arrayOfAverage[i].percentage2 = userInput; 
     } 
     else if (userInput <= 33 && userInput >= 0) 
     { 
      arrayOfbelowAverage[i].name11 = name5; 
      arrayOfbelowAverage[i].percentage3 = userInput; 
     } 
     else 
     { 
      cout << "Percent cannot be greater than 100" << endl; 
      goto start; 
     } 


    } 

     cout << "Above Average :" << endl; 
     for (int j = 0; j < numOfteams; j++) 
     { 
      if (arrayOfAboveAverage[j].percentage1 != NULL || 
       arrayOfAboveAverage[j].name9 != "") 
      { 
       cout << arrayOfAboveAverage[j].name9 <<" "; 
       cout << arrayOfAboveAverage[j].percentage1 <<"%"<< endl; 
      } 
      else 
      { 
       cout << "None" << endl; 
      } 

     } 

     cout << "Average :" << endl; 
     for (int j = 0; j < numOfteams; j++) 
     { 
      if (arrayOfAverage[j].percentage2 > 0 || 
       arrayOfAverage[j].name10 != "") 
      { 
       cout << arrayOfAverage[j].name10 <<" "; 
       cout << arrayOfAverage[j].percentage2 <<"%"<<endl; 
      } 
      else 
      { 
       cout << "None" << endl; 
      } 
     } 

     cout << "Below Average : "<< endl; 
     for (int k = 0; k < numOfteams; k++) 
     { 
      if (arrayOfbelowAverage[k].percentage3 > 0 || 
       arrayOfbelowAverage[k].name11 != "") 
      { 
       cout << arrayOfbelowAverage[k].name11 << " "; 
       cout << arrayOfbelowAverage[k].percentage3 <<"%"<< endl; 
      } 
      else 
      { 

       cout << "None" << endl; 
      } 
     } 

    delete[] arrayOfAboveAverage; 
    delete[] arrayOfAverage; 
    delete[] arrayOfbelowAverage; 

    return 0; 

} 
+4

Sie brauchen wirklich nicht 3 verschiedene Arrays und 3 verschiedene Typen hier. Sie brauchen nur einen Team-Typ und dann können Sie dieses einzelne Array durchlaufen, um die oberen, unteren und durchschnittlichen Teams zu finden. – NathanOliver

+0

Das funktioniert, aber die Frage will, dass wir 3 verschiedene Strukturen erstellen. – Becca

+1

'5.00136e-317' ist nicht negativ, es ist positiv, aber sehr klein. Sie müssen die Arrays ordnungsgemäß initialisieren oder nachverfolgen, wie viele gültige Elemente jeweils enthalten sind. – molbdnilo

Antwort

0

Das Problem ist in dem folgenden Test

 if (arrayOfAverage[j].percentage2 > 0 || 
      arrayOfAverage[j].name10 != "") 

Wenn arrayOfAverage ist nicht initialisiert (wie in Ihrem Fall) name10 mit dem Standardwert für eine std::string (die leere Zeichenkette) initialisiert wird, aber der Wert für percentage2 (ein double) ist undefiniert.

testen Sie beiden Werte mit „oder“ nicht „und“, also wenn percentage2 mit einem positiven Wert initialisiert wird (durch Beispiel: 5.00136e-317) Sie im true Fall eingeben.

Vorschlag: wenn es ein nützlicher Wert ist, der Wert name10 nicht leer ist, so ignoriert percentage2 und den Test wie folgt ändern

if (! arrayOfAverage[j].name10.empty()) 

gleiches Problem mit den vorhergehenden

 if (arrayOfAboveAverage[j].percentage1 != NULL || 
      arrayOfAboveAverage[j].name9 != "") 

und der folgende Test

 if (arrayOfbelowAverage[k].percentage3 > 0 || 
      arrayOfbelowAverage[k].name11 != "") 

Mein suggestio n ist, sie wie folgt zu ändern:

if (! arrayOfAboveAverage[j].name9.empty()) 

// ... 

if (! arrayOfBelowAverage[j].name11.empty()) 
+0

aus irgendeinem Grund akzeptiert mein Compiler die leere Funktion nicht. Es ist falsch. @ Max66 – Becca

+0

@Becca - Sehr seltsam; Kannst du den Fehler transkribieren? Wie auch immer, du kannst 'size()' verwenden; etwas wie 'if (arrayOfAverage [i] .name10.size())' (aber wenn du 'empty()' verwenden kannst, ist (ich nehme an) besser) – max66

Verwandte Themen