2016-11-18 23 views
-1

Ich habe ein Problem mit der Einfügesortierfunktion. Während ich versuche, die Stimmen und Namen in absteigender Reihenfolge zu drucken. Die Stimmen scheinen zu funktionieren, aber der Name druckt aufsteigend statt absteigend. Nachdem ich in einem b c d e f für die Namen und 5 4 3 2 1 für die Stimmen stecken, sieht es wie folgt aus:Einfügesortierung in absteigender Reihenfolge in C++

Please input the canditate 1 name: 
a 
Please input the canditate 1 votes: 
1 
Please input the canditate 2 name: 
b 
Please input the canditate 2 votes: 
2 
Please input the canditate 3 name: 
c 
Please input the canditate 3 votes: 
3 
Please input the canditate 4 name: 
d 
Please input the canditate 4 votes: 
4 
Please input the canditate 5 name: 
e 
Please input the canditate 5 votes: 
5 
Candidate    Votes Received   % of Total Votes 
a      5      33.33 
b      4      26.67 
c      3      20.00 
d      2      13.33 
e      1      6.67 
Total     15 
The winner of the elections is a. 
Program ended with exit code: 0 
Press any key to continue . . . 

Der Kandidat e d c b a anstelle eines b c d e sein müssen.
Dies ist mein Code unten. Jede Hilfe wird geschätzt.

#include <iostream> 
#include <string> 
#include<iomanip> 
using namespace std; 

void insertionSort(double votes[], string name[], double len) 
{ 
    for (int i = 0; i < len - 1; i++) 
    { 
     int j = i + 1; 
     double temp = votes[j]; 
     while (j > 0 && temp > votes[j - 1]) 
      { 
        votes[j] = votes[j - 1]; 
        j--; 
        votes[j] = temp; 
      } 
     string temp2 = name[j]; 
     while (j > 0 && temp2 > name[j - 1]) 
      { 
       name[j] = name[j - 1]; 
       j--; 
       name[j] = temp2; 
      } 
    } 


} 
int main() 
{ 
    //Declaring variables 
    string *name; 
    double *votes; 
    double *percentage; 
    double total = 0; 
    int max = 0; 

    name = new string[5]; 
    votes = new double[5]; 
    percentage = new double[5]; 
    //for condition for user to input Canditate names and the votes received 
    for (int i = 0; i < 5; i++) 
    { 
     cout << "Please input the canditate " << i + 1 << " " << "name: " << endl; 
     cin >> name[i]; 
     cout << "Please input the canditate " << i + 1 << " " << "votes: " << endl; 
     cin >> votes[i]; 
     total = total + votes[i]; 

    } 
    //Q1 or Q2 
    //selectionSort(votes, name, 5); 
    insertionSort(votes, name, 5); 

    //printing out the Canditate, voters received, and % of total votes 
    cout << "Candidate" << "\t\t" << "Votes Received" << "\t\t" << "% of Total Votes" << endl; 
    //for loop in order to find % of total votes, winner of election 
    for (int i = 0; i < 5; i++) 
    { 
     if (votes[i]>votes[max]) 
      max = i; 
     cout << name[i] << "\t\t\t" << fixed << setprecision(0) << votes[i] << "\t\t\t" << fixed << setprecision(2) << (votes[i] * 100/total) << endl; 

    } 
    //printing out the total and winner of the election 
    cout << "Total" << "\t\t\t" << fixed << setprecision(0) << total << endl; 
    cout << "The winner of the elections is " << name[max] << "." << endl; 

    delete[]name; 
    delete[]votes; 

    cout << "Program ended with exit code: 0" << endl; 

    return 0; 

} 
+0

Empfehlung: die Benutzereingabe entfernen und eine Reihe von Werten in den Feldern hart codieren. Auf diese Weise sind Sie 1. Zeit sparen, den gleichen Mist wieder und wieder eingeben. 2. Immer den gleichen Eingang durch Tippfehler verfälscht. 3. Präsentieren Sie Ihren genauen Testfall denen von uns hier draußen im Internet. – user4581301

Antwort

1

Sie müssen Daten consistnt machen, also halten sie zusammen in struct, versuchen:

#include <iostream> 
#include <string> 
#include<iomanip> 
using namespace std; 

/*void selectionSort(double votes[], string name[], double len) 
{ 

    for (int i = 0; i < len-1; i++) 

    { 
     double max = (int)i; 


     for (int j = i+1; j < len; j++) 
     { 

      if (votes[j]>votes[(int)max]) 
      { 
       double temp = votes[i]; 
       votes[i] = votes[j]; 
       votes[j] = temp; 

       string temp2 = name[i]; 
       name[i] = name[j]; 
       name[j] = temp2; 
      } 

     } 
    } 
}*/ 

struct candidate{ 
    string *name; 
    double votes; 
    double percentage; 
}; 

void insertionSort(candidate candidates[], double len) 
{ 
    for (int i = 0; i < len - 1; i++) 
    { 
     int j = i + 1; 
     candidate tmp = candidates[i]; 
     while (j > 0 && tmp.votes > candidates[j-1].votes) 
      { 
        candidates[j] = candidates[j - 1]; 
        j--; 
        candidates[j] = tmp; 
      } 
    } 

} 
int main() 
{ 
    //Declaring variables 
candidate candidates[5]; 
    double total = 0; 
    int max = 0; 

    //for condition for user to input Canditate names and the votes received 
    for (int i = 0; i < 5; i++) 
    { 
     candidates[i].name = new string; 
     cout << "Please input the canditate " << i + 1 << " " << "name: " << endl; 
     cin >> *(candidates[i].name); 
     cout << "Please input the canditate " << i + 1 << " " << "votes: " << endl; 
     cin >> candidates[i].votes; 
     total = total + candidates[i].votes; 

    } 
    //Q1 or Q2 
    //selectionSort(candidates, 5); 
    insertionSort(candidates, 5); 

    //printing out the Canditate, voters received, and % of total votes 
    cout << "Candidate" << "\t\t" << "Votes Received" << "\t\t" << "% of Total Votes" << endl; 
    //for loop in order to find % of total votes, winner of election 
    for (int i = 0; i < 5; i++) 
    { 
     cout << *(candidates[i].name) << "\t\t\t" << fixed << setprecision(0) << candidates[i].votes << "\t\t\t" << fixed << setprecision(2) << (candidates[i].votes * 100/total) << endl; 

    } 
    //printing out the total and winner of the election 
    cout << "Total" << "\t\t\t" << fixed << setprecision(0) << total << endl; 
    cout << "The winner of the elections is " << *(candidates[0].name) << "." << endl; 

    for(int i=0; i<5; ++i) 
    delete candidates[i].name; 

    cout << "Program ended with exit code: 0" << endl; 

    return 0; 

} 
+0

Es hat nicht funktioniert, auf diese Weise werden sie in aufsteigender Reihenfolge statt absteigend gedruckt. Kann ich es ändern, ohne meine Hauptfunktion zu ändern? – Omar

+0

Versuchen Sie jetzt alles, was Sie brauchen, um Anmelden "tmp.votes> Kandidaten [j-1] .votes" zu ändern, ich habe es bereits geändert – user3655463

+0

es hat funktioniert. Vielen Dank für die Hilfe. – Omar

Verwandte Themen