Форум программистов, компьютерный форум CyberForum.ru

Не могу определить элементарной ошибки - C++

Восстановить пароль Регистрация
 
TheFaiRmaN
 Аватар для TheFaiRmaN
0 / 0 / 0
Регистрация: 20.07.2013
Сообщений: 5
20.07.2013, 22:07     Не могу определить элементарной ошибки #1
Почему-то значение summ (сумма правильных ответов) иногда не правильно обрабатывается (не смог выявить закономерности при каких условиях), хотя его изменение стоит четко после условия о_0
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <conio.h>
#include <time.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
/*2)      Написать программу проверки знания таблицы умножения. Программа должна вывести 8 
примеров умножения и выставить оценку успешности в % (соотношение количества правильных 
ответов к общему количеству вопросов) и по 12-балльной системе по следующей шкале: 
Кол-во правильных ответов   Оценка
8   12
7   10
6   8
5   6
4   4
3   3
2   2
1   1
0   0
 
Ниже приведен рекомендуемый вид экрана во время работы программы. Ответы пользователя выделены 
полужирным шрифтом.
 
*** Проверка знания таблицы умножения ***
После примера введите ответ и нажмите <Enter>.
5x3=15
7x7=49
1x4=4
4x3=12
9x4=36
8x8=64
7x8=52
Вы ошиблись! 7x8=56
4x7=28
Правильных ответов: 7
Успешность: 88%
Оценка: 10 баллов.
 
Примечание:
? примеры генерируются случайным образом (каждый раз - разные).
? стоимость задания повышается, если слово “балл” после оценки будет выведено в правильной 
форме (например, 1 балл, 4 балла, 12 баллов и т.д.).*/
 
srand(unsigned(time(NULL)));
int menu=0;
int a,b,c,answer,summ=0,value;
do
{
system("cls");
cout<<"*** Проверка знания таблицы умножения ***\nПосле примера введите ответ и нажмите <Enter>.\n";
    for (int i=0;i<8;i++)
    {
        a=1+rand()%10;
        b=1+rand()%10;
        c=a*b;
        cout<<a<<"x"<<b<<"=";
        cin>>answer;
        if (answer==c)
            summ++;
        else
            cout<<"Вы ошиблись! "<<a<<"x"<<b<<"="<<c<<endl;
    }
cout<<"\nПравильных ответов: "<<summ<<endl;
cout<<"Успешность: "<<(100.0/8)*summ<<"%"<<endl;
switch (summ)
{
case 8:
    value=12;
    break;
case 7:
    value=10;
    break;
case 6:
    value=8;
    break;
case 5:
    value=6;
    break;
default:
    value=summ;
}
cout<<"Оценка: "<<value<<" ";
if (value==0||value>=2&&value<=4)
    cout<<"балла.\n";
else
{
    if (value==1)
        cout<<"балл.\n";
    else
        cout<<"баллов.\n";
}
cout<<"\nНажмите любую клавишу для продолжения или Esc для выхода...\n";
menu=_getch();
}
while (menu!=27);
    system("PAUSE");
    return EXIT_SUCCESS;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2013, 22:07     Не могу определить элементарной ошибки
Посмотрите здесь:

Не могу исправить ошибки.... C++
Написать прогу с элементарной функцией y=x*x C++
C++ Помогите с элементарной ппрограммой на C
Не могу исправить ошибки C++
не могу найти ошибки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
20.07.2013, 22:28     Не могу определить элементарной ошибки #2
Цитата Сообщение от TheFaiRmaN Посмотреть сообщение
C++
1
2
if (value==0||value>=2&&value<=4) 
   cout<<"балла.\n";
мне кажется что здесь неправильно. скобок не хватает
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
20.07.2013, 22:32     Не могу определить элементарной ошибки #3
Вы не обнуляете результат при последующих выполнениях. Поэтому правильный - только первый ответ.

C++
1
2
3
4
5
6
7
do
{
     summ=0; // добавьте в начало цикла do while
 
..........
}
while(....);
TheFaiRmaN
 Аватар для TheFaiRmaN
0 / 0 / 0
Регистрация: 20.07.2013
Сообщений: 5
21.07.2013, 01:12  [ТС]     Не могу определить элементарной ошибки #4
Цитата Сообщение от BigLow Посмотреть сообщение
мне кажется что здесь неправильно. скобок не хватает
Когда один оператор, скобки не обязательны
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
Вы не обнуляете результат при последующих выполнениях. Поэтому правильный - только первый ответ.

C++
1
2
3
4
5
6
7
do
{
     summ=0; // добавьте в начало цикла do while
 
..........
}
while(....);
Мне не нужно обнулять значение summ в начале цикла, т.к. оно хранит кол-во правильных ответов после завершения цикла

Добавлено через 9 минут
В большинстве случаев оно отрабатывается правильно, но иногда значение summ превосходит 8-ми, хотя это в теории не возможно ведь у меня всего 8 шагов (итераций) в цикле...
TheFaiRmaN
 Аватар для TheFaiRmaN
