Написать программу для решения СЛУ методом Жордана-Гаусса. Программа на вход получает N - количество уравнений, затем сами уравнения, каждое - в формате строки. Пример: Входные данные: 3 2x+y+z=7 x+2y+z=8 x+y+2z=9 Выходные данн...

Написать программу для решения СЛУ методом Жордана-Гаусса. Программа на вход получает N - количество уравнений, затем сами уравнения, каждое - в формате строки. Пример: Входные данные: 3 2x+y+z=7 x+2y+z=8 x+y+2z=9 Выходные данные: x=1 y=2 z=3 Язык C++
Гость
Ответ(ы) на вопрос:
Гость
Код написан ниже.  Пример ввода: 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)) 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')) {          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 &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; } 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;       return 1;    }    printAnswer(eqns, vars_list);       return 0; }
Не нашли ответ?
Ответить на вопрос
Похожие вопросы