• Написать программу для решения СЛУ методом Жордана-Гаусса. Программа на вход получает N - количество уравнений, затем сами уравнения, каждое - в формате строки.

    Пример:

    Входные данные:

    3
    2x+y+z=7
    x+2y+z=8
    x+y+2z=9

    Выходные данные:

    x=1
    y=2
    z=3

    Язык C++

Ответы 3

  • Щас проверю)
  • Хоть прога и не может выразить решение через свободную переменную, если придётся, всё равно шокирует, что прога рабочая - БЛАГОДАРЮ!!!
    • Автор:

      sariah
    • 5 лет назад
    • 0
  • Код написан ниже. Пример ввода:4x100+12mamba+11=barry-37x100-4barry=4barry=x100-2mamba4=2+2Пример вывода:barry=6mamba=-1x100=4#include <iostream>#include <map>#include <string>#include <set>#include <vector>#define abs(x) ((x)<0 ? -(x) : (x))using namespace std;typedef map<string, double> equation;equation parseLine(const string &str, set<string> &vars) {   map<string, double> 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')) {         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')){            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<equation> &eqns, const vector<string> &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<equation> &eqns, vector<string> &vars) {   for (size_t i = 0; i < vars.size(); i++)      cout << vars[i] << "=" << -eqns[i][""] << endl;}int main() {   set<string> vars;   vector<equation> 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<string> vars_list(vars.begin(), vars.end());   try {      GaussJordan(eqns, vars_list);   }   catch (char const *e) {      cout << e;      return 1;   }   printAnswer(eqns, vars_list);      return 0;}
  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years