IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Задача с использованием ООП(наследование), C++, Builder 6.0
sheka
сообщение 16.06.2011 13:26
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Почему не работает 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 (c){
    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;
} 
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 6)
IUnknown
сообщение 16.06.2011 13:37
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Она у тебя что, нормально компилируется? Вот тут ничего не говорит:
Цитата
    if (Enabled = fabs(Enabled-1)){
      Prev = clock();
      First = Prev;
    };
?

И потом, что значит
Цитата
не работает 7й пункт меню?
? Как ты проверял, работает он или нет?

Сообщение отредактировано: IUnknown - 16.06.2011 13:37
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 16.06.2011 13:55
Сообщение #3


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


[C++ Warning] 18.cpp(26): W8060 Possibly incorrect assignment

При запуске ввожу все еденицы. Выбираю пункт 5-запуск секундомера. Потом выбираю пункт 6-вывод на экран текущих данных. 5 -останавливаю секундомер. 7-очищаю время, но оно не очищается, потому что потом выбираю опять 6 и на экран выводятся старые данные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 16.06.2011 14:54
Сообщение #4


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Это не говорит о том, что не срабатывает пункт №7. Это говорит о том, что он работает неправильно. Проверить, срабатывает ли он (передается ли ему управление при вводе 7-ки), можно одним-единственным способом:
  void Restart(){
	cout << "Restarted\n";  //  Вот таким
	Temp = StartTemp;
  };
. А вот как он должен РАБОТАТЬ - это вопрос к тебе, как к программисту.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 16.06.2011 15:52
Сообщение #5


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Наверное я не правильно выразился. Проверял я чуть-чуть иначе: просто Temp = 0. Учитывая, что Flat.GetTemp() работает на ура(ведь другие значения то выводит), то значит это присваивание не происходит, точнее происходит, но куда-то не туда сохраняется. А вот почему оно не работает - это уже интересный вопрос.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 16.06.2011 17:36
Сообщение #6


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
Учитывая, что Flat.GetTemp() работает на ура(ведь другие значения то выводит), то значит это присваивание не происходит, точнее происходит, но куда-то не туда сохраняется.
Учитывая, что температура, возвращаемая Flat.ChangeTemp, складывается из Nature.GetTemp(), Heater.GetTemp(), Radiator.GetTemp() и Conditioner.GetTemp(), и полученное значение тут же перезаписывает тот Temp, которому ты присвоил StartTemp, а сам Temp у тебя вообще нигде не используется справа от знака присваивания, то я не понимаю смысла функции Restart().

Если бы ты рестартовал также и температуры Nature, Heater, Radiator и Conditioner - тогда это имело бы какой-то смысл (ВСЕ температуры сбросились на начальные). А так - не понимаю: одно сбрасываешь, а другое - нет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 16.06.2011 23:51
Сообщение #7


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


smile.gif
Неожидал. У меня в голове была каша из 2х реализаций программы и в одной из них они обнулялись сами (точнее в одной вместо операторов = должны были стоять +=, а в другой наоборот). Вот и нахомутал. СПАСИБО!

Сообщение отредактировано: sheka - 16.06.2011 23:51
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 30.07.2025 3:44
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"