Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
90 / 17 / 6
Регистрация: 21.09.2016
Сообщений: 176
1

Трабл по типу родитель - ребенок

28.10.2016, 03:50. Показов 596. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер! Народ, в с++ недавно... пишу программу (пока что только в консоли)...
Не судите строго, но есть проблема и не могу из нее выход найти...
Там код ниже... в таком виде протестируйте пж.
Проблема в следующем: в родительском классе инициализирую вводом переменную pH. А в дочернем классе эта переменная pH выводится как 0.
Укажите пж на ошибку. Да и вообще любую критику по поводу данного кода буду приветствовать. П.С. пока что все данные классов прайват для удобства тестирования.

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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#include <iostream>
#include <cstring>
#include <iomanip>
#include <cmath>
using namespace std;
const double Na = 6.02; const double powNa = pow(10, -27);                                         // Avogadro`s number and its power
const double k = 0.111; const double powk = pow(10, 9);                                            // the coefficient of proportionality
double gestC = 2100;                                                                   // density
double MC = 342.15;                                                                    // molar mass
const double pi = 3.1459;
static int n = 0;
const int SIZE = 100;
const int gestH = 1010;
const int gestA = 1010;
const double MH = 1479.156;
 
class Initial
{
public:
    double VW;  
    double pH;
    double color;       
    double turbidity;   
    double percentH;    
    double percentA;    
    double sizeH;       
    double sizeA;           
    double VH;          double VA;
    double mH;          double mA;
    double numH;        double numA;
public:
    Initial(void);
 
    Initial(double vw, double col, double tur, double perH, double perA, double sh, double sa, double vh, 
        double va, double mh, double ma, double nh, double na, double ph);
 
    virtual void getdata()
    {
        cout << setw(50) << ".....OptimalDose....." << endl;
        cout << "Enter experimantal volume of water (l): "; cin >> VW;
        cout << "\nEnter the color of the experimental sample (mg Pt/l): "; cin >> color;
        cout << "\nEnter the turbidity of the experimental sample (NTU): "; cin >> turbidity;
        cout << "\nEnter water pH: "; cin >> pH;
        char choice;
        cout << "\nThe experimental sample contains humic substance? (y/n) "; cin >> choice;
        {
            if (choice == 'y')
            {
                cout << "\nEnter percentage of humic substance (%): "; cin >> percentH;
            }
            else if (choice == 'n')
            {
                percentH = 0;
            }
        }
        {
            if (percentH == 0)
            {
                percentA = 100;
                cout << "\nEnter diameter of algae particle measured by microscope (mkm): "; cin >> sizeA;
            }
            if (percentH == 100)
            {
                percentA = 0;
            }
            if (percentH != 0 && percentH < 100)
            {
                percentA = 100 - percentH;
                cout << "\nEnter diameter of algae particle measured by microscope (mkm): "; cin >> sizeA;
            }
        }
    }
 
    void getVH()
    {
        sizeH = 3 * MH / 4 / pi / Na / gestH; double temp = sizeH; temp = pow(sizeH, 0.33333) * pow(powNa, 0.33333);
        sizeH = temp;
        if (percentH == 0)
        {
            VH = 0.0;
        }
        else 
        {
            VH = 4 / 3 * pi * sizeH * sizeH * sizeH;
        }
    }
 
    void getVA()
    {
        double temp = sizeA; temp = sizeA / 2000000;
        sizeA = temp;
        if (percentA == 0)
        {
            VA = 0.0;
        }
        if (percentA > 0)
        {
            VA = 4 / 3 * pi * sizeA * sizeA * sizeA;
        }
    }
 
    void masH()
    {
        if (percentH == 0)
        {
            mH = 0.0;
        }
        else
        {
            mH = VH * gestH;
        }
    }
 
    void masA()
    {
        if (percentA == 0)
        {
            mA = 0.0;
        }
        if (percentA > 0)
        {
            mA = VA * gestA;
        }
    }
 
    void numberH()
    {
        if (percentH == 0)
        {
            numH = 0.0;
        }
        else
        {
            numH = percentH * color * VW / mH / 1000;
        }
    }
 
