Написать программу для решения СЛУ методом Жордана-Гаусса. Программа на вход получает N - количество уравнений, затем сами уравнения, каждое - в формате строки. Пример: Входные данные: 3 2x+y+z=7 x+2y+z=8 x+y+2z=9 Выходные данные: x=1 y=2 z=3 Язык C++
Работаю уже второй час. На бумажке выходит, в коде - нет)
Чувствую себя Лайтом=D
Код написан ниже. Пример ввода: 4 x100+12mamba+11=barry-3 7x100-4barry=4 barry=x100-2mamba 4=2+2 Пример вывода: barry=6 mamba=-1 x100=4 #include #include #include #include #include #define abs(x) ((x)<0 ? -(x) : (x))<br>using namespace std; typedef map equation; equation parseLine(const string &str, set &vars) { map eqn; bool left_part = true; size_t i = 0; while (i < str.length()) { double n = 0; bool isNeg = !left_part; bool isCoeffOmitted = true; string var = ""; if (str[i] == '='){ left_part = false; i++; continue; } if ((str[i] == '-') || (str[i] == '+')) { if (str[i] == '-') isNeg = !isNeg; i += 1; } while ((i < str.length()) && (str[i] >= '0') && (str[i] <= '9')) {<br> n = 10 * n + (str[i] - '0'); isCoeffOmitted = false; i++; } if ((i < str.length()) && (str[i] == '.')) { int exp = 0; i++; while ((i < str.length()) && (str[i] >= '0') && (str[i] <= '9')){<br> n = 10 * n + (str[i] - '0'); exp++; i++; } for (int j = 0; j < exp; n /= 10., j++); } while ((i < str.length()) && (str[i] != '+') && (str[i] != '=') && (str[i] != '-')){ var += str[i]; i++; } if (isCoeffOmitted) n = 1; if (isNeg) n = -n; eqn[var] += n; vars.insert(var); } return eqn; } void GaussJordan(vector &eqns, const vector &vars) { for (size_t i = 0; i < vars.size(); i++) { size_t j = i; while ((j < eqns.size()) && (eqns[j][vars[i]] == 0)) j++; if (j == eqns.size()) throw "Underdetermined system"; if (j != i) swap(eqns[i], eqns[j]); double elem = eqns[i][vars[i]]; for (equation::iterator it = eqns[i].begin(); it != eqns[i].end(); it++) it->second /= elem; for (j = i + 1; j < eqns.size(); j++){ elem = eqns[j][vars[i]]; for (equation::iterator it = eqns[i].begin(); it != eqns[i].end(); it++) eqns[j][it->first] -= elem * eqns[i][it->first]; } } for (size_t i = vars.size(); i < eqns.size(); i++) for (equation::iterator it = eqns[i].begin(); it != eqns[i].end(); it++) if (abs(it->second) > 1e-12) throw "No solutions"; for (size_t i = vars.size() - 1; i > 0; i--) { for (size_t j = 0; j < i; j++) { eqns[j][""] -= eqns[j][vars[i]] * eqns[i][""]; eqns[j][vars[i]] = 0; } } } void printAnswer(vector &eqns, vector &vars) { for (size_t i = 0; i < vars.size(); i++) cout << vars[i] << "=" << -eqns[i][""] << endl;<br>} int main() { set vars; vector eqns; size_t n = 0; cin >> n; for (size_t i = 0; i < n; i++) { string t; cin >> t; eqns.push_back(parseLine(t, vars)); } vars.erase(""); vector vars_list(vars.begin(), vars.end()); try { GaussJordan(eqns, vars_list); } catch (char const *e) { cout << e;<br> return 1; } printAnswer(eqns, vars_list); return 0; }
Надеюсь, код запутан достаточно, чтобы его ни в одном приличном учебном заведении не приняли :)
3x+2y-5z=-1 2x-y+3z=13 x+2y-z=9 Ответ должен быть: x=3; y=5; z=4 прога выдаёт: x=3.1(2); y=4,8(3); z=3,8(3)
Щас проверю)
Поправлено.
Хоть прога и не может выразить решение через свободную переменную, если придётся, всё равно шокирует, что прога рабочая - БЛАГОДАРЮ!!!