2016-12-01 86 views
0

最近我从事编程。在我的学校被告知编写一个程序来解决线性方程组Gauss方法,这就是我所做的,但是我错误“'abs'不能用作函数”,请告诉我如何解决。类型'abs'不能用作函数

#include <iostream> 
#include <stdlib.h> 
#include <cstdlib> 
using namespace std; 
// Вывод системы уравнений 
void sysout(double **a, double *y, int n) { 
    for (int i = 0; i < n; i++) { 
    for (int j = 0; j < n; j++){ 
     cout << a[i][j] << "*x" << j; 
     if (j < n - 1) { 
     cout << " + "; 
     } 
    } 
    cout << " = " << y[i] << endl; 
    } 
    return; 
} 
double * gauss(double **a, double *y, int n) { 
    double *x, max; 
    int k, index; 
    const double eps = 0.00001; // точность 
    x = new double[n]; 
    k = 0; 
    while (k < n) { 
    // Поиск строки с максимальным a[i][k] 
     int abs; 
    max = abs(a[k][k]); 
    index = k; 
    for (int i = k + 1; i < n; i++) { 
     if (abs(a[i][k]) > max) { 
     max = abs(a[i][k]); 
     index = i; 
     } 
    } 
    // Перестановка строк 
    if (max < eps) { 
    // нет ненулевых диагональных элементов 
     cout << "Решение получить невозможно из-за нулевого столбца " ; 
     cout << index << " матрицы A" << endl; 
     return 0; 
    } 
    for (int j = 0; j < n; j++) { 
     double temp = a[k][j]; 
     a[k][j] = a[index][j]; 
     a[index][j] = temp; 
    } 
    double temp = y[k]; 
    y[k] = y[index]; 
    y[index] = temp; 
    // Нормализация уравнений 
    for (int i = k; i < n; i++) { 
     double temp = a[i][k]; 
     if (abs(temp) < eps) continue; // для нулевого коэффициента пропустить 
     for (int j = 0; j < n; j++) { 
     a[i][j] = a[i][j]/temp; 
     } 
     y[i] = y[i]/temp; 
     if (i == k) continue; // уравнение не вычитать само из себя 
     for (int j = 0; j < n; j++) { 
     a[i][j] = a[i][j] - a[k][j]; 
     } 
     y[i] = y[i] - y[k]; 
    } 
    k++; 
    } 
    // обратная подстановка 
    for (k = n - 1; k >= 0; k--) { 
    x[k] = y[k]; 
    for (int i = 0; i < k; i++) { 
     y[i] = y[i] - a[i][k] * x[k]; 
    } 
    } 
    return x; 
} 
int main() { 
    double **a, *y, *x; 
    int n; 
    system("chcp 1251>nul"); 
    system("cls"); 
    cout << "Введите количество уравнений: "; 
    cin >> n; 
    a = new double*[n]; 
    y = new double[n]; 
    for (int i = 0; i < n; i++) { 
    a[i] = new double[n]; 
    for (int j = 0; j < n; j++) { 
     cout << "a[" << i << "][" << j << "]= "; 
     cin >> a[i][j]; 
    } 
    } 
    for (int i = 0; i < n; i++) { 
    cout << "y[" << i << "]= "; 
    cin >> y[i]; 
    } 
    sysout(a, y, n); 
    x = gauss(a, y, n); 
    for (int i = 0; i < n; i++){ 
    cout << "x[" << i << "]=" << x[i] << endl; 
    } 
    cin.get(); cin.get(); 
    return 0; 
} 

尝试将变量更改为“fabs”试图更改为“std :: abs”。编译器MiGW。

+4

你为什么有'INT ABS;'在while循环的开始? – NathanOliver

+3

摆脱'使用命名空间标准;'。这种错误是命名空间被发明的原因。如果你吹掉'std',你自己就可以处理你创建的问题。 –

+0

你不想同时包含'stdlib.h'和'cstdlib' - 它们具有相同的功能,但'cstdlib'将它们放在'std'命名空间中。请参阅[这个答案](http://stackoverflow.com/a/1374361/2449857)了解更多信息。 –

回答

1

如果#include <cmath>而不是stdlib.hcstdlib然后它的工作原理:

#include <iostream> 
#include <cmath> 
using namespace std; 

// Вывод системы уравнений 
void sysout(double **a, double *y, int n) { 
    ... 

你也应该在while环取出int abs;

我不知道为什么#include <cstdlib>应该在这里引起问题 - 任何人都可以解释吗?

Here's an online demo of the code compiling.

相关问题