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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
#1

Статическая переменная возвращает непонятные шестизначные числа - C++

10.04.2014, 15:03. Просмотров 471. Ответов 13
Метки нет (Все метки)

Здравствуйте, обитатели этого форума. Кому не лень помогите разобраться со статической переменной number_of_left_seats. Почему она не выводится в виде нормальных чисел, а-ля 0, 1, ... 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <conio.h>
using namespace std;
 
//________________________________________________________________class________________________________________________________________________
class Marshroute{
    char name_nach_punkta[30];
    char name_kon_punkta[30];
    int nomer_marshrouta;
    int *filling;              //указатель на 0-ой елемент
    static int number_of_left_seats;
    static int number_of_seats;
public:
    Marshroute()
    {
        cout << "\nVvedite nazvanie nachalnogo punkta:\t\t"; cin >> name_nach_punkta;
        cout << "Vvedite nazvanie konechnogo punkta:\t\t"; cin >> name_kon_punkta;
        cout << "Vvedite nomer marshrouta:\t\t\t"; cin >> nomer_marshrouta;
 
        filling = new int[number_of_seats];
        for (int i = 0; i < number_of_seats; i++)
        {
            cout << "Vvedite zapolnenie mest s 0-ogo elementa:\t"; 
            cout << "filling" << "[" << i << "] = ";
            cin >> filling[i];
        }
    } 
    ~Marshroute()
    {
        for (int i = 0; i < number_of_seats; i++)
        {
            delete[] filling;
        }
    }
    Marshroute(bool for_loop){}
 
    int get_nomer_marshrouta()
    {
        return nomer_marshrouta;
    }   
    int get_filling()
    {
        return *filling;
    }
    void show()
    {
        cout << "\t" << name_nach_punkta << "                       \t" << name_kon_punkta << "                      \t" << nomer_marshrouta << "\n";
    }
 
    static void count_number_of_free_seats(int e[])
    {
        int temp_counter = 0;
        for (int i = 0; i < number_of_seats; i++)
        {
            temp_counter = temp_counter + e[i];
        }
        number_of_left_seats = number_of_left_seats - temp_counter;
    }
 
    static int set_number_of_left_seats()
    {
        cout << "\nVvedite chislo svobodnix mest vsego:";
        cin >> number_of_left_seats;
    }
    static int get_number_of_left_seats()
    {
        return number_of_left_seats;
    }
    static int get_number_of_seats()
    {
        return number_of_seats;
    }
 
};
//______________________________________________________________functions______________________________________________________________________
 
 
void sortirovka(Marshroute objects[], int n, bool for_loop)
{
    int i,k;
    bool t;
    Marshroute *temp = new Marshroute(for_loop);
    cout << "\n\n================================================================================";
    cout << "Nazvanie nachalnogo punkta | Nazvanie konechnogo punkta  |  Nomer marshrouta    ";
    cout << "================================================================================";
    //сортировка пузырьком
    do
    {
        t = true;
        for (k = 0; k <n - 1; k++)
        {
            if (objects[k].get_nomer_marshrouta()>objects[k+1].get_nomer_marshrouta())
            {
                *temp = objects[k+1];
                objects[k+1] = objects[k];
                objects[k] = *temp;
                t = false;
            }
        }
    } while (!t);
    
    //вывод на экран
    for (i = 0; i<n; i++)
            objects[i].show();
    cout << "================================================================================\n";
}
void poisk_nomera_marshrouta(Marshroute objects[], int n) 
{
    int i, k;
    cout << "\n\nVvedite nomer marshrouta: ";
    cin >> k;
    cout << "\n================================================================================";
    cout << "Nazvanie nachalnogo punkta | Nazvanie konechnogo punkta  |  Nomer marshrouta    ";
    cout << "================================================================================";
    for (i = 0; i<n; i++)
        if (k == objects[i].get_nomer_marshrouta())
            objects[i].show();
    cout << "================================================================================\n";
}
void prnmn()
{
    cout << "      MENU";
    cout << "\n\n0   - Vivesti chislo ostavshixsya svobodnix mest";
    cout << "\n1   - Vivesti na ekran";
    cout << "\n2   - Sortirovka";
    cout << "\n3   - Poisk po marshrouty";
    cout << "\nESC - Exit";
}
 
