Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Оптимизация условия  (Прочитано 394 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн obgorelyi

  • Автор темы
  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Оптимизация условия
« : 25 Октябрь 2011, 22:56:13 »
Доброго времени суток всем! Помогите с оптимизацией, если возможно.
Есть таблица, в из нее выбирается значение для некоторого коэффициента Khbeta0, значение выбирается на основе трех переменных PSIbd, HB, vid.
if (PSIbd<0.4)
{
  if(HB<=350)
  {
    switch (vid)
    {
      case 0: Khbeta0=1.17;
      case 1: Khbeta0=1.12;
      case 2: Khbeta0=1.05;
      case 3: Khbeta0=1.03;
      case 4: Khbeta0=1.02;
      case 5: Khbeta0=1.02;
      case 6: Khbeta0=1.01;
    }
    Khbeta0=1.02;
  }
  else
  {
    switch (vid)
    {
      case 0: Khbeta0=1.43;
      case 1: Khbeta0=1.24;
      case 2: Khbeta0=1.11;
      case 3: Khbeta0=1.08;
      case 4: Khbeta0=1.05;
      case 5: Khbeta0=1.02;
      case 6: Khbeta0=1.01;
    }
  }
}
else if (PSIbd<0.6)
{
  if(HB<=350)
  {
    switch (vid)
    {
      case 0: Khbeta0=1.27;
      case 1: Khbeta0=1.18;
      case 2: Khbeta0=1.08;
      case 3: Khbeta0=1.05;
      case 4: Khbeta0=1.04;
      case 5: Khbeta0=1.03;
      case 6: Khbeta0=1.02;
    }
  }
  else
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.43;
      case 2: Khbeta0=1.20;
      case 3: Khbeta0=1.13;
      case 4: Khbeta0=1.08;
      case 5: Khbeta0=1.05;
      case 6: Khbeta0=1.02;
    }
  }
}
else if (PSIbd<0.8)
{
  if(HB<=350)
  {
    switch (vid)
    {
      case 0: Khbeta0=1.45;
      case 1: Khbeta0=1.27;
      case 2: Khbeta0=1.12;
      case 3: Khbeta0=1.08;
      case 4: Khbeta0=1.05;
      case 5: Khbeta0=1.03;
      case 6: Khbeta0=1.02;
    }
  }
  else
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.00;
      case 2: Khbeta0=1.28;
      case 3: Khbeta0=1.20;
      case 4: Khbeta0=1.13;
      case 5: Khbeta0=1.07;
      case 6: Khbeta0=1.04;
    }
  }
}
else if (PSIbd<1.0)
{
  if(HB<=350)
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.00;
      case 2: Khbeta0=1.15;
      case 3: Khbeta0=1.10;
      case 4: Khbeta0=1.07;
      case 5: Khbeta0=1.04;
      case 6: Khbeta0=1.02;
    }
  }
  else
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.00;
      case 2: Khbeta0=1.38;
      case 3: Khbeta0=1.27;
      case 4: Khbeta0=1.18;
      case 5: Khbeta0=1.11;
      case 6: Khbeta0=1.06;
    }
  }
}
else if (PSIbd<1.2)
{
  if(HB<=350)
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.00;
      case 2: Khbeta0=1.18;
      case 3: Khbeta0=1.13;
      case 4: Khbeta0=1.08;
      case 5: Khbeta0=1.06;
      case 6: Khbeta0=1.03;
    }
  }
  else
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.00;
      case 2: Khbeta0=1.48;
      case 3: Khbeta0=1.34;
      case 4: Khbeta0=1.25;
      case 5: Khbeta0=1.15;
      case 6: Khbeta0=1.08;
    }
  }
}
else if (PSIbd<1.4)
{
  if(HB<=350)
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.00;
      case 2: Khbeta0=1.23;
      case 3: Khbeta0=1.17;
      case 4: Khbeta0=1.12;
      case 5: Khbeta0=1.08;
      case 6: Khbeta0=1.04;
    }
  }
  else
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.00;
      case 2: Khbeta0=1.00;
      case 3: Khbeta0=1.42;
      case 4: Khbeta0=1.31;
      case 5: Khbeta0=1.20;
      case 6: Khbeta0=1.12;
    }
  }
}
else if (PSIbd<1.6)
{
  if(HB<=350)
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.00;
      case 2: Khbeta0=1.28;
      case 3: Khbeta0=1.20;
      case 4: Khbeta0=1.15;
      case 5: Khbeta0=1.11;
      case 6: Khbeta0=1.06;
    }
  }
  else
  {
    switch (vid)
    {
      case 0: Khbeta0=1.00;
      case 1: Khbeta0=1.00;
      case 2: Khbeta0=1.00;
      case 3: Khbeta0=1.00;
      case 4: Khbeta0=1.00;
      case 5: Khbeta0=1.26;
      case 6: Khbeta0=1.16;
    }
  }
}
Заранее благодарю за помощь!

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Оптимизация условия
« Ответ #1 : 26 Октябрь 2011, 00:11:57 »
Я не понял зачем в коде повторяется  несколько раз if(HB<=350)
Применяйте стратегию - Разделяй и Властвуй.
Разбейте ваш длинный код на несколько функций,
где каждая решает свою маленькую задачу на своём отрезке.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5215
  • Все по палатам!
    • Просмотр профиля