    void numberA()
    {
        if (percentA == 0)
        {
            numA = 0.0;
        }
        if (percentA > 0)
        {
            numA = percentA * color * VW / mA / 1000;
        }
    }
 
};
 
Initial::Initial(void)
{
    VW = 0.0;
    pH = 0.0;
    color = 0.0;
    turbidity = 0.0;
    percentH = 0.0;
    percentA = 0.0;
    sizeH = 0.0;
    sizeA = 0.0;
    VH = 0.0;
    VA = 0.0;
    mH = 0.0;
    mA = 0.0;
    numH = 0.0;
    numA = 0.0;
}
 
Initial::Initial(double vw, double col, double tur, double perH, double perA, double sh, double sa, double vh,
    double va, double mh, double ma, double nh, double na, double ph)
{
    VW = vw;
    pH = ph;
    color = col;
    turbidity = tur;
    percentH = perH;
    percentA = perA;
    sizeH = sh;
    sizeA = sa;
    VH = vh;
    VA = va;
    mH = mh;
    mA = ma;
    numH = nh;
    numA = na;
}
 
class COA : public Initial
{
public:
    int name;
    double zetaC;
public:
    COA() : Initial(), name(0), zetaC(0.0){}
    COA(int nm, double zC, double vw, double col, double tur, double perH, double perA, double sh, double sa, double vh, 
        double va, double mh, double ma, double nh, double na, double ph) : name(nm), zetaC(zC),
        Initial(vw, ph, col, tur, perH, perA, sh, sa, vh, va, mh, ma, nh, na) {}
    void getdata()
    {
        cout << "\nChoose coagulant: " << "\nfor this moment possible to use only one type of reagent (Al2(SO4)3)!\nPress -1- to continue: ";
        cin >> name;
    }
    void setZeta()
    { 
        cout << Initial::pH << endl;
        if (Initial::pH >= 0 && Initial::pH <= 4) 
        { 
            zetaC = 0.04;
        }
        else if (Initial::pH > 4 && Initial::pH <= 5.8) { zetaC = 0.042; }
        else if (Initial::pH > 5.8 && Initial::pH <= 6.2) { zetaC = 0.042 + (Initial::pH + 5.8) * ((0.05 - 0.042) / (6.2 - 5.8)); }
    }
};
 
int main()
{
    Initial b;
    COA a;
    b.getdata();
    a.setZeta();
    
    cout << a.zetaC << endl;
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2016, 03:50
Ответы с готовыми решениями:

Родитель/Ребенок
Добрый вечер такой вопрос! Допустим в базе были записи родители и их дочерние записи. Потом при...

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости
Добрый день,столкнулся с проблемой &quot;Выражение должно относиться к целочисленному типу или типу...

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { int N; double Y = 0;...

Выражение должно относиться к целочисленному типу или типу перечислений без области видимости
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class lVector { int Vector1;...

11
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
28.10.2016, 03:55 2
Удалил.
0
90 / 17 / 6
Регистрация: 21.09.2016
Сообщений: 176
28.10.2016, 03:58  [ТС] 3
В базовом классе инициализирую pH через cin (строка 43). Потом в зависимости от pH в функции (строка 204) интерполирую значение. Но после инициализации в дочерний класс pH передается как 0 (хотя вводил допустим 6).
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
28.10.2016, 03:59 4
Цитата Сообщение от RJM Посмотреть сообщение
в родительском классе инициализирую вводом переменную pH. А в дочернем классе эта переменная pH выводится как 0.
Инициализируешь в конкретном объекте, а не вообще. А объектов у тебя два. В одном инициализируешь (в b), а в другом смотришь (в a).
0
90 / 17 / 6
Регистрация: 21.09.2016
Сообщений: 176
28.10.2016, 04:03  [ТС] 5
В строке 206 я через cout вывожу pH для проверки... и оно нулевое (0). Как это исправить, чтоб выводило значение, которое я вводил при инициализации в базовом классе?

Добавлено через 1 минуту
Или так вообще нельзя?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
28.10.2016, 04:11 6
C++
1
2
3
4
5
6
7
    Initial b;
    COA a;
    cout << b.pH << endl;
    cout << a.pH << endl;
    b.getdata();
    cout << b.pH << endl;
    cout << a.pH << endl;
Добавлено через 2 минуты
Цитата Сообщение от RJM Посмотреть сообщение
Как это исправить, чтоб выводило значение, которое я вводил при инициализации в базовом классе?
Никак, потому что разные объекты. Нужно инициализировать переменную базового класса в объекте производного, а не в другом объекте базового.
0
90 / 17 / 6
Регистрация: 21.09.2016
Сообщений: 176
28.10.2016, 04:14  [ТС] 7
строка 205, функция сетЗета. cout << Initial:H << endl; --- выдает 0, хотя в классе Инитал я ее через cin инициализировал число (например 6). Оно все время выкидывает 0 и из-за этого все расчеты неправильные.
C++
1
2
3
4
5
6
7
8
9
10
void setZeta()
    { 
        cout << Initial::pH << endl;
        if (Initial::pH >= 0 && Initial::pH <= 4) 
        { 
            zetaC = 0.04;
        }
        else if (Initial::pH > 4 && Initial::pH <= 5.8) { zetaC = 0.042; }
        else if (Initial::pH > 5.8 && Initial::pH <= 6.2) { zetaC = 0.042 + (Initial::pH + 5.8) * ((0.05 - 0.042) / (6.2 - 5.8)); }
    }
Добавлено через 51 секунду
ммм... приколый смайл)))))