int Marshroute::number_of_left_seats = 12;
int Marshroute::number_of_seats = 4;
//_________________________________________________________________main________________________________________________________________________
void main()
{
    char key = '0';
    bool for_loop = false; 
    Marshroute *objects;
    int n;
    cout << "Vvedite chislo marshroutov: "; 
    cin >> n;
    objects = new Marshroute[n];
    int q;
    q = objects[0].get_number_of_seats();
    int *w;
    w = new int[q];
 
    
    while (key != 27)
    {
        system("cls");
        prnmn();
        key = _getch();
 
        switch (key)
        {
        case '0':   for (int i = 0; i < n; i++)
                    {
                    *w = objects[0].get_filling();
                    objects[0].count_number_of_free_seats(w);
                    cout << objects[0].get_number_of_left_seats();
                    }
                    _getch(); break;
        case '1':   cout << "\n\n================================================================================";
                    cout << "Nazvanie nachalnogo punkta | Nazvanie konechnogo punkta  |  Nomer marshrouta    ";
                    cout << "================================================================================";
                    for (int i = 0; i<n; i++)
                    {
                        objects[i].show();
                    };
                    cout << "================================================================================\n";
                    _getch(); break;
        case '2':   sortirovka(objects, n, for_loop);
                    _getch(); break;
        case '3':   poisk_nomera_marshrouta(objects, n);
                    _getch(); break;
        }
    }
    delete[] objects;
    _getch();
}
и еще вопрос: правильно ли я написал деструктор, есть подозрения, что он не полностью очищает память.

Добавлено через 15 часов 1 минуту
хелп плиз!!!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2014, 15:03     Статическая переменная возвращает непонятные шестизначные числа
Посмотрите здесь:

Статическая переменная - C++
Добрый день! Объясните пожалуйста, что такое статическая переменная, в каких случаях лучше использовать именно её и чем она вообще...

Статическая локальная переменная - C++
Помогите пожалуйста привести пример использования статической локальной переменной в функции

Статическая переменная в шаблоне - C++
// // (---.Array_hpp---) // #ifndef Array_HPP // Preprocessor gates #define Array_HPP #include...

Статическая переменная в классе - C++
Нужно вывести на экран порядковый номер объекта, используя статическую переменную для подсчета общего количества объектов #include...

Статическая переменная в методе класса - C++
Локальные статические переменные сохраняют свое значение между вызовами функций. Если сделать тоже самое с методом класса, то этот статик...

Найти все шестизначные счастливые числа (исправить код) - C++
Задание: Найти все шестизначные счастливые числа. Счастливое число - это число, у которого сумма левых трех цифр равна сумме правых трех....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
23238 / 15229 / 4426
Регистрация: 22.10.2011
Сообщений: 27,078
Записей в блоге: 4
10.04.2014, 15:40     Статическая переменная возвращает непонятные шестизначные числа #2
lion_wine,
1)
C++
1
2
3
4
5
    // метод класса
    int* get_filling()
    {
        return filling;
    }
2)
C++
1
2
3
4
5
6
7
8
9
10
11
12
    int *w;
    //w = new int[q]; // Это не нужно
 
    // ...
 
        case '0':   for (int i = 0; i < n; i++)
                    {
                    w = objects[i].get_filling();
                    Marshroute::count_number_of_free_seats(w); // Это же статический метод
                    cout << Marshroute::get_number_of_left_seats();
                    }
                    _getch(); break;
