Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 17.05.2010
Сообщений: 68

Ошибка в коде при использовании класов

31.08.2010, 18:33. Показов 1275. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include <iostream>
#include <fstream>
#include <time.h>
#include <stdio.h>
using namespace std;
class Hello
{
    int money, money_prize;;
public:
    Hello()
    {
 
        money=0;
        money_prize=0;
    }
    void Initial( int m)
    {
        money=m;
    }
    int getMoney()
    {
        return money;
    }
    int getMoney_prize()
    {
        return money_prize;
    }
 
    void Hello_user()
    {
        
            money=25;
            cout<<"\n\n\t\t\t\tДобро пожаловать в игру. \n\tЗа регистрацию в системе на ваш баланс была положена сумма в 25$\n";
        
        
    }
    void Money(int money_prize)
    {
 
        money=money+money_prize;
        cout<<"\n\t\t\t\tНа вашем счету "<<money<<"$\n";
        Initial(money);
    }
 
};
class Pack
{
 
    int money_prise[8];
public:
    Pack()
    {
        money_prise[1]=0;
    }
        void Get_a_prize()
    {
        
                money_prise[1]=15;
                int prise=money_prise[1];
                Hello money;
                money.Money(prise);
                        
    }
 
 
    };
 
void main()
{
    setlocale(LC_ALL,"rus");
    Hello hy;
    hy.Hello_user();
    Pack p;
    p.Get_a_prize();
    
 
}
.
Подскажите, пожалуйста, почему программка показывает неправильную сумму и как єто исправить.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2010, 18:33
Ответы с готовыми решениями:

Ошибка при использовании vector (в конце, после вывода результатов выскакивает ошибка, но сам результат коректен)
Суть в следующем, мы считываем введеные значения и выводим этот массив Проблема такова что массив выводиться, корректно, но в конце...

Ошибка при использовании %
(условие задачи, код и ошибки при коомпиляции на скрине) Здравствуйте, задача простая, как и ее решение, на фортране бы уже пять раз...

Ошибка при использовании gets()
Не могу понять, почему при второй итерации цикла программа выдает ошибку и закрывается при запросе фамилии. #include &quot;stdafx.h&quot;...

13
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
31.08.2010, 18:43
А сколько показывает? судя по коду должно вывестить 40.
0
2 / 2 / 0
Регистрация: 17.05.2010
Сообщений: 68
31.08.2010, 18:48  [ТС]
Цитата Сообщение от Rockedit Посмотреть сообщение
А сколько показывает? судя по коду должно вывестить 40.
А показывает 15
Оно переменную money обнуляэт!
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.08.2010, 18:52
Было бы странно если бы не обнуляло
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
31.08.2010, 18:53
Точно, 15...конечно обнуляет, Вы же создаете новый экземпляр класса, а в конструкторе идет обнуление.
C++
1
2
3
4
5
  money_prise[1]=15;
                        int prise=money_prise[1];
                                Hello money;
                                money.Hello_user();
                                money.Money(prise);
Это убрать
C++
1
2
        Hello hy;
        hy.Hello_user();
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
31.08.2010, 18:56
Алена5, Если бы Ваш код выглядел хотя бы вот так, было бы куда лучше:
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
#include <iostream>
#include <fstream>
#include <time.h>
#include <stdio.h>
 
using namespace std;
 
class Hello
{
public:
    Hello()
    {
        money=0;
        money_prize=0;
    }
    
    void Initial(int m)
    {
        money = m;
    }
    
    int getMoney()
    {
        return money;
    }
    
    int getMoney_prize()
    {
        return money_prize;
    }
 
    void Hello_user()
    {    
        // Старайтесь избегать длинных строк и 
        // разделять операторы от операндов пробелами. 
        // Иначе получается беспорядочная каша недоступная для понимания.
        
        money = 25;
        cout << "\n\n\t\t\t\tДобро пожаловать в игру.\n"
                "\tЗа регистрацию в системе на ваш баланс была положена сумма в 25$\n";         
    }
    
