Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
vladand
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
1

Как "выдрать" значение переменной из цикла

21.08.2013, 14:03. Просмотров 2433. Ответов 8
Метки нет (Все метки)

В общем. Есть глобальная переменная. Есть цикл в одной из функций, где значение этой переменной с каждым проходом изменяется. Нужно сохранить значение переменной после последнего прохода цикла. Я знаю, что после выполнения цикла, память очищается и все переменные обнуляются. Как можно задержать и вернуть значение переменной до "обнуления"?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 14:03
Ответы с готовыми решениями:

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года "весна", "лето", "осень", "зима" определить...

Почему переменной присваивается произвольное значение("мусор")?
Мой черновой вариант кода. Он очень черновой так что многое не суть важно, но...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов),...

С++ Подскажите как разобрать алгоритм цикла и добавить пару "надстроек"
#include "stdafx.h" #include "iostream" #include "cmath" using namespace...

Как работает "шаг цикла" в цикле for?
Всем привет! Я в с++ новичек !! кому не сложно обьясните как работает "шаг...

8
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
21.08.2013, 14:05 2
Цитата Сообщение от vladand Посмотреть сообщение
Есть глобальная переменная.
Цитата Сообщение от vladand Посмотреть сообщение
Я знаю, что после выполнения цикла, память очищается и все переменные обнуляются.
Она же глобальная, так что ничего не очиститься после выхода из цикла
1
vladand
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
21.08.2013, 14:18  [ТС] 3
Ладно, придется писать код, ибо сначала прога сначала не переписывала глоб. переменную, а теперь вообще крашится.
Программа представляет собой "путешествие стрелочки": есть поле из двумерного массива, которыей образует доску, есть стрелочка которая изначально находится в начале массива (а на поле слева сверху) и подчиняется командам пользователя. Пока команды 2(и то я реализовал только одну): движение прямо и поворот направо.
Каждому элементу массива изначально придаем значение 0(ложь), если элемент задела команда "движение прямо",то он принимает значение 1(истина).
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
int mass[20][20];
int povorot=0;
int Pi=0;
int Pj=0;
 
void PovorotFnc();
void Dvigenie(int Pi, int Pj);
 
int main()
{
    int enter;
 
    for (int i=0;i<20;i++)
        for (int j=0;j<20;j++)
            mass[i][j]=0;
 
    while(enter!=9)
    {
        cout << "Vvedite komandu: ";
        cin >> enter;
 
        switch(enter)
        {
            case(1): Dvigenie(Pi,Pj);
                break;
            case(2): PovorotFnc();
                break;
        }
    }
 
    return 0;
}
 
void PovorotFnc()
{
    povorot++;
    if(povorot==4)
    povorot=0;
}
 
void Dvigenie(int Pi, int Pj)
{
    int i,j,step;
 
    cout << "Vvedite kol-vo step: ";
    cin >> step;
 
    switch(povorot)
    {
        case(0):
            i=Pi;
            j=Pj;
            for(int g=step;g>0;g--)
            {
                mass[i][j]=1;
                j++;
            }
        case(1):
            i=Pi;
            j=Pj;
            for(int g=step;g>0;g--)
            {
                mass[i][j]=1;
                i++;
            }
        case(2):
            i=Pi;
            j=Pj;
            for(int g=step;g>0;g--)
            {
                mass[i][j]=1;
                j--;
            }
        case(3):
            i=Pi;
            j=Pj;
            for(int g=step;g>0;g--)
            {
                mass[i][j]=1;
                i--;
            }
    }
}
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
21.08.2013, 14:22 4
В case-секциях break не забыли?

Добавлено через 1 минуту
C++
1
2
3
    int enter;
//...
while(enter!=9)//Здесь при первом проходе enter еще не инициализирован и содержит мусор
1
vladand
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
21.08.2013, 14:28  [ТС] 5
Croessmah, я слоу, все исправил, крашиться перестала, спасибо, но переменная не робит :\