3) в деструкторе достаточно
C++
1
2
3
4
    ~Marshroute()
    {
        delete [] filling;
    }
, ты ж не выделял память в цикле, так почему пытаешься в цикле освобождать?

P.S. И обрати внимание наконец на предупреждение компилятора относительно того, что set_number_of_left_seats() ничего не возвращает...
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 13:45  [ТС]     Статическая переменная возвращает непонятные шестизначные числа #3
Да! все исправил, objects[0] там со времен отладки остался было...понравилось объяснение о неправильном деструкторе, спасибо, но тем не менее программа все также не работает корректно). Вместо того чтобы отнимать от 12 заполнение мест равное числу суммы 1 и 0 (предполагается именно такое заполнение) для всех объектов, программа выдает нехорошие числа в ответ! Так что же не так? Алгоритм правильный же.
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
23238 / 15229 / 4426
Регистрация: 22.10.2011
Сообщений: 27,078
Записей в блоге: 4
11.04.2014, 13:55     Статическая переменная возвращает непонятные шестизначные числа #4
Все нормально работает:

Bash
1
2
3
4
5
6
7
8
9
Vvedite chislo marshroutov: 1
 
Vvedite nazvanie nachalnogo punkta:             start
Vvedite nazvanie konechnogo punkta:             finish
Vvedite nomer marshrouta:                       22
Vvedite zapolnenie mest s 0-ogo elementa:       filling[0] = 1
Vvedite zapolnenie mest s 0-ogo elementa:       filling[1] = 1
Vvedite zapolnenie mest s 0-ogo elementa:       filling[2] = 0
Vvedite zapolnenie mest s 0-ogo elementa:       filling[3] = 1
выводит 9 оставшихся свободных мест
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 14:22  [ТС]     Статическая переменная возвращает непонятные шестизначные числа #5
да нет же.... не работает! (visual studio 2012) . ввел также как Вы, выдало 99..

Добавлено через 6 минут
вы на чем компилировали?

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
        case '0':   for (int i = 0; i < n; i++)
                    {
                    w = objects[i].get_filling();
                    Marshroute::count_number_of_free_seats(w);
                                        //может стоит добавить "delete[] w;"  здесь?
                    }
                    cout << Marshroute::get_number_of_left_seats() << " ";
                    _getch(); break;
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
23238 / 15229 / 4426
Регистрация: 22.10.2011
Сообщений: 27,078
Записей в блоге: 4
11.04.2014, 14:46     Статическая переменная возвращает непонятные шестизначные числа #6
У меня gcc, я MSVC не держу
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 18:15  [ТС]     Статическая переменная возвращает непонятные шестизначные числа #7
а не подозреваете в чем дело хотя бы?

Добавлено через 1 минуту
есть ли gcc под виндовс?

Добавлено через 8 минут
нужно ли писать delete[] w; ведь она перезаписывается для каждого объекта?
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
23238 / 15229 / 4426
Регистрация: 22.10.2011
Сообщений: 27,078
Записей в блоге: 4
11.04.2014, 18:57     Статическая переменная возвращает непонятные шестизначные числа #8
Цитата Сообщение от lion_wine Посмотреть сообщение
а не подозреваете в чем дело хотя бы?
Нет.

Цитата Сообщение от lion_wine Посмотреть сообщение
нужно ли писать delete[] w;
Нет. Под нее не выделяется память, я же написал тебе во втором посте, что строку
C++
1
w = new int[q];
надо убрать. Ты просто получаешь указатель на данные, и с ними потом работаешь. Память под w не выделяется.

Цитата Сообщение от lion_wine Посмотреть сообщение
есть ли gcc под виндовс?
Есть. Проще всего - взять вместе со средой: Code::Blocks (тебе нужен один из пакетов с mingw-setup)
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 19:18  [ТС]     Статическая переменная возвращает непонятные шестизначные числа #9
спасибо!!!
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
11.04.2014, 19:42     Статическая переменная возвращает непонятные шестизначные числа #10
lion_wine, у меня Visual Studio 2012 Express и все работает. Смотри, может ты не все правки UI применил?
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 19:45  [ТС]     Статическая переменная возвращает непонятные шестизначные числа #11
запустил после обработки "gnu gcc compiler" тоже самое...не работает как надо!!!

