Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define N 10
- double *el(int n, int i, int j, double *a) {
- return a + i * n + j;
- }
- int maxLine(int n, int i, int j, double *a) {
- double max = *el(n, i, j, a);
- int maxi = i;
- for (int k = i; k < n; k++)
- if (fabs(*el(n, k, j, a)) > fabs(max)) {
- max = *el(n, k, j, a);
- maxi = k;
- }
- if (max == 0.0)
- return -1;
- else
- return maxi;
- }
- void swapLines(int n, double *a, double *b, int l, int m) {
- for (int j = 0; j < n; j++) {
- double t = *el(n, l, j, a);
- *el(n, l, j, a) = *el(n, m, j, a);
- *el(n, m, j, a) = t;
- }
- double t = *(b + l);
- *(b + l) = *(b + m);
- *(b + m) = t;
- }
- int getData(double *a, double *b) {
- FILE *f;
- char fname[64];
- int n;
- while (1) {
- printf("filename = "); scanf("%s", fname);
- if ((f = fopen(fname, "r")) != NULL)
- break;
- else
- printf("Ошибка открытия файла %s!\n", fname);
- }
- int r = fscanf(f, "%d", &n);
- if (!r || n < 1 || n > N) {
- printf("Неверное число уравнений для решения!\n");
- return 0;
- }
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++)
- if (!fscanf(f, "%lf", el(n, i, j, a))) {
- printf("Неверно заданный коэффициент (%d,%d)!\n", i + 1, j + 1);
- return 0;
- }
- if (!fscanf(f, "%lf", b + i)) {
- printf("Неверно задано значение уравнения (%d)!\n", i + 1);
- return 0;
- }
- }
- fclose(f);
- return n;
- }
- void printData(int n, double *a, double *b) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++)
- printf("%+-8.4lf\t", *el(n, i, j, a));
- printf("|\t%+-8.4lf\n", *(b + i));
- }
- }
- int linsys(int n, double *a, double *b, double *x) {
- for (int i = 0; i < n - 1; i++) { // for all lines excluding the last...
- int maxl = maxLine(n, i, i, a); // ...we find main item in column and then...
- if (maxl == -1)
- return 0;
- if (maxl > *el(n, i, i, a))
- swapLines(n, a, b, i, maxl);
- for (int k = i + 1; k < n; k++) { // ...we will set all items from current column to zero excluding current line
- double coeff = -(*el(n, k, i, a)) / *el(n, i, i, a);
- for (int l = i; l < n; l++)
- *el(n, k, l, a) += *el(n, i, l, a) * coeff;
- *(b + k) += *(b + i) * coeff;
- }
- }
- if (*el(n, n - 1, n - 1, a) == 0.0)
- return 0;
- *(x + n - 1) = *(b + n - 1) / *el(n, n - 1, n - 1, a);
- for (int i = n - 2; i >= 0; i--) {
- double y = 0.0;
- for (int j = i + 1; j < n; j++)
- y += *el(n, i, j, a) * *(x + j);
- *(x + i) = (*(b + i) - y) / *el(n, i, i, a);
- }
- return 1;
- }
- int main(int argc, char *argv[]) {
- double a[N*N], b[N], x[N];
- int n;
- if ((n = getData(a, b)) == 0) return 1;
- if (linsys(n, a, b, x))
- for (int i = 0; i < n; i++)
- printf("x%d = %+.16e\n", i + 1, *(x + i));
- else
- printf("Система линейных уравнений вырождена\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment