无法在 for 循环中显示正确的百分比或数组的总数

Cannot display proper percentage, or total from array in for loops

我的程序遇到的问题是,首先,当我计算百分比时,它没有将数组中的所有元素加到总和中,然后从中提取它们。我试着把 total += percents[i];在嵌套的 for 循环中,但它只给了我负数 %.

此外,我最后的总数不会显示任何内容。起初,我有它和 main() 中定义的所有函数,但它什么也没做。即使更改后,它也不起作用。另外,最后一件事,我的文件有 20 个项目,但循环只读入 19 个项目。如果我更改为 20,它会崩溃。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void inputValues(string names[], int votes[])
{

    ifstream inputfile;

    inputfile.open("votedata.txt");

    if(inputfile.is_open())
    {
         for(int i = 0; i < 19; i++)
         {
             inputfile >> names[i] >> votes[i];
         }
    }
}

double *calcPercents( double percents[], int votes[], double total)
{
    for(int i = 0; i < 19; i++)
    {
        percents[i] = votes[i];

        total += percents[i];

        percents[i] = (percents[i]/total)*100;
    }

    return percents;
}

string determineWinner(string names[], double percents[])
{
    double temp = 0;
    string winner;
    for(int i = 0; i < 19; i++)
    {
        if(percents[i] > temp)
        {
            temp = percents[i];
            winner = names[i];
        }
    }
    return winner;
}

void displayResults(string names[], int votes[], double percents[])
{
    int total = 0;
    calcPercents(percents, votes, total);
    cout << "Candidate  Votes Received  % of Total Votes " << endl; 
    for(int i = 0; i < 19; i++)
    {
        cout << names[i] << "       " << votes[i] << "      " << percents[i] << "%" << endl;
    }
    cout << "Total " << total << endl;

    cout << " The winner of the election is " << determineWinner(names, percents) << endl;

}

int main()
{
  string names[19], winner;
  int votes[19];
  double percents[19];

  inputValues(names, votes);
  displayResults(names, votes, percents);
}

我的文件是这样的样式:

bob (tab) 1254

joe (tab) 768

等等

如果您必须使用数组而不是 std::vectors,您应该将它们的大小传递给使用它们的函数。一种方法是使用常量设置大小,如下所示:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;  // bad practice

const int size = 20;

void inputValues(string names[], int votes[], int n);
// add the size as a parameter of the function ^^^^

int calcPercents( double percents[], int votes[], int n );
//^^ I'll explain later why I changed your signature ^^^

string determineWinner(string names[], double percents[], int n );
void displayResults(string names[], int votes[], double percents[], int n);

int main()
{
    // It's always better to initialize the variables to avoid undefined behavior
    // like the negative percentages you have noticed
    string names[size] ="";
    int votes[size] = {0};
    double percents[size] = {0.0};

    inputValues(names, votes, size);
    displayResults(names, votes, percents, size);
}

要计算百分比,您可以使用两个循环,一个用于求和,另一个用于获取百分比。在您的函数中,您按值将总计作为参数传递,因此它将被复制并且更改永远不会在函数外部可见。我选择 return 那个值,即使这样做函数的名称也会有点误导:

int calcPercents( double percents[], int votes[], int n )
{
    int total = 0;
    for(int i = 0; i < n; i++)
    // note the bound ^^^
    {
        total += votes[i];
    }
    double factor = 100.0 / total;
    for(int i = 0; i < n; i++)
    {
        percents[i] = factor * votes[i];
    }
    return total;
}

你还应该在输入函数中添加一些检查,我只添加了大小参数。请注意,初始化数组后,即使读取文件失败,数组也不包含随机值:

void inputValues(string names[], int votes[], int n)
{

    ifstream inputfile;

    inputfile.open("votedata.txt");

    if(inputfile.is_open())
    {
        for(int i = 0; i < n; i++)
        {
            inputfile >> names[i] >> votes[i];
        }
    }
}

我也会更改确定获胜者的函数:

string determineWinner(string names[], double percents[], int n )
{
    if ( !n ) 
    {
        return "";
    }
    double max = percents[0];
    // update an index instead of a string
    int winner = 0;              
    for( int i = 1; i < n; i++ )
    {
        if( percents[i] > max )
        {
            max = percents[i];
            winner = i;
        }
    }
    return names[winner];
}

最后一个函数,只记得加上尺寸:

void displayResults(string names[], int votes[], double percents[], int n)
{
    int total = calcPercents(percents, votes, n);
    cout << "Candidate  Votes Received  % of Total Votes " << endl; 
    for( int i = 0; i < n; i++ )
    {
        cout << names[i] << "       " << votes[i] << "      "
             << percents[i] << "%" << endl;
    }
    cout << "Total " << total << endl;

    cout << " The winner of the election is "
         << determineWinner(names, percents,n) << endl;    
}