Сделал цикл do while, и он считает только половину времени (c) - PullRequest
0 голосов
/ 07 мая 2019

Я предполагаю подсчитать голоса двух кандидатов и показать результат того, кто победил, но когда пользователь сообщает, сколько там избирателей, программы запускаются только в половине случаев. Кроме того, по какой-то причине вопросы всегда появляются два раза, например, если они проходят через цикл, но ничего не делают (если 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 ]

2 голосов
/ 07 мая 2019

Кроме того, по какой-то причине вопросы всегда появляются два раза, например, если они проходят через цикл, но ничего не делают

Это, конечно, большая подсказка ... если цикл выполняется дважды для каждого ввода, но, похоже, ничего не делает во второй раз, то это объясняет, почему кажется, что он выполняется только вдвое меньше, чем вы ожидаете , верно?

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

Хммм, scanf() часто является причиной таких проблем. Ваш scanf() вызов читает только один символ за раз, верно? Но когда вы вводите голосование, сколько символов вы набираете? Могу поспорить, вы печатаете что-то вроде j<return>. Это два символа, а не один.

Установите точку останова на первом if в цикле и посмотрите, если в половине случаев вы нажмете на него, значение vote равно \n.

0 голосов
/ 07 мая 2019

Я предоставляю вам код Java для того, что вы делаете, я пробовал использовать другой ввод, и он завершается,

ваш код, кажется, в порядке, он должен работать, то, что я делаю, то же самоеэто то, что вы сделали, здесь он проходит по всем выборщикам и выдает результат, который выиграл ... он подсчитывает голоса, которые являются суммами или суммами, и сравнивает их и печатает, кто выиграл ... надеюсь, я помог, предоставив эквивалентный код.

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"); 
        }
}
0 голосов
/ 07 мая 2019

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++;
}

Хотя пробельные символы все еще вызывают прохождение цикла, он будетничего не делать.

...