【问题标题】:Ballot counting nested loop confusion选票计数嵌套循环混乱
【发布时间】:2016-07-07 07:58:40
【问题描述】:

问题: 假设必须从三位候选人中选出一位新的市议会成员,并假设有 4 个投票站。我们需要一个 C++ 程序来计算每个候选人的选票并显示结果。在每个投票站,选民通过在选票上选择 A、B 或 C 进行投票。投票官员必须将选票输入程序,以便计票。输入特定投票站的所有选票后输入 X。

-使用for循环从1到投票站的数量。

-在for循环内部是一个while循环,提示用户他们想投票给谁。

-while 循环内部是一个 switch 语句,用于增加总数并默认计算被破坏的票数。

-theher循环被退出时x选择x选择。

-当退出for循环时,显示三个总数和弃票数。

#include <iostream>
using namespace std;

int main()
{
    const int VOTING_STATIONS = 4;
    int votesForA = 0, votesForB = 0, votesForC = 0, spoiltVotes = 0;
    char vote;
    int  numVotes;


    for (int i = 0; i <= VOTING_STATIONS; i++)
    {
        numVotes = 0;

        while (vote != 'X')
        {

            cout << "Which candidate do you want to choose?:" << endl;
            cin >>vote;


            switch(vote)
            {
                case 'A':
                votesForA++;
                break;
                case 'B':
                votesForB++;
                break;
                case 'C':
                votesForC++;
                break;
                case 'X':
                break;
                default:
                spoiltVotes++;
                break;

             }
         }
    }

    // display results
    cout << "Total candidate A: " << votesForA << endl;
    cout << "Total candidate B: " << votesForB << endl;
    cout << "Total candidate C: " << votesForC << endl;
    cout << "Total spoilt votes: " << spoiltVotes << endl;

    return 0;
}

最后我完全迷失了这个程序,我不知道该怎么办了。非常感谢任何帮助。

【问题讨论】:

  • 您的 switch 语句可能是错误的。 case 应该以 break; 结尾,以防止跌倒
  • “从 1 到投票站数量的 for 循环”在哪里。那些嵌套的for 循环是什么?
  • vote 首次未初始化。

标签: c++ for-loop while-loop switch-statement nested-loops


【解决方案1】:

如果我理解了这个问题,那么您主要需要用站上的循环替换嵌套的 for 循环并稍微清理一下开关:

#include <iostream>
using namespace std;
int main()
{
    // initialise totals
    const int NR_VOTING_STATIONS = 4;
    int votesForA = 0, votesForB = 0, votesForC = 0, spoiltVotes = 0;

    char votes[] = { "ABCXAXBXBX" };
    int  numVotes = -1;

    // loop over the voting stations
    for( int i = 0; i < NR_VOTING_STATIONS; ++i)
    {
        char vote = 0;

        while( vote != 'X' )
        {
            cout << "Which candidate do you want to choose: ";
            vote = votes[++numVotes];
            std::cout << vote << std::endl;

            switch (vote)
            {
            case 'A':
                ++votesForA; 
                break;
            case 'B':
                ++votesForB;
                break;
            case 'C':
                ++votesForC;
                break;
            case 'X':
                break;
            default:
                ++spoiltVotes;
                break;
            }
        }
    }
    // display results
    cout << "Total candidate A: " << votesForA << endl;
    cout << "Total candidate B: " << votesForB << endl;
    cout << "Total candidate C: " << votesForC << endl;
    cout << "Total spoilt votes: " << spoiltVotes << endl;

    return 0;
}

Live on Coliru

【讨论】:

  • 感谢您的帮助,我现在正在处理我的代码,但在您的代码中我不明白为什么有一个 int numVotes = -1?这对程序有何影响?在查看了您的代码并调整了我的代码后,它现在似乎永远运行,即使在提交了一个“X”之后应该结束每个投票站的循环,然后显示芭蕾舞的结果?
  • 这只是为了让代码在没有用户输入的情况下运行。 vote = votes[ ++numVotes ] 递增然后访问votes 中的虚假用户输入。所以它读取votes[0]votes[1],直到四个X被读取。
  • 我现在离这个有点近了。目前它运行完美,但每次输入“X”时都会停止,我该如何让它在停止之前读取四个“X”。我已将我的代码更新为目前几乎可以工作的状态。
  • 那是因为您删除了我的代码中存在的char vote = 0;。否则vote 将保持'X' 并跳过以下所有投票站,因为while( vote != 'X' ) 仍然为真。
  • 您不应该如此彻底地改变您的问题。你应该只追加。否则 cmets 将毫无意义。
猜你喜欢
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
相关资源
最近更新 更多