    void Money(int money_prize)
    {
        money = money + money_prize;
        cout << "\n\t\t\t\tНа вашем счету " << money << "$" << std::endl;
        Initial(money);
    }
 
private:
    // В Си++ принято приватные данные располагать внизу класса
    // это хорошая традиция, делающая Ваш код более удобным для чтения.
    // Еще здесь было два знака ;
    
    int money;
    int money_prize;         
};
 
class Pack
{
public:
    Pack()
    {
        money_prise[1]=0;
    }
    
    void Get_a_prize()
    {
        money_prise[1]=15;
        int prise=money_prise[1];
        Hello money;
        money.Money(prise);
    }
 
private:
    int money_prise[8];
};
 
void main()
{
    setlocale(LC_ALL,"rus");
    
    Hello hy;
    hy.Hello_user();
    
    Pack p;
    p.Get_a_prize();
}
Следите за тем, что пишите. Сколько раз Вам повторять, что код чаще читается, чем пишется.
Опишите, пожалуйста, какое поведение вы ожидаете от класса Hello и какое от класса Pack. Меня честно говоря удивляет наличие переменных и методов с именем money в классе с именем Hello.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.08.2010, 18:58
fasked, Константными геттеры забыл сделать.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
31.08.2010, 18:59
Цитата Сообщение от Lavroff Посмотреть сообщение
Константными геттеры забыл сделать.
Я ничего не менял в коде кроме стиля форматирования. Если бы я начал, что-то менять здесь, то первое мое действие было бы "стереть все".
0
2 / 2 / 0
Регистрация: 17.05.2010
Сообщений: 68
31.08.2010, 19:15  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
Алена5
Следите за тем, что пишите. Сколько раз Вам повторять, что код чаще читается, чем пишется.
Опишите, пожалуйста, какое поведение вы ожидаете от класса Hello и какое от класса Pack. Меня честно говоря удивляет наличие переменных и методов с именем money в классе с именем Hello.
На обсуждение я выставила только часть программы! Вся она занимаэт около 15 листов текста и всю ее просматривать не надо. Я показала только маленький не работающий кусочек, а в самой програме клас Hello написан не случайно и имеет соответсвующие ему методы.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.08.2010, 19:23
Алена5, Сколько-сколько? С каких пор программы измеряются в "листах"???
Ну сделайте хотя бы геттеры константными. Ну пожалуйста.
Например вместо:

C++
1
int getMoney()
C++
1
int getMoney() const
И так все методы которые тупо возвращают значение. + Не пишите void main(). Прошу вас пишите int main() и в main по желанию return 0;
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
31.08.2010, 19:28
Извините, что не по теме, но зачем сразу так критиковать? Вопрос был не раскритикуйте мой листинг, а подскажите почему сумма 15, а не 40. Вместо критики лучше предложите конструктивные предложения.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.08.2010, 19:30
Rockedit, Как минимум листинг должен быть хотя бы чуть-чуть корректным... В данном случае я не предлагаю переделывать все (хотя это оптимально), а предлагаю только сделать методы константными и следовать стандарту с возвращаемым значение функции main.

Кстати. А в pack вы хотите установить первый элемент или же второй? Если первый тогда
C++
1
 money_prize[0];
все же. Если второй тогда верно.

А так же если я что-то понимаю, то лучше все-таки не использовать магические числа, а использовать константы для размера массива.
И... я бы заполнял все элементы массива нулями. То есть в цикле.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
31.08.2010, 21:29
а что инкапсуляцию уже отменили?)
Значения полей объекта hy не имеют никаго отношения к значениям полей объекта money, как один из вариантов - передавать параметром объект hy, методу Get_a_prize класса Pack;
C++
1
2
3
4
5
6
void Pack::Get_a_prize(Hello& hy)
{
       int prise = money_prise[1] = 15;
       hy.Hello_user();
       hy.Money(prise);
}
P.S. форматирование кода ужасное
0
Студент 2010
02.09.2010, 16:29
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
#include <iostream>
#include <fstream>
#include <time.h>
#include <stdio.h>
using namespace std;
class Money
{
    int money, money_prize;;
public:
    Money()
    {
        money=0;
        money_prize=0;
    }
    void Initial( int m)
    {
        money=m;
    }
    int getMoney()
    {
        return money;
    }
    int getMoney_prize()
    {
        return money_prize;
    }
 
