Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61
Завершенные тесты: 2
1

Цикл do.while не идет на следующую итерацию

26.06.2018, 21:56. Просмотров 338. Ответов 3
Метки нет (Все метки)

Товарищи форумчане.
Появилась проблема. Делая задание по одному предмету, наткнулся на проблему с циклом.
Кто может объяснить, почему при проверке условий цикл не идет на следующую итерацию, хотя по идее должен
если первое условие:
C++
1
abs(vmid - vmax) < e
и второе
C++
1
abs(vmid - vmin) < e)
по нулям, то почему он не входит на следующий шаг, а начинает выдавать результаты?
Может я где-то что-то напутал? Подскажите пожалуйста.
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <iostream>
#include <ctime>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "");
    ////////////
    int m, n;
    double e;                           //точность вычислений
    int bmin;
    double amax;
    double vmax;
    double vmid;
    double vmin;
    cout << "Программа нахождения решения матричной игры m x n" << endl;
    cout << "Введите количество строк m: ";
    cin >> m;
    cout << "Введите количество столбцов n: ";
    cin >> n;
    int **pay_matrix = new int* [m];    //массив платежной матрицы
    for (int i = 0; i < m; i++)
        pay_matrix[i] = new int[n];
    int *lose2_matrix = new int[m];     //массив накопленных проигрышей Игрока 2
                                        //(соответствует значениям Ai в таблице)
    int *win1_matrix = new int[n];      //массив накопленных выигрышей Игрока 1
                                        //(соответствует значениям Bi в таблице)
    int *pa = new int[m];               //массив, в элементах которого подсчитывается количество
                                        //выпадения соответствующей(по номеру) стратегии Игрока 1
    int *pb = new int[n];               //то же для игрока 2
    for(int i = 0; i < m; i++)
        for (int g = 0; g < n; g++)
        {
            cout << "h(" << i + 1 << ", " << g + 1 << "):";
            cin >> pay_matrix[i][g];
        }
    
    //Предварительно обнуляем значения массивов a и pa
    for (int i = 0; i < m; i++)
    {
        lose2_matrix[i] = 0;
        pa[i] = 0;
    }
    for (int i = 0; i < n; i++)
    {
        win1_matrix[i] = 0;
        pb[i] = 0;
    }
    cout << "Введите точность вычислений (например: 0,001): ";
    cin >> e;
    
    //рандомизация
    srand(time(0));
    int g = 1 + (rand() % 1) * (n - 1); //Первый ход Игрока 1 определяем случайным образом
    int k = 0;                          //Вводим счетчик итераций
    do                                  //Начало итерационного процесса
    {
        k++;
 
        //Определяем очередную строку значений Bi и выбираем минимальное из них в переменную j
        //Для этого сначала вычисляем первый элемент считаем его минимальным
        bmin = pay_matrix[g][1] + win1_matrix[1];
 
        //Номер минимального элемента сначала равен 1
        int j = 1;
        win1_matrix[1] = bmin;
        for (int i = 1; i < n; i++)
        {           
            //Далее, все остальные элементы Bi определяются и если очередное значение Bi меньше 
            //минимального, то это значение объявляется минимальным и в j запоминается номер i этого Bi
            win1_matrix[i] = pay_matrix[g][i] + win1_matrix[i];
            if (win1_matrix[i] < bmin)
            {
                bmin = win1_matrix[i];
                j = i;                  
            }
        }
        //Подсчет количества применения j - стратегии Игроком 2 в j-элементе массива pb
        pb[j]++;
        vmin = bmin / k;
        //Используя найденное значение j аналогично определяем amax, g и vmax
        amax = pay_matrix[1][j] + lose2_matrix[1];
        lose2_matrix[1] = amax;
        g = 1;
        for (int i = 1; i < m; i++)
        {
            lose2_matrix[i] = pay_matrix[i][j] + lose2_matrix[i];
            if (lose2_matrix[i] > amax)
            {
                amax = lose2_matrix[i];
                g = i;
            }
        }
        pa[g]++;                    //Подсчет количества применения g - стратегии игроком 1
        vmax = amax / k;
        vmid = (vmin + vmax) / 2;
 
        /*
        Проверка
        cout << endl << endl;
        cout << (abs(vmid - vmax) < e) << endl;
        cout << (abs(vmid - vmin) < e) << endl;
        cout << ((abs(vmid - vmax) < e) && (abs(vmid - vmin) < e)) << endl;
        */
 
    } while ((abs(vmid - vmax) < e) && (abs(vmid - vmin) < e));
    //Конец итерационного процесса определяется условием близости средних значений 
    //выигрыша и проигрыша к их среднему значению с заданной точностью e 
    cout << "При точности " << e << " за " << k << " партий:\n";
    cout << " накопительный выигрыш " << amax << ", накопительный проигрыш " << bmin << endl;
    cout << "Цены игры:" << endl;
    cout << "\tсредняя максимальная " << vmax << endl;
    cout << "\tсредняя минимальная " << vmin << endl;
    cout << "\tсредняя " << vmid << endl;
    cout << "Оптимальная стратегия Игрока 1" << endl;
    for (int i = 0; i < m; i++)
        cout << i << "-" << pa[i] / k << endl;
    cout << "Оптимальная стратегия Игрока 2" << endl;
    for (int i = 0; i < n; i++)
        cout << i << "-" << pb[i] / k << endl;
    ////////////
    system("pause");
    return EXIT_SUCCESS;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2018, 21:56
Ответы с готовыми решениями:

Как реализовать переход на следующую итерацию внешнего цикла из вложенного?
Есть ли способ завершить или продолжить внешний цикл из вложенного? Пример : for (i = 0; i &lt; 10;...

Как реализовать переход на следующую итерацию внешнего цикла из вложенного?
Добрый вечер. Возможен ли в C++ переход на следующую итерацию внешнего цикла из вложенного? ...

Цикл не делает последнюю итерацию
for(x=1;x&lt;=4;x+=0.2) { cout&lt;&lt;x&lt;&lt;endl; } Почему последнее число которое выводит это 3.8, а...

Выход из цикла и переход на следующую итерацию
как в в 1С сделать выход из цикла или перейти на следующую итерацию в цикле??... в С++ это...

3
QuakerRUS
822 / 632 / 302
Регистрация: 30.10.2017
Сообщений: 1,899
Завершенные тесты: 4
26.06.2018, 22:23 2
Какие там начальные значения забивать?
0
Verevkin
Продавец времени
3347 / 1848 / 424
Регистрация: 12.03.2015
Сообщений: 9,331
26.06.2018, 23:14 3
поставь брейкпойнт на 107 строку и посмотри, почему выражение даёт false.
0
Kuzia domovenok
3014 / 2557 / 666
Регистрация: 25.03.2012
Сообщений: 9,136
Записей в блоге: 1
Завершенные тесты: 1
26.06.2018, 23:19 4
ну потому и не идёт, что разница ещё не достигла e
цикл должен крутиться, пока она больше e, а не меньше
0
26.06.2018, 23:19
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2018, 23:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не осуществляется переход на следующую итерацию цикла
Здравствуйте! Сделал простейший калькулятор на C#, чтобы вспомнить основы языка. В конце, вместо...

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

Цикл не переходит на вторую итерацию
Доброго времени суток! пишу следующий код: for ($i = 0; $i &lt; 2; $i++) { // условие выхода...

Не идет цикл For в VBscript :)
&lt;html&gt; &lt;head&gt; &lt;!--ниже инструкция необходимая для работы VBScript в браузере Internet Explorer...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.