Добавлено через 2 минуты
добавил присвоение Pi=i или Pj=j в каждом цикле в функции движения и не робит
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
21.08.2013, 14:31 6
Цитата Сообщение от vladand Посмотреть сообщение
добавил присвоение Pi=i или Pj=j в каждом цикле в функции движения и не робит
Потому что у Вас глобальные переменные называются Pi и Pj, и переменные в параметрах тоже так называются, поэтому в данной функции они перекрывают глобальные переменные и все изменения относятся только к локальным.
1
vladand
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
21.08.2013, 14:35  [ТС] 7
Croessmah, спасибо, за оперативные ответы поменял названия параметров и все заробило))) кстати, а зачем в функции движение задавать два параметра, ведь функция ничего не возвращает? я пробовал без них, компилятор не пропускает.
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
21.08.2013, 14:37 8
Цитата Сообщение от vladand Посмотреть сообщение
кстати, а зачем в функции движение задавать два параметра
Ну это у Вас надо спросить
раз уж используете глобальные переменные, то можете их вообще убрать и в вызове, и в объявлении/определении функции.
1
vladand
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
21.08.2013, 15:31  [ТС] 9
Croessmah, мда, я действительно тормоз спасибо за помощь

Добавлено через 33 минуты
в общем программа заработала, но заработала с косяком :\ почему-то если для движения выбрать 5 элементов, стрелочка переместится на 6 элементов(пропуская первый), и если попробовать нарисовать крадрат со стороной 5, то выведется квадрат со стороной 6.
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
int mass[20][20];
int povorot=0;
int Pi=0;
int Pj=0;
 
void PovorotFnc();
void Dvigenie();
 
int main()
{
    int enter;
 
    for (int i=0;i<20;i++)        //присваиваем каждому
        for (int j=0;j<20;j++)    //элементу массива
            mass[i][j]=0;         //значение 0
 
    do
    {
        cout << "Vvedite komandu: ";     //выбираем действие
        cin >> enter;
        
        switch(enter)
        {
            case(1): Dvigenie();
                break;
            case(2): PovorotFnc();
                break;
        }
    }while(enter != 9);
 
for (int i=0;i<20;i++)               // выводим "картинку" массива
        {                            // где вместо элемента "истина"
            for (int j=0;j<20;j++)   // печатаем звездочку 
            {                        // а вместо элемента "ложь" пробел  
                if(mass[i][j]==1)
                    cout << " *";
                else
                    cout << "  ";
            }
        cout << endl;
 
        }
 
    return 0;
}
 
void PovorotFnc()            // функция поворота
{
    povorot++;
    if(povorot==4)
    povorot=0;
}
 
void Dvigenie()               // функция движения  
{
    int i,j,step;
 
    cout << "Vvedite kol-vo step: ";
    cin >> step;
 
    switch(povorot)
    {
        case(0):
            i=Pi;
            j=Pj;
            for(int g=step;g>0;g--)
            {
                mass[i][j]=1;
                j++;
                Pj=j;
            }
        break;
        case(1):
            i=Pi;
            j=Pj;
            for(int g=step;g>0;g--)
            {
                mass[i][j]=1;
                i++;
                Pi=i;
            }
        break;
        case(2):
            i=Pi;
            j=Pj;
            for(int g=step;g>0;g--)
            {
                mass[i][j]=1;
                j--;
                Pj=j;
            }
        break;
        case(3):
            i=Pi;
            j=Pj;
            for(int g=step;g>0;g--)
            {
                mass[i][j]=1;
                i--;
                Pi=i;
            }
        break;
    }
}
думаю проблема в приоритете в этой части кода
C++
1
2
3
4
5
6
for(int g=step;g>0;g--)
            {
                mass[i][j]=1;
                j++;
                Pj=j;
            }
где выполняется сначала инкремент, а затем все остальное

Добавлено через 14 минут
понял, что дело не в инкременте а в том, после первого присваивания в цикле переменная уже инкременирована. поменял местами и все заработало
0
21.08.2013, 15:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 15:31

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую...

Как отключить автоматическое добавление "_" "@" "number" к имени экстернального метода?
Здраствуйте! Подскажите как это делается? (вопрос в названии темы) среда :...

Как вычленить значение переменной из цикла?
Вводится текст. Программа показывает подтекст с элемента N до элемента M. N и M...


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

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

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