Решения задачи планирования производства симплекс методом
bool operator!=(int num);
private:
int m_hi; // числитель
int m_lo; // знаменатель
double m_d;
bool overflow;
void optim();
static bool gen;
};
bool CD::gen = false;
CD::CD( int hi, int lo )
{
if( !gen )
{
Generate_Prost();
gen = true;
}
overflow = false;
Set( hi, lo );
}
bool CD::Set( int hi, int lo )
{
ove
rflow = false;
if( lo == 0 )
{
m_hi = 0;
m_lo = 1;
return false;
}
m_hi = hi;
if( m_hi == 0 ) m_lo = 1;
else
{
m_lo = lo;
optim();
}
return true;
}
bool CD::Set( double d )
{
overflow = true;
m_d = d;
return true;
}
bool CD::Set( AnsiString d )
{
int pos = 0;
if( pos = d.LastDelimiter("/") )
{
m_hi = StrToIntDef( d.SubString( 1, pos - 1 ), 0 );
m_lo = StrToIntDef( d.SubString( pos + 1, d.Length() ), 1 );
Set( m_hi, m_lo );
}
else if( pos = d.LastDelimiter(".,") )
{
Set( StrToFloat( d ) );
}
else
{
m_hi = StrToIntDef( d, 0 );
Set( m_hi, 1 );
}
optim();
// ShowMessage( "m_hi = " + AnsiString(m_hi) + "\nm_lo = " + m_lo );
return true;
}
bool CD::SetInv( AnsiString d )
{
int pos = 0;
if( pos = d.LastDelimiter("/") )
{
m_hi = -StrToIntDef( d.SubString( 1, pos - 1 ), 0 );
m_lo = StrToIntDef( d.SubString( pos + 1, d.Length() ), 1 );
Set( m_hi, m_lo );
}
else if( pos = d.LastDelimiter(".,") )
{
Set( -StrToFloat( d ) );
}
else
{
m_hi = -StrToIntDef( d, 0 );
Set( m_hi, 1 );
}
// ShowMessage( "m_hi = " + AnsiString(m_hi) + "\nm_lo = " + m_lo );
return true;
}
double CD::get_d() // возвращает десятичное значение
{
if( overflow ) return m_d;
if ( m_hi ) return float(m_hi)/m_lo;
else return 0;
}
AnsiString CD::get_a()
{
if( overflow ) return FloatToStrF( m_d, ffGeneral, 7, 0 );
if ( m_lo == 1 ) return AnsiString(m_hi);
else return AnsiString(m_hi) + "/" + AnsiString(m_lo);
}
AnsiString CD::get_s()
{
if( overflow )
{
if( m_d >= 0 ) return AnsiString( " + " ) + FloatToStrF( m_d, ffGeneral, 7, 0 );
else return AnsiString( " - " ) + FloatToStrF( -m_d, ffGeneral, 7, 0 );
}
if ( m_lo == 1 ) return (m_hi < 0)?AnsiString(" - ") + abs(m_hi):" + " + AnsiString(m_hi);
else return ((m_hi < 0)?AnsiString(" - ") + abs(m_hi):" + " + AnsiString(m_hi)) + "/" + AnsiString(m_lo);
}
CD CD::get_dr()
{
CD cd;
if( overflow )
{
cd.Set( m_d - floor(m_d) );
return cd;
}
ldiv_t r;
r = ldiv( m_hi, m_lo );
if( r.rem >= 0 )
{
cd.Set( r.rem, m_lo );
}
else
{
cd.Set( m_lo + r.rem, m_lo );
}
return cd;
}
int CD::get_cel()
{
int cd;
if( overflow )
{
cd = floor( m_d );
return cd;
}
if( m_hi >= 0 )
cd = ldiv( m_hi, m_lo ).quot;
else
cd = ldiv( m_hi, m_lo ).quot - 1;
return cd;
}
CD CD::get_abs()
{
CD cd;
if( overflow )
{
if( m_d >= 0 ) cd.Set( m_d );
else cd.Set( -m_d );
return cd;
}
if( m_hi < 0 ) cd.Set( -m_hi, m_lo );
else cd.Set( m_hi, m_lo );
return cd;
}
CD CD::operator+(CD d)
{
CD cd;
if( overflow || d.overflow )
{
cd.Set( get_d() + d.get_d() );
return cd;
}
cd.Set( m_hi*d.m_lo + d.m_hi*m_lo, m_lo*d.m_lo );
return cd;
}
CD CD::operator+(int num)
{
CD cd;
if( overflow )
{
cd.Set( get_d() + num );
return cd;
}
cd.Set( m_hi + num*m_lo, m_lo );
return cd;
}
CD CD::operator-(CD d)
{
CD cd;
if( overflow || d.overflow )
{
cd.Set( get_d() - d.get_d() );
return cd;
}
cd.Set(m_hi*d.m_lo - d.m_hi*m_lo, m_lo*d.m_lo );
return cd;
}
CD CD::operator-(int num)
{
CD cd;
if( overflow )
{
cd.Set( get_d() - num );
return cd;
}
cd.Set( m_hi - num*m_lo, m_lo );
return cd;
}
CD CD::operator*(CD d)
{
CD cd;
if( overflow || d.overflow )
{
cd.Set( get_d() * d.get_d() );
return cd;
}
cd.Set( m_hi*d.m_hi, m_lo*d.m_lo );
return cd;
}
CD CD::operator*(int num)
{
CD cd;
if( overflow )
{
cd.Set( get_d() * num );
return cd;
}
cd.Set( m_hi*num, m_lo );
return cd;
}
CD CD::operator/(CD d)
{
CD cd;
if( overflow || d.overflow )
{
cd.Set( get_d() / d.get_d() );
return cd;
}
cd.Set( m_hi*d.m_lo, m_lo*d.m_hi );
return cd;
}
CD CD::operator/(int num)
{
CD cd;
if( overflow )
{
cd.Set( get_d() / num );
return cd;
}
cd.Set( m_hi, m_lo*num );
return cd;
}
CD CD::operator=(CD d)
{
if( d.overflow)
{
Set( d.get_d() );
return *this;
}
Set( d.m_hi, d.m_lo );
return *this;
}
CD CD::operator=(int num)
{
Set( num, 1 );
return *this;
}
bool CD::operator==(CD d)
{
if( overflow || d.overflow )
{
return get_d() == d.get_d();
}
if( m_hi == d.m_hi )
if( m_lo == d.m_lo )
return true;
return false;
}
bool CD::operator==(int num)
{
if( overflow )
{
return get_d() == num;
}
if( m_hi == num )
if( m_lo == 1 )
return true;
return false;
}
bool CD::operator!=(CD d)
{
if( overflow || d.overflow )
{
return get_d() != d.get_d();
}
if( m_hi == d.m_hi )
if( m_lo == d.m_lo )
return false;
return true;
}
bool CD::operator!=(int num)
{
if( overflow )
{
return get_d() != num;
}
if( m_hi == num )
if( m_lo == 1 )
return false;
return true;
}
void CD::optim()
{
if( overflow ) return;
m_hi *= m_lo/abs(m_lo); // для знака
m_lo = abs(m_lo);
if( m_hi ) // далее сокращение дроби
{
int i = 0;
while(1)
{
while( ldiv( m_hi, mas[i] ).rem == 0 && ldiv( m_lo, mas[i] ).rem == 0 )
{
m_hi /= mas[i];
m_lo /= mas[i];
}
if( (mas[i + 1] > abs(m_hi) && mas[i + 1] > m_lo) || i + 1 > PR_COUNT - 1 ) break;
i++;
}
if( abs(m_hi) > mas[PR_COUNT - 1] || m_lo > mas[PR_COUNT - 1] )
{
overflow = true;
m_d = double(m_hi)/m_lo;
return;
}
}
}
void Generate_Prost()
{
bool is_prost;
float per;
int kol = 1;
mas[0] = 2;
int i = 3;
while(1)
{
is_prost = true;
for( int j = 0; j < kol; j++ )
if( ldiv( i, mas[j] ).rem == 0 )
{
is_prost = false;
break;
}
if( is_prost )
{
mas[kol] = i;
kol++;
}
if( kol >= PR_COUNT ) return;
i++;
}
Другие рефераты на тему «Экономико-математическое моделирование»:
Поиск рефератов
Последние рефераты раздела
- Выборочные исследования в эконометрике
- Временные характеристики и функция времени. Графическое представление частотных характеристик
- Автоматизированный априорный анализ статистической совокупности в среде MS Excel
- Биматричные игры. Поиск равновесных ситуаций
- Анализ рядов распределения
- Анализ состояния финансовых рынков на основе методов нелинейной динамики
- Безработица - основные определения и измерение. Потоки, запасы, утечки, инъекции в модели