0 / 0 / 0
Регистрация: 20.07.2013
Сообщений: 5
21.07.2013, 01:19  [ТС]     Не могу определить элементарной ошибки #5
Пример не корректной отработки программы (следовательно из этого, значение summ после цикла приобрело значение 16-ти):
Миниатюры
Не могу определить элементарной ошибки  
Melefaro
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 4
21.07.2013, 02:12     Не могу определить элементарной ошибки #6
Первый раз всё считается правильно, при втором тестировании переменная summ в самом начале хранит результат прошлого тестирования. И зачем подключаете библиотеку time.h?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <conio.h>
 
 
using namespace std;
 
int main()
{
setlocale(LC_ALL, "rus");
srand(unsigned(time(NULL)));
int menu=0;
int a,b,c,answer,summ=0,value;
do
{
[B]summ=0;[/B]
system("cls");
cout<<"*** Проверка знания таблицы умножения ***\nПосле примера введите ответ и нажмите <Enter>.\n";
    for (int i=0;i<8;i++)
    {
        a=1+rand()%10;
        b=1+rand()%10;
        c=a*b;
        cout<<a<<"x"<<b<<"=";
        cin>>answer;
        if (answer==c)
            summ++;
        else
            cout<<"Вы ошиблись! "<<a<<"x"<<b<<"="<<c<<endl;
    }
cout<<"\nПравильных ответов: "<<summ<<endl;
cout<<"Успешность: "<<(100.0/8)*summ<<"%"<<endl;
switch (summ)
{
case 8:
    value=12;
    break;
case 7:
    value=10;
    break;
case 6:
    value=8;
    break;
case 5:
    value=6;
    break;
default:
    value=summ;
}
cout<<"Оценка: "<<value<<" ";
if (value==0||value>=2&&value<=4)
    cout<<"балла.\n";
else
{
    if (value==1)
        cout<<"балл.\n";
    else
        cout<<"баллов.\n";
}
cout<<"\nНажмите любую клавишу для продолжения или Esc для выхода...\n";
menu=_getch();
}
while (menu!=27);
    system("PAUSE");
    return EXIT_SUCCESS;
}
Belfegor
Ghost
 Аватар для Belfegor
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
21.07.2013, 03:01     Не могу определить элементарной ошибки #7
Цитата Сообщение от Melefaro Посмотреть сообщение
зачем подключаете библиотеку time.h?
Цитата Сообщение от Melefaro Посмотреть сообщение
srand(unsigned(time(NULL)));
http://www.cplusplus.com/reference/ctime/time/
и
Цитата Сообщение от Melefaro Посмотреть сообщение
rand()
надо бы
C++
1
#include <cstdlib>
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.07.2013, 03:30     Не могу определить элементарной ошибки #8
Цитата Сообщение от Belfegor Посмотреть сообщение
надо бы
C++
1
#include <cstdlib>
инклюдится из iostream

Добавлено через 6 минут
Цитата Сообщение от TheFaiRmaN Посмотреть сообщение
Мне не нужно обнулять значение summ в начале цикла, т.к. оно хранит кол-во правильных ответов после завершения цикла
так тебе не нужно его обнулять в цикле for! А нужно в цикле while перед for надо поставить summ = 0;
TheFaiRmaN
 Аватар для TheFaiRmaN
0 / 0 / 0
Регистрация: 20.07.2013
Сообщений: 5
21.07.2013, 10:32  [ТС]     Не могу определить элементарной ошибки #9
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
Вы не обнуляете результат при последующих выполнениях. Поэтому правильный - только первый ответ.
Цитата Сообщение от Melefaro Посмотреть сообщение
Первый раз всё считается правильно, при втором тестировании переменная summ в самом начале хранит результат прошлого тестирования.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
так тебе не нужно его обнулять в цикле for! А нужно в цикле while перед for надо поставить summ = 0;
Это я понял, спасибо, но еще есть нюансик, скрин который я выложил выше, это первый прогон программы, тобишь первый шаг do while до запроса переменной menu
Tulosba
21.07.2013, 10:34
  #10

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
инклюдится из iostream
У каждой функции стандартной библиотеки есть свой родной хедер. Его и надо включать, если используешь эту функцию. Все остальные зависимости - от лукавого.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2013, 11:12     Не могу определить элементарной ошибки
Еще ссылки по теме:

C++ НЕ могу найти ошибки (с++)
C++ не могу избавится от ошибки
C++ Ошибка в элементарной программе

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
TheFaiRmaN
 Аватар для TheFaiRmaN
0 / 0 / 0
Регистрация: 20.07.2013
Сообщений: 5
21.07.2013, 11:12  [ТС]     Не могу определить элементарной ошибки #11
Хотя, может и не первый (дело ночью было, уже точно не помню). В общем всем отписавшимся - спасибо
ЗЫ Жаль нельзя редактировать свои сообщения спустя 5 мин...
Yandex
Объявления
21.07.2013, 11:12     Не могу определить элементарной ошибки
Ответ Создать тему
Опции темы

Текущее время: 06:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru