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

Вопрос школьника по предмету Информатика

Написать программу для решения СЛУ методом Жордана-Гаусса. Программа на вход получает 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

7×100-4barry=4

barry=x100-2mamba

4=2+2

Пример вывода:

barry=6

mamba=-1

x100=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;

}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Похожие вопросы от пользователей