Re: Оптимизация условия
« Ответ #2 : 26 Октябрь 2011, 00:40:32 »
А массив Khbeta_array[15, 7] сделать нельзя?
Первый индекс определять по PSIbd, HB, а второй = vid.
Извините, я все еще учусь

Оффлайн obgorelyi

  • Автор темы
  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Оптимизация условия
« Ответ #3 : 26 Октябрь 2011, 16:21:40 »
To Senor_Gaga, если честно мой код и так разбит на функции :), а эта лишь одна функция :) в моем понимании функция это уже законченная вещь выполняющая одну операцию в моем случае вычисляет нужный мне коэффициент.

To SergeyIT: Сергей, если я вас понял, вы имели ввиду следующее?
#include <iostream>
#include <math.h>
using namespace std;
int main()
// Первая строка это vid
// Первый столбец это PSIbd
{
  float PSIbd, HB;
  int vid;
  float arr[15][8]={    0, 1, 2, 3, 4, 5, 6, 7,
0.4, 1.17, 1.12, 1.05, 1.03, 1.02, 1.02, 1.01,
0.4, 1.43, 1.24, 1.11, 1.08, 1.05, 1.02, 1.01,
0.6, 1.27, 1.18, 1.08, 1.05, 1.04, 1.03, 1.02,
0.6, 1, 1.43, 1.2, 1.13, 1.08, 1.05, 1.02,
0.8, 1.45, 1.27, 1.12, 1.08, 1.05, 1.03, 1.02,
0.8, 1, 1, 1.28, 1.2, 1.13, 1.07, 1.04,
1.0, 1, 1, 1.15, 1.1, 1.07, 1.04, 1.02,
1.0, 1, 1, 1.38, 1.27, 1.18, 1.11, 1.06,
1.2, 1, 1, 1.18, 1.13, 1.08, 1.06, 1.03,
1.2, 1, 1, 1.48, 1.34, 1.25, 1.15, 1.08,
1.4, 1, 1, 1.23, 1.17, 1.12, 1.08, 1.04,
1.4, 1, 1, 1, 1.42, 1.31, 1.2, 1.12,
1.6, 1, 1, 1.28, 1.20, 1.15, 1.11, 1.06,
1.6, 1, 1, 1, 1, 1, 1.26, 1.16};
  cout << "Введите значение переменной вид: ";
  cin  >> vid;
  cout << "Введите значение переменной HB: ";
  cin  >> HB;
  cout << "Введите значение переменной PSIbd: ";
  cin  >> PSIbd;
  int icounter, jcounter;
  for (int i=1; i<15; i+=2)
  {
    if(PSIbd<=arr[i][0])
    {
      if(HB<=350)
      {
icounter=i;
break;
      }
      icounter=i+1;
      break;
    }
  }
  for (int j=1; j<8; j++)
  {
    if (vid==arr[0][j])
    {
      jcounter=j;
      break;
    }
  }
  cout << "Значение коэффициента KHbeta0=" << arr[icounter][jcounter] << endl; 
}

 

Страница сгенерирована за 0.084 секунд. Запросов: 26.