Добавлено через 29 секунд
скиньте код пожалуйста весь

Добавлено через 14 секунд
в code::blocks
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
23238 / 15229 / 4426
Регистрация: 22.10.2011
Сообщений: 27,078
Записей в блоге: 4
11.04.2014, 19:46     Статическая переменная возвращает непонятные шестизначные числа #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <conio.h>
using namespace std;
 
//________________________________________________________________class________________________________________________________________________
class Marshroute
{
    char name_nach_punkta[30];
    char name_kon_punkta[30];
    int nomer_marshrouta;
    int *filling;              //указатель на 0-ой елемент
    static int number_of_left_seats;
    static int number_of_seats;
public:
    Marshroute()
    {
        cout << "\nVvedite nazvanie nachalnogo punkta:\t\t";
        cin >> name_nach_punkta;
        cout << "Vvedite nazvanie konechnogo punkta:\t\t";
        cin >> name_kon_punkta;
        cout << "Vvedite nomer marshrouta:\t\t\t";
        cin >> nomer_marshrouta;
 
        filling = new int[number_of_seats];
        for (int i = 0; i < number_of_seats; i++)
        {
            cout << "Vvedite zapolnenie mest s 0-ogo elementa:\t";
            cout << "filling" << "[" << i << "] = ";
            cin >> filling[i];
        }
    }
    ~Marshroute()
    {
        for (int i = 0; i < number_of_seats; i++)
        {
            delete[] filling;
        }
    }
    Marshroute(bool for_loop) {}
 
    int get_nomer_marshrouta()
    {
        return nomer_marshrouta;
    }
    int* get_filling()
    {
        return filling;
    }
    void show()
    {
        cout << "\t" << name_nach_punkta << "                       \t" << name_kon_punkta << "                      \t" << nomer_marshrouta << "\n";
    }
 
    static void count_number_of_free_seats(int e[])
    {
        int temp_counter = 0;
        for (int i = 0; i < number_of_seats; i++)
        {
            temp_counter = temp_counter + e[i];
        }
        number_of_left_seats = number_of_left_seats - temp_counter;
    }
 
    static int set_number_of_left_seats()
    {
        cout << "\nVvedite chislo svobodnix mest vsego:";
        cin >> number_of_left_seats;
    }
    static int get_number_of_left_seats()
    {
        return number_of_left_seats;
    }
    static int get_number_of_seats()
    {
        return number_of_seats;
    }
 
};
//______________________________________________________________functions______________________________________________________________________
 
 
void sortirovka(Marshroute objects[], int n, bool for_loop)
{
    int i,k;
    bool t;
    Marshroute *temp = new Marshroute(for_loop);
    cout << "\n\n================================================================================";
    cout << "Nazvanie nachalnogo punkta | Nazvanie konechnogo punkta  |  Nomer marshrouta    ";
    cout << "================================================================================";
    //сортировка пузырьком
    do
    {
        t = true;
        for (k = 0; k <n - 1; k++)
        {
            if (objects[k].get_nomer_marshrouta()>objects[k+1].get_nomer_marshrouta())
            {
                *temp = objects[k+1];
                objects[k+1] = objects[k];
                objects[k] = *temp;
                t = false;
            }
        }
    }
    while (!t);
 
    //вывод на экран
    for (i = 0; i<n; i++)
        objects[i].show();
    cout << "================================================================================\n";
}
void poisk_nomera_marshrouta(Marshroute objects[], int n)
{
    int i, k;
    cout << "\n\nVvedite nomer marshrouta: ";
    cin >> k;
    cout << "\n================================================================================";
    cout << "Nazvanie nachalnogo punkta | Nazvanie konechnogo punkta  |  Nomer marshrouta    ";
    cout << "================================================================================";
    for (i = 0; i<n; i++)
        if (k == objects[i].get_nomer_marshrouta())
            objects[i].show();
    cout << "================================================================================\n";
}
void prnmn()
{
    cout << "      MENU";
    cout << "\n\n0   - Vivesti chislo ostavshixsya svobodnix mest";
    cout << "\n1   - Vivesti na ekran";
    cout << "\n2   - Sortirovka";
    cout << "\n3   - Poisk po marshrouty";
    cout << "\nESC - Exit";
}
 
