2016-12-01 12 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型の腹筋を持っている;' whileループの先頭に? – NathanOliver

+3

'using namespace std;'を取り除きます。この種のエラーは、名前空間が発明された理由です。あなたが 'std'を吹き飛ばすと、あなたが作成した問題に対処するためにあなた自身があなた自身になります。 –

+0

あなたは 'stdlib.h'と' cstdlib'の両方を含む必要はありません - それらは同じ機能を持っていますが、 'cstdlib'はそれらを' std'名前空間に持っています。詳細については、[この回答](http://stackoverflow.com/a/1374361/2449857)を参照してください。 –

答えて

1

あなたの代わりにstdlib.hcstdlib#include <cmath>は、それが動作する場合:

#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.

関連する問題