abdalla_30 Ответов: 2

Как мне сделать опрос для 20 студентов, чтобы они выбрали свой любимый предмет из 4 вариантов


Когда я составлял программу из 20 студентов, чтобы выбрать свой любимый предмет в c
я написал это так:

Поэтому я не знаю, какую ошибку я совершил, чтобы получить два утверждения (введите выбор )
почему я получаю два сканфа каждый раз

Что я уже пробовал:

#include <stdio.h>

void main()
{
    char x;
    int Acount=0,Bcount=0,Ccount=0,Dcount=0,counter=1;
    printf("A. Mathematics\nB. Economics\nC. Programming\nD. Physics\n");
    while(counter<20)
    {
        printf("enter choice:\n");
        scanf("%C",&x);
        if(x=='A')
        {
            Acount++;
        }

        if(x=='B')
        {
            Bcount++;
        }

        if(x=='C')
        {
            Ccount++;
        }

        if(x=='D')
        {
            Dcount++;
        }

        counter++;
}

    printf("number of students who chose Mathematics=%d\n",Acount);
    printf("number of students who chose Economics=%d\n",Bcount);
    printf("number of students who chose Programming=%d\n",Ccount);
    printf("number of students who chose Physics=%d\n",Dcount);
}

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
Поэтому я не знаю, какую ошибку я совершил, чтобы получить два утверждения (введите выбор )
почему я получаю два сканфа каждый раз

Вы уже получили объяснение в S1 благодаря знанию помощника.
Есть и другой подход: отладчик сам исследует, что происходит.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
0

k5054

scanf("%C", &x) считывает только один символ из входного потока, но когда пользователь вводит свой выбор, он, вероятно, нажимает "A", а затем нажимает [Enter], так что входной поток на самом деле является "A\n", где "\n " -символ новой строки. Вероятно, вам следует сделать что-то вроде

char x;
scanf("%c%*s", &x);  /* %*s throws away the rest of the input string

Спецификатор формата "%C" для scanf ожидает тип wchar, поэтому вы должны либо изменить определение x на wchar, либо изменить формат на "%c" (обратите внимание на верхний и нижний регистры).
Что произойдет, если пользователь введет "X" или "a"? Может быть, тебе стоит что-то с этим сделать?


abdalla_30

Ладно я понял
но когда я запустил программу у меня получилось вот так
введите выбор:
Один
Б
введите выбор:
С
введите выбор:


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

abdalla_30

Ладно я понял
но когда я запустил программу у меня получилось вот так
введите выбор:
Один
Б
введите выбор:
С
введите выбор:


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

k5054

Выглядит как scanf("%c%*s") не совсем то, что я ожидал. Может быть, попробовать использовать getchar() вместо. Если вы сделаете это, не забывайте, что вам все равно нужно прочитать конечную букву "\n " в строке и любые другие символы, которые пользователь мог ввести. Цикл while должен сделать свое дело.