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

Почему при компилировании программы со вторым экземпляром класса изменяются значения первого? - C++

Восстановить пароль Регистрация
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
02.04.2014, 16:39     Почему при компилировании программы со вторым экземпляром класса изменяются значения первого? #1
Здравствуйте.
Вопрос: почему при компилировании программы со вторым экземпляром класса изменяются значения первого?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace SALES {
        const int QUARTERS = 4;
        class Sales {
        private:
                double sales[QUARTERS];
                double average;
                double max;
                double min;
        public:
                Sales() {
                        average = max = min = 0;
                }
                Sales(const double*, const int);
                ~Sales() {
                }
                void show() const;
        };
}

Кликните здесь для просмотра всего текста
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
#include "sales.hxx"
#include <iostream>
 
namespace SALES {
    Sales::Sales(const double ar[], const int n) {
        int i = 0;
        for (; i < n; i++)
            sales[i] = ar[i];
        i = 0;
        double curmax = .0, absmax = .0, curmin = .0, absmin = .0;
        while (sales[i+1]) {
            if (sales[i] > sales[i+1]) {
                curmax = sales[i];
                if (curmax > absmax)
                    absmax = sales[i];
            }
            i++;
        }
        i = 0;
        while (sales[i+1]) {
            if (sales[i] < sales[i+1]) {
                curmin = sales[i];
                if (curmin < absmin || absmin == 0)
                    absmin = sales[i];
            }
            i++;
        }
        i = 0;
        double val = .0;
        while (sales[i]) {
            val += sales[i];
            i++;
        }
        val = val / i;
        average = val;
        max = absmax;
        min = absmin;
    }
 
    void Sales::show() const {
        std::cout << "avg: " << average << std::endl;
        std::cout << "max: " << max << std::endl;
        std::cout << "min: " << min << std::endl;
    }
}

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "sales.hxx"
 
namespace {
    const int SIZE = 4;
    double array[SIZE] = {2223.7, 2893.89, 2090.1, 2149.7};
}
 
int main()
{
    SALES::Sales X(array, SIZE);
    X.show();
    //SALES::Sales Y;
    //Y.show();
    return 0;
}


Речь идет об Y.

Добавлено через 2 минуты
С закомментированными последними строчками результат:
avg: 1559.56
max: 2893.89
min: 2090.1


Без комментирования:
avg: 668.385
max: 2893.89
min: 9.88131e-324
avg: 0
max: 0
min: 0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2014, 16:39     Почему при компилировании программы со вторым экземпляром класса изменяются значения первого?
Посмотрите здесь:

C++ ошибка при компилировании
проблема - при выводе переменных, их значения изменяются C++
Ошибка при компилировании C++
При компилировании компилятор вылетает,нет ли ошибок, или почему он так? C++
C++ Разница между объектом и экземпляром класса
C++ Почему в setnamedisc нужно использовать char * для установки значения, а при возвращении значения тип метода должен быть char* ?
C++ При обращении к структуре из класса возникает исключение:нарушение прав доступа при записи. Почему?
C++ Почему после конструктора первого класса стоит двоеточие и имя переменной, а не инициализация?
Ошибка при компилировании C++
C++ Не изменяются значения в массиве
Пользовательский класс Library: почему не выводятся значения полей класса? C++
Неожиданное поведение программы: почему на консоль не выводятся крайние значения заданного диапазона? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
02.04.2014, 16:56     Почему при компилировании программы со вторым экземпляром класса изменяются значения первого? #2
Если в циклах поправить:
C++
1
while(sales[i])
на
C++
1
while(i!=n)
а также,
i=1 и сранивать элементы sales[i] < > sales[i-1] вместо sales[i] < > sales[i+1] (чтоб не выходить за рамки массива), то должно получится. По крайней мере у меня сработало.
Кроме того неужели вас не насторожило, что среднее значение не находится в пределах минимума и максимума?
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
03.04.2014, 22:56  [ТС]     Почему при компилировании программы со вторым экземпляром класса изменяются значения первого? #3
Wlk, спасибо, помогло!
Интересно, а почему нельзя было использовать в условиях циклов sales[i]?

Не по теме:

p.s. конечно, насторожило.

Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
03.04.2014, 23:51     Почему при компилировании программы со вторым экземпляром класса изменяются значения первого? #4
Потому что видимо вы вышли за рамки заполненного части вашего массива, или вообще за его рамки (н+1), где хранилась undefined data. У меня например результат абсолютно не похож на ваш.
Yandex
Объявления
03.04.2014, 23:51     Почему при компилировании программы со вторым экземпляром класса изменяются значения первого?
Ответ Создать тему
Опции темы

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