cout << Initial:: pH << endl;
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
28.10.2016, 04:17 8
Например, в getdata() производного вызывай getdata() базового.

Добавлено через 1 минуту
RJM, читай внимательно, что я пишу, и думай.
Цитата Сообщение от nd2 Посмотреть сообщение
Инициализируешь в конкретном объекте, а не вообще. А объектов у тебя два. В одном инициализируешь (в b), а в другом смотришь (в a).
0
90 / 17 / 6
Регистрация: 21.09.2016
Сообщений: 176
28.10.2016, 04:22  [ТС] 9
Он тогда всю инструкцию всех инициализаций за собой поволочет...

Разве нету такого варианта:
1) в базовом в getdata() я инициализирую pH
2) в производном через Initial:: pH получаю его значение и далее с ним работаю.

может там что-то с конструкторами напорол?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
28.10.2016, 04:24 10
Объект b, в котором ты инициализируешь pH, не имеет никакого отношения к объекту a, в котором ты проверяешь значение pH. pH в b не имеет никакого отношения к pH в a.

Добавлено через 1 минуту
Представляешь, как выглядит объект производного класса?
1
90 / 17 / 6
Регистрация: 21.09.2016
Сообщений: 176
28.10.2016, 04:26  [ТС] 11
Все понял, так нельзя... лови лайк!
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
28.10.2016, 04:46 12
Цитата Сообщение от RJM Посмотреть сообщение
Все понял, так нельзя...
Можно но не так.
Цитата Сообщение от nd2 Посмотреть сообщение
Например, в getdata() производного вызывай getdata() базового.
Тогда получишь то, что хочешь:
C++
1
2
3
4
5
6
7
8
int main()
{   
    COA a;
    a.getdata(); // тут будет инициализирована и pH, при вызове Initial::getdata() базового
    a.setZeta();
    
    cout << a.zetaC << endl;
}
0
28.10.2016, 04:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2016, 04:46
Помогаю со студенческими работами здесь

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости
#include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; #include &lt;fstream&gt; ...

2IntelliSense: выражение должно относиться к целочисленному типу или типу перечисления без области видимости
&quot;Выражение должно относиться к целочисленному типу или типу перечисления без области видимости&quot; Что...

что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу)
1) что происходит со старым конструктором когда я создаю новый, пренадлежащий производному классу?...

Из текста "Мал ребенок, да удал" получить "Удал ребенок, да мал"
Задали три задачки, однако совсем забыл эту тему. Прошу вашей помощи 1) Из текста &quot;Мал ребенок,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru