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

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

Войти
Регистрация
Восстановить пароль
 
Алена5
2 / 2 / 0
Регистрация: 17.05.2010
Сообщений: 68
#1

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

31.08.2010, 18:33. Просмотров 783. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2010, 18:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в коде при использовании класов (C++):

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

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

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

Ошибка при использовании reverse_iterator - C++
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(),...

Ошибка при использовании override - C++
Здравствуйте, форумчане, столкнулся с проблемой при использовании override: есть абстрактный класс с чистой виртуальной функцией move,...

Ошибка при использовании вектора - C++
Пытаюсь проанализировать текстовый файл и посчитать кол-во каждого символа. Текст на английском. Вот код: class Raspredelenie{ ...

13
Rockedit
Автор FAQ
Автор FAQ
1760 / 566 / 9
Регистрация: 22.12.2009
Сообщений: 1,544
31.08.2010, 18:43 #2
А сколько показывает? судя по коду должно вывестить 40.
0
Алена5
2 / 2 / 0
Регистрация: 17.05.2010
Сообщений: 68
31.08.2010, 18:48  [ТС] #3
Цитата Сообщение от Rockedit Посмотреть сообщение
А сколько показывает? судя по коду должно вывестить 40.
А показывает 15
Оно переменную money обнуляэт!
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
31.08.2010, 18:52 #4
Было бы странно если бы не обнуляло
0
Rockedit
Автор FAQ
Автор FAQ
1760 / 566 / 9
Регистрация: 22.12.2009
Сообщений: 1,544
31.08.2010, 18:53 #5
Точно, 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
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
31.08.2010, 18:56 #6
Алена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
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
31.08.2010, 18:58 #7
fasked, Константными геттеры забыл сделать.
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
31.08.2010, 18:59 #8
Цитата Сообщение от Lavroff Посмотреть сообщение
Константными геттеры забыл сделать.
Я ничего не менял в коде кроме стиля форматирования. Если бы я начал, что-то менять здесь, то первое мое действие было бы "стереть все".
0
Алена5
2 / 2 / 0
Регистрация: 17.05.2010
Сообщений: 68
31.08.2010, 19:15  [ТС] #9
Цитата Сообщение от fasked Посмотреть сообщение
Алена5
Следите за тем, что пишите. Сколько раз Вам повторять, что код чаще читается, чем пишется.
Опишите, пожалуйста, какое поведение вы ожидаете от класса Hello и какое от класса Pack. Меня честно говоря удивляет наличие переменных и методов с именем money в классе с именем Hello.
На обсуждение я выставила только часть программы! Вся она занимаэт около 15 листов текста и всю ее просматривать не надо. Я показала только маленький не работающий кусочек, а в самой програме клас Hello написан не случайно и имеет соответсвующие ему методы.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
31.08.2010, 19:23 #10
Алена5, Сколько-сколько? С каких пор программы измеряются в "листах"???
Ну сделайте хотя бы геттеры константными. Ну пожалуйста.
Например вместо:

C++
1
int getMoney()
C++
1
int getMoney() const
И так все методы которые тупо возвращают значение. + Не пишите void main(). Прошу вас пишите int main() и в main по желанию return 0;
0
Rockedit
Автор FAQ
Автор FAQ
1760 / 566 / 9
Регистрация: 22.12.2009
Сообщений: 1,544
31.08.2010, 19:28 #11
Извините, что не по теме, но зачем сразу так критиковать? Вопрос был не раскритикуйте мой листинг, а подскажите почему сумма 15, а не 40. Вместо критики лучше предложите конструктивные предложения.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
31.08.2010, 19:30 #12
Rockedit, Как минимум листинг должен быть хотя бы чуть-чуть корректным... В данном случае я не предлагаю переделывать все (хотя это оптимально), а предлагаю только сделать методы константными и следовать стандарту с возвращаемым значение функции main.

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

А так же если я что-то понимаю, то лучше все-таки не использовать магические числа, а использовать константы для размера массива.
И... я бы заполнял все элементы массива нулями. То есть в цикле.
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.08.2010, 21:29 #13
а что инкапсуляцию уже отменили?)
Значения полей объекта 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
0 / 0 / 0
Регистрация: 30.08.2010
Сообщений: 1
02.09.2010, 16:29 #14
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]);

Подскажите, пожалуйста, как правильно это записать чтобы вывод был корректным.
0
02.09.2010, 16:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2010, 16:29
Привет! Вот еще темы с ответами:

Ошибка при использовании new[] / delete[] - C++
Здравствуйте. Пишу учебную программу, моделирующую движение лифта (если кто учебник Дейтелов читал, тот поймет :) ). Для начала приведу...

Ошибка при использовании SendKeys - C++
При нажатии на button5 окно программы должно свернуться и в окне, которое было позади него (блокнот), написать &quot;Hello world&quot;: #pragma...

Ошибка при использовании delete - C++
И снова здравствуйте! Пишу раз третий.Я уже готов убицца ап сцену изза этого delete.Я не понимаю что не так делаю: class CMenu { ...

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


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

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

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