2016-11-18 61 views
-1

我面臨插入排序功能的問題。而我正在嘗試按降序打印投票和姓名。選票似乎有效,但名稱按降序排列而不是降序排列。我插入的名稱A B C dËf和5 4 3 2 1對於票後,它看起來像這樣:插入在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 . . . 

候選需要爲E d C B A代替A B C d電子商務。
這是我的代碼如下。任何幫助將不勝感激。

#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

建議:刪除用戶輸入和硬編碼的一組值到數組。這樣你就可以節省時間在一遍又一遍地輸入相同的垃圾。 2.始終測試未受錯別字破壞的相同輸入。 3.在互聯網上向我們這些人介紹您的確切測試案例。 – user4581301

回答

1

你需要讓數據consistnt,即在結構保持在一起,嘗試:

#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

它沒有工作,用這種方法他們按升序打印出來而不是降序。有沒有辦法改變它而不改變我的主要功能? – Omar

+0

現在嘗試所有你需要改變登錄「tmp.votes>候選人[j-1] .votes」,我已經改變它 – user3655463

+0

它的工作。非常感謝你的幫助。 – Omar