Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

10.04.2014, 15:03. Просмотров 490. Ответов 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 минуту
хелп плиз!!!
0
Лучшие ответы (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++
Локальные статические переменные сохраняют свое значение между вызовами функций. Если сделать тоже самое с методом класса, то этот статик...

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

13
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24013 / 15994 / 4840
Регистрация: 22.10.2011
Сообщений: 28,305
Записей в блоге: 5
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() ничего не возвращает...
1
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 13:45  [ТС] #3
Да! все исправил, objects[0] там со времен отладки остался было...понравилось объяснение о неправильном деструкторе, спасибо, но тем не менее программа все также не работает корректно). Вместо того чтобы отнимать от 12 заполнение мест равное числу суммы 1 и 0 (предполагается именно такое заполнение) для всех объектов, программа выдает нехорошие числа в ответ! Так что же не так? Алгоритм правильный же.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24013 / 15994 / 4840
Регистрация: 22.10.2011
Сообщений: 28,305
Записей в блоге: 5
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 оставшихся свободных мест
0
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;
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24013 / 15994 / 4840
Регистрация: 22.10.2011
Сообщений: 28,305
Записей в блоге: 5
11.04.2014, 14:46 #6
У меня gcc, я MSVC не держу
0
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 18:15  [ТС] #7
а не подозреваете в чем дело хотя бы?

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

Добавлено через 8 минут
нужно ли писать delete[] w; ведь она перезаписывается для каждого объекта?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24013 / 15994 / 4840
Регистрация: 22.10.2011
Сообщений: 28,305
Записей в блоге: 5
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)
1
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 19:18  [ТС] #9
спасибо!!!
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
11.04.2014, 19:42 #10
lion_wine, у меня Visual Studio 2012 Express и все работает. Смотри, может ты не все правки UI применил?
0
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 19:45  [ТС] #11
запустил после обработки "gnu gcc compiler" тоже самое...не работает как надо!!!

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

Добавлено через 14 секунд
в code::blocks
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24013 / 15994 / 4840
Регистрация: 22.10.2011
Сообщений: 28,305
Записей в блоге: 5
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-и не убирал)
1
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 19:51  [ТС] #13
что отображается:
0
Миниатюры
Статическая переменная возвращает непонятные шестизначные числа   Статическая переменная возвращает непонятные шестизначные числа  
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
11.04.2014, 20:06  [ТС] #14
О_о Что за магия??? Теперь все работает. И ОГРОМНЕЙШЕЕ СПАСИБО, ибо я не знаю сколько бы я нервов еще потратил на это.
0
11.04.2014, 20:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2014, 20:06
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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