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

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

Восстановить пароль Регистрация
 
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
10.04.2014, 15:03     Статическая переменная возвращает непонятные шестизначные числа #1
Здравствуйте, обитатели этого форума. Кому не лень помогите разобраться со статической переменной 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++
C++ Найти все шестизначные счастливые числа (исправить код)
C++ Вывести на экран все шестизначные числа, сумма цифр которых равна N и сообщить количество таких чисел
создать программу которая будет генерировать пяти и шестизначные числа на экран C++
Создайте программу, которая будет генерировать и отображать пяти- и шестизначные числа на экран C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volvo
Супер-модератор
 Аватар для volvo
22080 / 14385 / 4044
Регистрация: 22.10.2011
Сообщений: 25,454
Записей в блоге: 2
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
Супер-модератор
 Аватар для volvo
22080 / 14385 / 4044
Регистрация: 22.10.2011
Сообщений: 25,454
Записей в блоге: 2
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
Супер-модератор
 Аватар для volvo
22080 / 14385 / 4044
Регистрация: 22.10.2011
Сообщений: 25,454
Записей в блоге: 2
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
Супер-модератор
 Аватар для volvo
22080 / 14385 / 4044
Регистрация: 22.10.2011
Сообщений: 25,454
Записей в блоге: 2
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
6785 / 3996 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
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
Супер-модератор
 Аватар для volvo
22080 / 14385 / 4044
Регистрация: 22.10.2011
Сообщений: 25,454
Записей в блоге: 2
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++
C++ Статическая переменная в методе класса
Вывести все шестизначные простые числа с суммой цифр, равной заданному числу C++
Написать программу, которая находит все шестизначные простые числа с суммой цифр равной N C++

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

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

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