int Marshroute::number_of_left_seats = 12;
int Marshroute::number_of_seats = 4;
//_________________________________________________________________main________________________________________________________________________
int main()
{
    char key = '0';
    bool for_loop = false;
    Marshroute *objects;
    int n;
    cout << "Vvedite chislo marshroutov: ";
    cin >> n;
    objects = new Marshroute[n];
    int q;
    q = objects[0].get_number_of_seats();
    int *w;
    //w = new int[q];
 
 
    while (key != 27)
    {
        system("cls");
        prnmn();
        key = _getch();
 
        switch (key)
        {
        case '0':
            for (int i = 0; i < n; i++)
            {
                w = objects[i].get_filling();
                Marshroute::count_number_of_free_seats(w);
                cout << Marshroute::get_number_of_left_seats();
            }
            _getch();
            break;
        case '1':
            cout << "\n\n================================================================================";
            cout << "Nazvanie nachalnogo punkta | Nazvanie konechnogo punkta  |  Nomer marshrouta    ";
            cout << "================================================================================";
            for (int i = 0; i<n; i++)
            {
                objects[i].show();
            };
            cout << "================================================================================\n";
            _getch();
            break;
        case '2':
            sortirovka(objects, n, for_loop);
            _getch();
            break;
        case '3':
            poisk_nomera_marshrouta(objects, n);
            _getch();
            break;
        }
    }
    delete[] objects;
    _getch();
}
(Warning-и не убирал)
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 19:51  [ТС]     Статическая переменная возвращает непонятные шестизначные числа #13
что отображается:
Миниатюры
Статическая переменная возвращает непонятные шестизначные числа   Статическая переменная возвращает непонятные шестизначные числа  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2014, 20:06     Статическая переменная возвращает непонятные шестизначные числа
Еще ссылки по теме:

Вывести на экран все шестизначные числа, которые являются счастливыми билетами - C++
Вывести на экран все шестизначные числа, которые являются счастливыми билетами. Написать вспомогательную функцию вычисления суммы цифр....

создать программу которая будет генерировать пяти и шестизначные числа на экран - C++
Помогите создать программу которая будет генерировать пяти и шестизначные числа на экран. Пример: Нажимаю &quot;Генерировать&quot; и выдает: ...

Вывести все шестизначные простые числа с суммой цифр, равной заданному числу - C++
Дано число K. Вывести все шестизначные простые числа с суммой цифр, равной K. Ограничение по времени - 0,2 сек.

Создайте программу, которая будет генерировать и отображать пяти- и шестизначные числа на экран - C++
Помогите создать программу которая будет генерировать пяти и шестизначные числа на экран. Пример: Нажимаю &quot;Генерировать&quot; и выдает: ...


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

Или воспользуйтесь поиском по форуму:
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 20:06  [ТС]     Статическая переменная возвращает непонятные шестизначные числа #14
О_о Что за магия??? Теперь все работает. И ОГРОМНЕЙШЕЕ СПАСИБО, ибо я не знаю сколько бы я нервов еще потратил на это.
Yandex
Объявления
11.04.2014, 20:06     Статическая переменная возвращает непонятные шестизначные числа
Ответ Создать тему
Опции темы

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