【问题标题】:Beginner C++ Voting Program using const literal使用 const 字面量的初学者 C++ 投票程序
【发布时间】:2021-07-18 02:12:07
【问题描述】:

我在另一个论坛上遇到的这个程序是一个投票程序,有人在编译时遇到问题。给出的任何答案都与程序员想要的不符。所以我在这里尝试自己编辑代码后得到一些有效的答案。

我目前遇到的问题是当我输入变量时,它仍然运行一个无限循环。在我输入 5 票之前,我没有正确地执行设计以执行哪些操作?

#include <iostream>

using namespace std;

const int ev = 5; //max. # of votes
int votesA = 0, votesB = 0, votesC = 0, spoiltvotes = 0; //total votes already initialized globally
int vote; //input variable

int main()
{
    //loop over the voting stations
    int i;
    for(i = 0; i <= ev; i++)
   
   {
    //loop over the votes
    cout << "Enter your vote: \t";
    cin >> vote;
    while(vote <= 5)
    {

        switch(vote)
        {
            case 1: votesA++;
            break;

            case 2: votesB++;
            break;

            case 3: votesC++;
            break;

            default: spoiltvotes++;
        }

    }
   } 
    //display results neatly
    cout << "# of votes for candidate A: \t" << votesA;
    cout << "\n # of votes for candidate B: \t" << votesB;
    cout << "\n # of votes for candidate C: \t" << votesC;
    cout << "\n # of spoilt votes: \t" << spoiltvotes;

    return 0;
}

更新结果:我已经修复了无限循环,但由于某种原因,循环仍在迭代 6 次而不是 5 次,这给了我大量的数字而不是个位数。

#include <iostream>

using namespace std;

int main()
{
   const int ENDvote = 5; //max. # of votes

    //loop over the voting stations
    int vote;
    int spoiltvotes;
    for(vote = 0; vote >= ENDvote; vote++)
    cout << "1. Candidate A\t 2. Candidate B\t 3. Candidate C" << endl;
   
   {
    //loop over the votes
    cout << "Enter your vote: \t";
    cin >> vote;

        switch(vote)
        {
            case 1:
            cout << "# of votes for candidate A:\t" << vote;
            break;

            case 2:
            cout << "# of votes for candidate B:\t" << vote;
            break;

            case 3:
            cout << "# of votes for candidate C:\t" << vote;
            break;

            default:
            cout << "# of spoilt votes:\t" << spoiltvotes;
            break;
        }
   } 

    return 0;
}

【问题讨论】:

  • 内部循环会一直要求投票,直到用户输入一个大于5的数字。我不认为你想要那个。事实上,我认为你根本不想要 while 循环。
  • 这不是关于性能的输入,但在cin &gt;&gt; vote; 你不知道你从用户那里得到了一个值,但是你放手了。
  • for(i = 0; i &lt;= ev; i++) 实际上会迭代 6 次。您可能只想使用&lt;。想你可能不知道,因为评论 //max. # of votes 暗示你想要 5 票,而不是 6 票。
  • 内循环while(vote &lt;= 5)一旦开始就会永远持续下去,因为循环体中的任何代码都不能修改vote的值。
  • 适当的缩进会让我们更容易看到发生了什么。

标签: c++ switch-statement constants literals


【解决方案1】:

您的代码存在明显问题。 当你进入你的for循环时:'for(i = 0; i >vote;'当你得到投票时'vote

Fred Larson 基本上说了我的意思。

我是堆栈溢出的新手,所以任何你认为我应该做的事情,请告诉我。

【讨论】:

    【解决方案2】:

    其他人已经评论过你的程序有什么问题,while 循环永远不会中断,因为vote 永远不会更新,如果vote 中的输入值是&lt;=5,它应该保持不变并且最终成为一个无限的while循环。

    for 循环中的 while 循环通常不是您想要的,应该仔细查看代码,看看您是否真的是这样 /em> 想要。如果不是,请重构它以坚持使用其中之一,而不是两者。

    您的问题似乎与此类似。从您的程序来看,您似乎想阅读在 5 个投票站投票的票数,然后计算每个候选人获得(或浪费)的票数。

    如果您使用 for 循环路线,您只需要遍历循环,读取投票数(以及输入验证),执行 switch case,然后继续进行 for 循环的下一次迭代。

    如果你走 while 循环路线,那么只需要一个 while 循环来读取五票,类似于

    while(std::cin>>vote) {
         switch(...
    

    并且做几乎相同的事情。

    此外,全局变量(再次)是usually 一个坏主意,特别是如果它们不是const。将它们移至您的main()

    另外,请注意break 语句只会破坏最内层的循环。所以,做类似的事情

    while(true) {
        int x = 1;
        switch(x) {
            case 1:
            break;
        }
    }
    

    不会打破while循环。

    【讨论】:

    • 当我发现自己陷入嵌套循环或switch in 循环的难题时,我将循环拉出并将其放入自己的函数中。当您找到循环退出条件,而不是无法完全退出的 break 时,您可以从函数中 return 并退出所有循环,switchs 或其他-你。
    • 我找到了循环迭代部分,但由于某种原因,我的结果中仍然有大量的数字。我编辑了我的帖子以获得更新的结果。你们当中有人介意检查一下吗? @magmamite125
    • @Japer 看看vote = 0; vote &gt;= ENDvote; 是否有帮助?您是从 0 开始,但是……为什么要进行 6 次迭代?
    • 我也这么认为,直到我在 vote = 0; 中输入 1,它仍然给了我相同的票数。我什至尝试删除const int ENDvote = 5; 看看它是否会给出我预期的结果,但它仍然给出了确切的结果。我想知道是否需要更新 VS 代码中的 tasks.json 和 settings.json 文件。
    • @Japer for(vote = 0; vote &gt;= ENDvote; vote++) 应更改为 for(idx= 0; idx &lt; ENDvote; idx++) 以进行 5 次迭代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多