p align="justify"> { lt; lt; Введіть знак при lt; lt; i + 1 lt; lt; -м обмеженні ( lt; =, =, gt; =): raquo ;;
getline (cin, sn); (sn == lt;= || sn == = || sn == gt;=) { =true; (sn == lt;=) [i]=0; (sn == =) [i]=1; (sn == gt;=) [ i]=2;
} (0); lt; lt; sign [i] lt; lt; endl;
} while (! validator);
=false;
{
cout lt; lt; Введіть вільний член при lt; lt; i + 1 lt; lt; -м обмеженні: raquo ;;
getline (cin, fr_m); (atof (fr_m.c_str ()) == 0) (0);=true;
} while (! validator);
[i]=atof (fr_m.c_str ());
validator=false;
lt; lt; endl;
}
}
Функція error (int err_no) приймає в якості аргументу номер помилки, яка повинна вивестися користувачеві в тому випадку, якщо він ввів некоректні дані. Далі номер помилки, переданий у функцію обробляється оператором switch (), і залежно від прийнятого функцією аргументу, виводиться помилка за допомогою оператора cout.]
Тепер розглянемо функцію-член get_data_from_user () класу user_data. Всі дані, який вводить користувач, спочатку поміщаються в об'єкт типу string, а потім перевіряється коректність даних, якщо все введено вірно, то виконується перетворення з std :: string в int або double за допомогою функцій atoi () і atof () відповідно.
Спочатку у користувача запитується кількість обмежень в системі. Якщо було введено ціле число, від 2 до 500, то це значення перетвориться в int і заностітся в змінну-член num_l. В іншому випадку викликається функція error () з номером соответвует помилки і знову запитується введення даних.
Далі, таким же чином користувач вводить кількість змінних задачі.
Потім виділяється пам'ять під масив function і матрицю system, а потім також йде введення коефіцієнтів функції мети в циклі. Після йде введення значення напрямки функції. Якщо воно введено вірно, то в змінна-член way заноситься true або false, залежно від введеного значення. Регістр при введенні напрямки не враховується при перевірці. Якщо все вірно, заповнюється матриця system коефіцієнтами системи обмежень вихідної задачі. Заповнення відбувається у двох вкладених циклах, у першому з яких, також вводиться знак обмеження і значення вільного члена при цьому обмеженні. Коли користувач закінчить введення, все змінна-члени класу user_data будуть заповнені, і тоді ми переходимо до самого алгоритму, який реалізований в класі simplex, що є прямим спадкоємцем класу user_data. Розглянемо вміст заголовного файлу цього класу.
Лістинг 3. simplex.h
# ifndef _SIMPLEX_H _
# define _SIMPLEX_H _
# include lt; sstream gt;
# include user_data.h
simplex: public user_data {: init (); gen_plane (); plane_is_valid (); function_is_undefined (); print_result_to_file (int it_num) ;: func; ** bv; ** sv; * istr; * th; alm; i_lrow; i_lcol; :: stringstream table;
};
# endif/* _SIMPLEX_H_ */
Спочатку розглянемо закриті змінна-члени даного класу.
double func - містить значення цільової фукнции. При кожній ітерації воно змінюється. ** Bv - Містить значення базисних змінних задачі. Даний член є покажчиком на масив покажчиків, який у подальшому инициализируется двовимірним масивом num_v x 2, у першому стобце якого містяться безпосередньо. Самі значення базисних змінних задачі, а в другому номери цих змінних, які змінюються при кожній наступній ітерації. Номери базисних змінних необхідні для того, щоб правильно вивести користувачеві відповідь і побудувати таблицю на виході. ** Sv - Матриця коефіцієнтів при змінних задачі розміром num_l x num_v * 2. Перші num_v стовпці даної матриці заповнюються коефіцієнтами вихідної системи обмежень, а наступні num_v стовпці заповнюються одиничною матрицею, якщо вирішується завдання на максимум, якщо ж виробляється рішення задачі на мінімум, одиниці змінюють свій знак. * istr - індексна рядок, є одновимірним масивом розміром num_v * 2, перша половина якого заповнюється коефіцієнтами функції-цілі зі зворотним знаком, а друга нулями на першій ітерації. На наступних ітераціях значення індексного рядка змінюються.
лінійний програмування симплекс таблиця
Int i_lcol=індекс ведучого шпальти поточного плану.
* th (грец. «тета») - останній стовпець симплексної таблиці, инициализируется одновимірним масивом ...