profile
Размещено 5 лет назад по предмету Информатика от Аккаунт удален

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

Пример:

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

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

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

x=1
y=2
z=3

Язык C++

  1. Ответ на вопрос
    Ответ на вопрос дан nelle987
    Код написан ниже. 
    Пример ввода:
    4
    x100+12mamba+11=barry-3
    7x100-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;
    }
    1. Ответ на вопрос
      Ответ на вопрос дан nelle987
      Щас проверю)
    2. Ответ на вопрос
      Ответ на вопрос дан Аккаунт удален
      Хоть прога и не может выразить решение через свободную переменную, если придётся, всё равно шокирует, что прога рабочая - БЛАГОДАРЮ!!!
Не тот ответ на вопрос, который вам нужен?
Найди верный ответ
Самые новые вопросы
tegysigalpa2012
Русский язык - 6 лет назад

Помогите решить тест по русскому языку тест по русскому языку «местоимение. разряды местоимений» для 6 класса 1. укажите личное местоимение: 1) некто 2) вас 3) ни с кем 4) собой 2. укажите относительное местоимение: 1) кто-либо 2) некоторый 3) кто 4) нам 3. укажите вопросительное местоимение: 1) кем-нибудь 2) кем 3) себе 4) никакой 4. укажите определительное местоимение: 1) наш 2) который 3) некий 4) каждый 5. укажите возвратное местоимение: 1) свой 2) чей 3) сам 4) себя 6. найдите указательное местоимение: 1) твой 2) какой 3) тот 4) их 7. найдите притяжательное местоимение: 1) самый 2) моего 3) иной 4) ничей 8. укажите неопределённое местоимение: 1) весь 2) какой-нибудь 3) любой 4) этот 9. укажите вопросительное местоимение: 1) сколько 2) кое-что 3) она 4) нами 10. в каком варианте ответа выделенное слово является притяжательным местоимением? 1) увидел их 2) её нет дома 3) её тетрадь 4) их не спросили

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.