C++ (Qt)class INDataTypes{public: virtual ~INDataTypes() { } virtual qint32 id() const = 0; virtual void setId(qint32 id) = 0; virtual QString name() const = 0; virtual void setName(QString name) = 0; protected: //если идентификатор равен -1, значит это либо временная переменная, либо константное значение qint32 _id; //константные или временные значения имен не имеют, только переменные. QString _name;}; class INSimpleDataTypes : public INDataTypes{public: virtual QString valueToQString() const = 0; protected: //это указывает на константное значение bool _constValue;};
C++ (Qt) class NSimpleDataTypes : public INSimpleDataTypes { public: NSimpleDataTypes() {_id = -1; _name = ""; _constValue = false;} qint32 id() const {return _id;} void setId(qint32 id) {_id = id;} QString name() const {return _name;} void setName(QString name) {if (name != NULL) _name = name; else _name = "";} bool constValue() const {return _constValue;} void setConstValue(bool constValue) {_constValue = constValue;} };
C++ (Qt)class NNumeric : public NSimpleDataTypes{public: NNumeric(double value = 0) : NSimpleDataTypes() { _isTypeInteger = false; setValue(value); } NNumeric(double value, bool isTypeInteger) : NSimpleDataTypes() { setisTypeInteger(isTypeInteger); setValue(value); } QString valueToQString() const { int decpt, sign; QString s(fcvt(_value, 18, &decpt, &sign)); if (decpt > 0 && _value < 0.0 ? _value - ceil(_value) : _value - floor(_value) == 0.0) {//здесь число без цифр отличных от нуля после десятичной запятой s.remove(decpt, s.length() - decpt); } else {//наоборот if (decpt > 0) s = s.insert(decpt,'.'); else { QString s2 = "0."; for (int i = 0; i < decpt * (-1); i++) s2 += '0'; s.insert(0, s2); } bool isNumberNull = true; while(isNumberNull) { if (s[s.length() - 1] == '0') { s.remove(s.length() - 1, 1); isNumberNull = true; } else { isNumberNull = false; } } } //после преобразования числа в строку, проверяем его на отрицательность if (sign != 0) s = s.insert(0, '-'); return s; } //целочисленное деление static NNumeric nnDiv(NNumeric a, NNumeric b) { return NNumeric(ldiv(qint32(a), qint32(b)).quot, true); } //% (остаток от целочисленного деления) static NNumeric nnMod(NNumeric a, NNumeric b) { return NNumeric(ldiv(qint32(a), qint32(b)).rem, true); } //возведение в степень static NNumeric nnPow(NNumeric a, NNumeric b) { return NNumeric(pow(double(a), double(b)), a.isTypeInteger() && b.isTypeInteger()); } //квадратный корень static NNumeric nnSqrt(NNumeric a) { return NNumeric(sqrt(double(a)), a.isTypeInteger()); } //модуль числа static NNumeric nnAbs(NNumeric a) { return NNumeric(std::abs(double(a)), a.isTypeInteger()); } //минимальное число static NNumeric nnMin(NNumeric a, NNumeric b) { double d1 = double(a), d2 = double(b); return d1 < d2 ? NNumeric(d1, a.isTypeInteger()) : NNumeric(d2, b.isTypeInteger()); } //максимальное число static NNumeric nnMax(NNumeric a, NNumeric b) { double d1 = double(a), d2 = double(b); return d1 > d2 ? NNumeric(d1, a.isTypeInteger()) : NNumeric(d2, b.isTypeInteger()); } //десятичный логарифм static NNumeric nnLog10(NNumeric a) { return NNumeric(log10(double(a))); } //натуральный логарифм static NNumeric nnLog(NNumeric a) { return NNumeric(log(double(a))); } //экспонента в степени "a" static NNumeric nnExp(NNumeric a) { return NNumeric(exp(double(a))); } //косинус static NNumeric nnCos(NNumeric a) { return NNumeric(cos(double(a))); } //синус static NNumeric nnSin(NNumeric a) { return NNumeric(sin(double(a))); } //тангенс static NNumeric nnTan(NNumeric a) { return NNumeric(tan(double(a))); } //арктангенс static NNumeric nnCtan(NNumeric a) { return NNumeric(1.0 / tan(double(a))); } //арккосинус static NNumeric nnACos(NNumeric a) { return NNumeric(acos(double(a))); } //арксинус static NNumeric nnASin(NNumeric a) { return NNumeric(asin(double(a))); } //арктангенс static NNumeric nnATan(NNumeric a) { return NNumeric(atan(double(a))); } //арккатангенс static NNumeric nnACtan(NNumeric a) { return NNumeric(1.0 / atan(double(a))); } //округление в сторону нуля до целого static NNumeric nnFloor(NNumeric a) { return NNumeric(floor(double(a))); } //округление в большую сторону до целого static NNumeric nnCeil(NNumeric a) { return NNumeric(ceil(double(a))); } //округление до целого static NNumeric nnRound(NNumeric a) { return NNumeric(floor(double(a) + 0.5)); } //выделение дробной части static NNumeric nnFractional(NNumeric a) { double d = double(a); return d < 0.0 ? NNumeric(d - ceil(d)) : NNumeric(d - floor(d)); } //отсечение дробной части static NNumeric nnInteger(NNumeric a) { double d = double(a); return d < 0.0 ? NNumeric(ceil(d)) : NNumeric(floor(d)); } //целочисленный рандом от 0 и до a-1 static NNumeric nnRandom(NNumeric a) { srand ( time(NULL) ); return NNumeric(rand() % qint32(a), false); } //рандом от 0 до 1 static NNumeric nnRnd() { srand ( time(NULL) ); return NNumeric(double(rand() % 1001)/1000.0); } NNumeric operator+(NNumeric b) { return NNumeric(this->value() + b.value(), this->isTypeInteger() && b.isTypeInteger()); } NNumeric operator-(NNumeric b) { return NNumeric(this->value() - b.value(), this->isTypeInteger() && b.isTypeInteger()); } NNumeric operator*(NNumeric b) { return NNumeric(this->value() * b.value(), this->isTypeInteger() && b.isTypeInteger()); } NNumeric operator/(NNumeric b) { return NNumeric(this->value() / b.value(), this->isTypeInteger() && b.isTypeInteger()); } void operator++(int) { if (isTypeInteger()) _value = checkingInt32Borders(_value + 1); else _value = checkingFloatBorders(_value + 1); } void operator--(int) { if (isTypeInteger()) _value = checkingInt32Borders(_value - 1); else _value = checkingFloatBorders(_value - 1); } bool operator==(NNumeric b) { return this->value() == double(b); } bool operator!=(NNumeric b) { return this->value() != double(b); } bool operator<=(NNumeric b) { return this->value() <= double(b); } bool operator>=(NNumeric b) { return this->value() >= double(b); } bool operator<(NNumeric b) { return this->value() < double(b); } bool operator>(NNumeric b) { return this->value() > double(b); } operator QString() {return valueToQString();} operator double() {return checkingFloatBorders(value());} operator qint32() {return checkingInt32Borders(_value);} //оператор ниже позволяет передать указателю значения из экземпляра класса operator NNumeric*() { NNumeric* pnn = new NNumeric(); pnn->setId(id()); pnn->setConstValue(constValue()); pnn->setName(name()); pnn->setisTypeInteger(isTypeInteger()); pnn->setValue(value()); return pnn; } private: long double int32Max() const {return 2147483647;} long double int32Min() const {return -2147483647;} long double floatMax() const {return 2.147483647e9;} long double floatMin() const {return 2.147483647e-9;} double checkingFloatBorders (double value) const { //В этой функции +/-inf приравниваются к max и min границам. double d = fabs(value); bool usign = value >= 0.0; if (d >= floatMax()) return (usign) ? floatMax() : -floatMax(); if (d <= floatMin() && d > 0.0) return (usign) ? floatMin() : -floatMin(); return value; } qint32 checkingInt32Borders(double value) const { if (value >= int32Max()) return int32Max(); if (value <= int32Min()) return int32Min(); return qint32(value); } void setisTypeInteger(bool isTypeInteger) {_isTypeInteger = isTypeInteger;} //Если истинно, то значение принимается и выдается (при печати числа на экране) // с отсечение дробной части числа и соблюдением границ типа qint32. bool isTypeInteger() const {return _isTypeInteger;} void setValue(double value) { if (isTypeInteger()) value = checkingInt32Borders(value); else value = checkingFloatBorders(value); _value = value; } double value() const {return checkingFloatBorders(_value);} double _value; bool _isTypeInteger;};
C++ (Qt) enum NGroupDataTypes { eNSimpleDataTypes }; class INDataTypes { public: virtual ~INDataTypes() { } virtual qint32 id() const = 0; virtual void setId(qint32 id) = 0; virtual QString name() const = 0; virtual void setName(QString name) = 0; virtual NGroupDataTypes groupDataTypes() const = 0; protected: //если идентификатор равен -1, значит это либо временная переменная, либо константное значение qint32 _id; //константные или временные значения имен не имеют, только переменные. QString _name; //указание на принадлежность к группе типов данных. NGroupDataTypes _groupdatatypes; }; class INSimpleDataTypes : public INDataTypes { public: virtual QString valueToQString() const = 0; protected: //это указывает на константное значение bool _constValue; };
C++ (Qt) class NSimpleDataTypes : public INSimpleDataTypes { public: NSimpleDataTypes() { _id = -1; _name = ""; _constValue = false; _groupdatatypes = eNSimpleDataTypes; } qint32 id() const {return _id;} void setId(qint32 id) {_id = id;} QString name() const {return _name;} void setName(QString name) {if (name != NULL) _name = name; else _name = "";} NGroupDataTypes groupDataTypes() const {return _groupdatatypes;} bool constValue() const {return _constValue;} void setConstValue(bool constValue) {_constValue = constValue;} };
C++ (Qt)NNumeric numeric= 5;INDataTypes *idt = numeric;bool b = (*idt).groupDataTypes() == eNSimpleDataTypes;
C++ (Qt)virtual qint32 id() const = 0; virtual void setId(qint32 id) = 0; virtual QString name() const = 0; virtual void setName(QString name) = 0;
C++ (Qt)class INDataTypes { public: virtual ~INDataTypes() { } qint32 id() const { return _id; } void setId(qint32 id) { _id = id; } QString name() const { return _name; } void setName(QString name) { _name = name;} virtual NGroupDataTypes groupDataTypes() const = 0; // Оставить только эту фиртуальнойprotected://если идентификатор равен -1, значит это либо временная переменная, либо константное значение qint32 _id; //константные или временные значения имен не имеют, только переменные. QString _name; };
C++ (Qt)class NSimpleDataTypes : public INSimpleDataTypes { public: NSimpleDataTypes() { _id = -1; _name = ""; _constValue = false; //_groupdatatypes = eNSimpleDataTypes; Нафига лишняя переменная? } NGroupDataTypes groupDataTypes() const {return eNSimpleDataTypes; /*_groupdatatypes; */ } /* Это тоже лишнее */ bool constValue() const {return _constValue;} void setConstValue(bool constValue) {_constValue = constValue;} };
C++ (Qt)NSimpleDataTypes() { _id = -1; _name = ""; _constValue = false; _groupdatatypes = eNSimpleDataTypes; } NGroupDataTypes groupDataTypes() const {return _groupdatatypes; }
C++ (Qt)NSimpleDataTypes() { _id = -1; _name = ""; _constValue = false; } NGroupDataTypes groupDataTypes() const {return eNSimpleDataTypes; }
C++ (Qt)virtual void setId(qint32 id) = 0; virtual QString name() const = 0; virtual void setName(QString name) = 0;