    void My_first_money()
    {
        money=25;
        cout<<"\n\n\t\t\t\tДобро пожаловать в игру. \n\tЗа регистрацию в системе на ваш баланс была положена сумма в 25$\n";
    }
    void Money_in_game(int money,int money_prize)
    {
 
        money=money+money_prize;
        cout<<"\n\t\t\t\tНа вашем счету "<<money<<"$\n";
    }
};
class Hello
{
    FILE *file;
    char* file_name;
public:
    int *money_case;
    void Hello_user()
    {
        //----------приветствие------------
        file_name="C:\\Pocer\\picture.txt";
        int NotUsed=system("color 17");
        char load_string[50]=" " ;
        file = fopen( file_name, "r" );
        if( file != 0 )
        {
            while(!feof(file))
            {
                fgets( load_string, 50 , file ); 
                cout  << load_string;
            }
        }
        else
        {
            cout << "File not found" << endl;
        }
        cout<<"\n\n\n";
        fclose(file);
        //----------считывание данных о пользователе-------
        ifstream file2("C:\\Pocer\\player.txt");
        char name[15];
        int money;
        char name_controll[15];
        int chek=0;
        int i=0;
        cout<<"\t \t\t      Введите имя пользователя\n\n\t\t\t\t\t";
        cin>>name_controll;
        system("cls");
        while(true)
        {
            file2>>name>>money;
            i++;
            if (!file2.eof())
            {
                if (!strcmp(name_controll,name))
                {
                    chek++;
                    break;
                }
            }
 
            else
                break;
        }
        fclose(file);
        if(chek==0)
        {
            ofstream save("C:\\Pocer\\player.txt",ios::app);
            money=25;
            save<<name_controll<<" "<<money<<"\n";
            save.close();
            Money m;
            m.My_first_money();
        }
        else
        {
            cout<<"\n\n\t\t\t\tЗдраствуйте "<<name_controll<<"\n";
            Money m;
            money_case=&money;
            m.Money_in_game(*money_case,0);
 
        }
 
    }
};
 
 
class Prize
{
 
    int money_prise[8];
public:
    void Get_a_prize()
    {
 
        money_prise[1]=10;
        for (int i=7; i>=0;i--)
        {
            
                cout<<money_prise[1]<<"\n";
                Hello m;
                int  l=*m.money_case;
                Money my;
                my.Money_in_game(l,money_prise[i]);
        }
 
 
    }
};
 
void main()
{
    setlocale(LC_ALL,"rus");
    char chois;
    Hello hy;
    hy.Hello_user();
    Prize p;
    p.Get_a_prize();
}
Результатом программы должно быть 110, а выводит 10
Подозреваю что проблема в этой части кода
Код:


my.Money_in_game(l,money_prise[i]);

Подскажите, пожалуйста, как правильно это записать чтобы вывод был корректным.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2010, 16:29
Помогаю со студенческими работами здесь

Ошибка при использовании векторов
Дано алгебраическое выражение y=tg(x)+sin(x)*sin(x).Программа принимает на вход 3 значения: нижнюю границу, верхнюю границу и шаг....

Ошибка при использовании keyhash
Добрый день, имеется такой код: template &lt;typename K, size_t tableSize&gt; struct KeyHash { unsigned long operator()(const K...

Ошибка при использовании write()
Ребят есть код, запись информации в файл. #include &lt;stdio.h&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;locale.h&gt;...

Ошибка при использовании reverse_iterator
std::array&lt;int, 7&gt; m = { 1, 2, 3, 4, 5, 6, 7 }; vector&lt;int&gt; v(m.begin(), m.end()); vector&lt;int&gt;::iterator pos = find(v.begin(),...

Ошибка при использовании strcpy
Здравствуйте, возникла такая проблема Объявляю массив char * char *names = {&quot;asdfg&quot;, &quot;hjklqw&quot;, &quot;wertyui&quot;,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru