Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача с использованием ООП(наследование)
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
sheka
Почему не работает 7й пункт меню?
#include <iostream.h>
#include <conio.h>
#include <sys/types.h>
#include <time.h>
#include <math.h>

class cMyTimer{
private:
clock_t Prev,First;
int Enabled;
public:
cMyTimer(){
Enabled = 0;
};
double GetTime(){
if (Enabled){
clock_t d = Prev;
return (double)((Prev = clock())- d)/CLOCKS_PER_SEC;
}
else return 0;
};
int GetEnabled(){
return Enabled;
};
void ChangeEnabled(){
if (Enabled = fabs(Enabled-1)){
Prev = clock();
First = Prev;
};
};
double GetTimeFromStart(){
if (Enabled) return (double)(clock()-First)/CLOCKS_PER_SEC;
else return 0;
};
};


class cMyTemp{
protected:
double Temp;
public:
cMyTemp(){
Temp = 0;
};
double GetTemp(){
return Temp;
};
};

class cHeater: public cMyTemp{
protected:
double k;
int Enabled;
public:
cHeater(): cMyTemp(){
k = 0;
Enabled = 0;
};
void Insert(){
cout << "Vvedite koefficient: ";
cin >> k;
cout << "Vvedite sostoyanie 0/1: ";
cin >> Enabled;
};
void ChangeTemp(double sec){
Temp += Enabled*k*sec;
};
};

class cFlat: public cMyTemp{
protected:
cHeater Nature, Heater, Radiator, Conditioner;
double StartTemp;
public:
void Restart(){
Temp = StartTemp;
};
void InsertNature(){
cout << "Vvedite Parametri vneshnego okruzhenia:\n";
Nature.Insert();
};
void InsertHeater(){
cout << "Vvedite Parametri obogrevatelia:\n";
Heater.Insert();
};
void InsertRadiator(){
cout << "Vvedite Parametri radiatora:\n";
Radiator.Insert();
};
void InsertConditioner(){
cout << "Vvedite Parametri conditionera:\n";
Conditioner.Insert();
};
void Insert(){
cout << "Vvedite Parametri kvartiri:" << endl;
cout << "Nachalnaia temperatura: ";
cin >> StartTemp;
InsertNature();
InsertHeater();
InsertRadiator();
InsertConditioner();
};
cFlat(): cMyTemp(){
};
void ChangeTemp(double sec, int Enabled){
Nature.ChangeTemp(sec);
Heater.ChangeTemp(sec);
Radiator.ChangeTemp(sec);
Conditioner.ChangeTemp(sec);
Temp= StartTemp+Nature.GetTemp()+Heater.GetTemp()+Radiator.GetTemp()+Conditioner.GetTemp();
};
};


int main(){
cMyTimer MyTimer;
cFlat Flat;
char c;
Flat.Insert();
do{
cout<<"Vvedit nomer dii:"<<endl;
cout<<"0 - Vuhid"<<endl;
cout<<"1 - Zminiti Parametri navkolisniogo seredovisa"<<endl;
cout<<"2 - Zminiti Parametri obigrivacha"<<endl;
cout<<"3 - Zminiti Parametri radiatora"<<endl;
cout<<"4 - Zminiti Parametri konditionera"<<endl;
cout<<"5 - Pochati/zupiniti vidlik chasu modeliuvannia"<<endl;
cout<<"6 - Vivesti resultati modeliuvannia na danii moment"<<endl;
cout<<"7 - Skinuti do pochatkovih resultativ"<<endl;
cin>>c;
cout<<endl;
switch ©{
case '1': Flat.InsertNature(); break;
case '2': Flat.InsertHeater(); break;
case '3': Flat.InsertRadiator(); break;
case '4': Flat.InsertConditioner(); break;
case '5': MyTimer.ChangeEnabled(); break;
case '6': Flat.ChangeTemp(MyTimer.GetTime(),MyTimer.GetEnabled());
cout << "Vremia s nachiala modelirovaniya: " << MyTimer.GetTimeFromStart()<<endl;
cout << "Temperatura v kvartire: " << Flat.GetTemp() <<endl; break;
case '7': Flat.Restart(); break;
}
}while(c!='0');
return 0;
}
IUnknown
Она у тебя что, нормально компилируется? Вот тут ничего не говорит:
Цитата
    if (Enabled = fabs(Enabled-1)){
Prev = clock();
First = Prev;
};
?

И потом, что значит
Цитата
не работает 7й пункт меню?
? Как ты проверял, работает он или нет?
sheka
[C++ Warning] 18.cpp(26): W8060 Possibly incorrect assignment

При запуске ввожу все еденицы. Выбираю пункт 5-запуск секундомера. Потом выбираю пункт 6-вывод на экран текущих данных. 5 -останавливаю секундомер. 7-очищаю время, но оно не очищается, потому что потом выбираю опять 6 и на экран выводятся старые данные.
IUnknown
Это не говорит о том, что не срабатывает пункт №7. Это говорит о том, что он работает неправильно. Проверить, срабатывает ли он (передается ли ему управление при вводе 7-ки), можно одним-единственным способом:
  void Restart(){
cout << "Restarted\n"; // Вот таким
Temp = StartTemp;
};
. А вот как он должен РАБОТАТЬ - это вопрос к тебе, как к программисту.
sheka
Наверное я не правильно выразился. Проверял я чуть-чуть иначе: просто Temp = 0. Учитывая, что Flat.GetTemp() работает на ура(ведь другие значения то выводит), то значит это присваивание не происходит, точнее происходит, но куда-то не туда сохраняется. А вот почему оно не работает - это уже интересный вопрос.
IUnknown
Цитата
Учитывая, что Flat.GetTemp() работает на ура(ведь другие значения то выводит), то значит это присваивание не происходит, точнее происходит, но куда-то не туда сохраняется.
Учитывая, что температура, возвращаемая Flat.ChangeTemp, складывается из Nature.GetTemp(), Heater.GetTemp(), Radiator.GetTemp() и Conditioner.GetTemp(), и полученное значение тут же перезаписывает тот Temp, которому ты присвоил StartTemp, а сам Temp у тебя вообще нигде не используется справа от знака присваивания, то я не понимаю смысла функции Restart().

Если бы ты рестартовал также и температуры Nature, Heater, Radiator и Conditioner - тогда это имело бы какой-то смысл (ВСЕ температуры сбросились на начальные). А так - не понимаю: одно сбрасываешь, а другое - нет.
sheka
smile.gif
Неожидал. У меня в голове была каша из 2х реализаций программы и в одной из них они обнулялись сами (точнее в одной вместо операторов = должны были стоять +=, а в другой наоборот). Вот и нахомутал. СПАСИБО!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.