做了一个do while循环,它只计数应有的一半次数(c)

时间:2019-05-06 21:50:27

标签: c do-while

我想计算2名候选人的票数,并显示谁赢得了选举的结果,但是当用户说出有多少名选民时,该程序只运行应有的一半时间。另外,由于某种原因,问题总是出现两次,例如它是否通过循环但什么都不做(如果n是奇数,它会下降。

我也尝试过使用“ for”循环来完成此操作,但是我遇到了同样的问题

#include<stdin.h>
#include<stdlib.h>

void main()
{
  int sumj=0,summ=0,counter=0,n;
  char vote;

  printf("how many electors are there?\n");
  scanf("%d",&n);

  do
  {
    printf("Whats your vote? m for maria j for james\n");
    scanf("%c",&vote);

    if (vote=='j')
    {
        sumj++;
    }
    if (vote=='m')
    {
        summ++;
    }

    counter++;
  } while (counter<n);

  if (sumj>summ)
    printf("james won");
  if (summ>sumj)
    printf("maria won");
  if (sumj==summ)
    printf("its a tie");
}

3 个答案:

答案 0 :(得分:2)

  

而且,由于某种原因,问题总是出现两次,例如它是否通过循环但什么都不做

当然,这是一个很大的提示...如果循环为每个输入执行两次,但第二次似乎没有执行任何操作,那么这可以解释为什么它似乎只执行预期次数的一半,对吧?

printf("Whats your vote? m for maria j for james\n");
scanf("%c",&vote);

嗯,scanf()通常是这类问题的根源。您的scanf()通话一次只能读取一个字符,对吗?但是,当您投票时,您要键入几个字符?我敢打赌,您输入的内容类似于j<return>。那是两个字符,而不是一个。

在循环中的第一个if上设置一个断点,看看击中一半的时间,vote的值为\n

答案 1 :(得分:0)

Scanf返回空白字符。由于只查找'j'或'm',因此看不到它们,但每次循环时它仍在递增计数。

如果在循环中添加一条语句,您会看到以下内容:

do
{
    ...
    printf("(vote='%c' counter=%d)\n", vote, counter);
    ...
} while (counter<n);

在我看来,如果您输入三个选举人,您的实际输入流为:“ 3”,“ \ n”,“ m”,“ \ n”。 3被scanf占用,但是'\ n'(当您按Enter键时)最终是第一票,'m'是第二票,另一个'\ n'是第三票。

有几种方法可以解决此问题,但最简单的方法就是忽略任何非投票字符:

if (vote=='j')
{
    sumj++;
    counter++;
}
else if (vote=='m')
{
    summ++;
    counter++;
}

尽管空格字符仍然导致循环继续运行,但它无济于事。

答案 2 :(得分:0)

我正在为您提供Java代码,您已经在尝试使用其他输入,并且运行完整,

您的代码似乎应该运行就可以了,我所做的与您所做的相同,在这里,它循环遍历所有选民并提供获胜的输出...它计算的票数是sumj或summ并进行比较他们和谁赢的印刷品...希望我能提供等效的代码来帮助您。

import java.lang.Math;
import java.util.*;

public class HelloWorld
{
    public static void main(String[] args)
    {
        int sumj=0,summ=0,n;
        char vote=0;

        Scanner scan = new Scanner(System.in);

        System.out.println("how many electors are there?");
        n = scan.nextInt();
        System.out.println("here are " + n + " Elector's are there\n\n");

        for(int i=0;i<n;i++)
        {
            System.out.println("Whats your vote? m for maria j for james\n");

            vote = scan.next().charAt(0);

            if(vote == 'j')
            {
                sumj++; 
            }
            else if(vote == 'm')
            {
                summ++;
            }
        }

        if(sumj > summ)
        {
            System.out.println("james won"); 
        }
        else if(summ > sumj)
        {
            System.out.println("maria won"); 
        }
        else
        {
            System.out.println("It's a Tie"); 
        }
}