shadeyourself

matrix rang for one- and twodimensional array

May 14th, 2020
1,426
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.38 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #define EPS 1e-6
  6.  
  7. struct data {
  8.     int lines, columns;
  9. };
  10.  
  11. int fillStruct(const char *filename, struct data* size);
  12.  
  13. int fillArray(const char* filename, struct data size, double* matr, double ** matrix);
  14. void printArray(struct data size, double* matr, double ** matrix);
  15.  
  16. void swap(struct data size, double * matr, int firstLine, int secondLine);
  17. void swapix(struct data size, double** matrix, int firstLine, int secondLine);
  18.  
  19. void sumk(struct data size, double* matr, int firstLine, double k, int secondLine);
  20. void sumkix(struct data size, double** matrix, int firstLine, double k, int secondLine);
  21.  
  22. void getTriangle(struct data size, double* matr);
  23. void getTrianglix(struct data size, double** matrix);
  24.  
  25. int getRang(struct data size, double* matr);
  26. int getRangix(struct data size, double** matrix);
  27.  
  28. int main() {
  29.     struct data size;
  30.     double* matr;
  31.     double** matrix;
  32.     int temp;
  33.     //заполнение структуры
  34.     temp = fillStruct("C:\\Users\\m video\\Desktop\\work with\\data_dat.txt", &size);
  35.     if (temp == -1) {
  36.         printf("file open issue\n");
  37.         return -1;
  38.     }
  39.     if (temp == 1) {
  40.         printf("not enough numbers in first line of file to fill struct\n");
  41.         return -1;
  42.     }
  43.     if (size.lines == 1 || size.columns == 1) {
  44.         printf("rang = 1\nrangix = 1\n");
  45.         return 0;
  46.     }
  47.    
  48.     matr = (double*)malloc(sizeof(double) * size.lines * size.columns);
  49.     if (!matr) {
  50.         printf("malloc error\n");
  51.         return -1;
  52.     }
  53.     matrix = (double**)malloc(sizeof(double*) * size.lines);
  54.     if (!matrix) {
  55.         printf("malloc errorix\n");
  56.         free(matr);
  57.         return -1;
  58.     }
  59.     for (int i = 0; i < size.lines; i++) {
  60.         matrix[i] = (double*)malloc(sizeof(double) * size.columns);
  61.         if (!matrix[i]) {
  62.             printf("some malloc error\n");
  63.             for (int j = 0; j < i; j++)
  64.                 free(matrix[j]);
  65.             free(matrix);
  66.             free(matr);
  67.             return -1;
  68.         }
  69.     }
  70.     //заполнение матриц
  71.     temp = fillArray("C:\\Users\\m video\\Desktop\\work with\\data_dat.txt", size, matr, matrix);
  72.     if (temp == -1) {
  73.         printf("file open issue v2\n");
  74.         free(matr);
  75.         for (int i = 0; i < size.lines; i++)
  76.                 free(matrix[i]);
  77.         free(matrix);
  78.         return -1;
  79.     }
  80.     if (temp!=0) {
  81.         printf("wrong file data: one of two possible errors in line n %d\n1)size.lines > actual number of lines in file\n2)size.columns > actual number of columns in file\n", temp);
  82.         free(matr);
  83.         for (int i = 0; i < size.lines; i++)
  84.                 free(matrix[i]);
  85.         free(matrix);
  86.         return -1;
  87.     }
  88.     printArray(size, matr, matrix);
  89.     getTriangle(size, matr);
  90.     getTrianglix(size, matrix);
  91.     printArray(size, matr, matrix);
  92.     printf("rang = %d\nrangix = %d\n", getRang(size, matr), getRangix(size, matrix));
  93.     free(matr);
  94.     return 0;
  95. }
  96.  
  97. int fillStruct(const char *filename, struct data* size) {
  98.     FILE* f = fopen(filename, "r");
  99.     char line[100];
  100.     if (!f)
  101.         return -1;
  102.     fgets(line, 100, f);
  103.     if (sscanf(line, "%d %d", &size->lines, &size->columns) != 2)
  104.         return 1;
  105.     fclose(f);
  106.     return 0;
  107. }
  108.  
  109. int fillArray(const char* filename, struct data size, double* matr, double ** matrix) {
  110.     FILE* f = fopen(filename, "r");
  111.     double temp;
  112.     char litter[100];
  113.     if (!f)
  114.         return -1;
  115.     fgets(litter, 100, f);
  116.     for (int i = 0; i < size.lines; i++) {
  117.         for (int j = 0; j < size.columns; j++) {
  118.             if (fscanf(f, "%lf", &temp) != 1) {
  119.                 return i;
  120.             }
  121.             matr[i * size.columns + j] = temp;
  122.             matrix[i][j] = temp;
  123.         }
  124.     }
  125.     fclose(f);
  126.     return 0;
  127. }
  128. void printArray(struct data size, double* matr, double ** matrix) {
  129.     printf("matr:\n");
  130.     for (int i = 0; i < size.lines; i++) {
  131.         for (int j = 0; j < size.columns; j++)
  132.             printf("%lf ", matr[i * size.columns + j]);
  133.         printf("\n");
  134.     }
  135.     printf("matrix:\n");
  136.     for (int i = 0; i < size.lines; i++) {
  137.         for (int j = 0; j < size.columns; j++)
  138.             printf("%lf ", matrix[i][j]);
  139.         printf("\n");
  140.     }
  141. }
  142.  
  143. void swap(struct data size, double* matr, int firstLine, int secondLine) {
  144.     double temp;
  145.     for (int j = 0; j < size.columns; j++) {
  146.         temp = matr[firstLine * size.columns + j];
  147.         matr[firstLine * size.columns + j] = matr[secondLine * size.columns + j];
  148.         matr[secondLine * size.columns + j] = temp;
  149.     }
  150. }
  151. void swapix(struct data size, double** matrix, int firstLine, int secondLine) {
  152.     double temp;
  153.     for (int j = 0; j < size.columns; j++) {
  154.         temp = matrix[firstLine][j];
  155.         matrix[firstLine][j] = matrix[secondLine][j];
  156.         matrix[secondLine][j] = temp;
  157.     }
  158. }
  159.  
  160. void sumk(struct data size, double* matr, int firstLine, double k, int secondLine){
  161.     for (int j = 0; j < size.columns; j++)
  162.         matr[secondLine * size.columns + j] +=k * matr[firstLine * size.columns + j];
  163. }
  164. void sumkix(struct data size, double** matrix, int firstLine, double k, int secondLine) {
  165.     for (int j = 0; j < size.columns; j++)
  166.         matrix[secondLine][j] += k * matrix[firstLine][j];
  167. }
  168.  
  169. void getTriangle(struct data size, double* matr) {
  170.     int i, j, k = 0, l;
  171.     for (j = 0; j < size.columns; j++) {
  172.         for (i = k; i < size.lines; i++) {
  173.             if (fabs(matr[i * size.columns + j]) > EPS) {
  174.                 if (i == size.lines - 1) {
  175.                     swap(size, matr, k, i);
  176.                     k++;
  177.                     break;
  178.                 }
  179.                 for (l = i + 1; l < size.lines; l++)
  180.                     sumk(size, matr, i, -1 * matr[l * size.columns + j] / matr[i * size.columns + j], l);
  181.                 swap(size, matr, k, i);
  182.                 k++;
  183.                 break;
  184.             }
  185.         }
  186.     }
  187. }
  188. void getTrianglix(struct data size, double** matrix) {
  189.     int i, j, k = 0, l;
  190.     for (j = 0; j < size.columns; j++) {
  191.         for (i = k; i < size.lines; i++) {
  192.             if (fabs(matrix[i][j]) > EPS) {
  193.                 if (i == size.lines - 1) {
  194.                     swapix(size, matrix, k, i);
  195.                     k++;
  196.                     break;
  197.                 }
  198.                 for (l = i + 1; l < size.lines; l++)
  199.                     sumkix(size, matrix, i, -1 * matrix[l][j] / matrix[i][j], l);
  200.                 swapix(size, matrix, k, i);
  201.                 k++;
  202.                 break;
  203.             }
  204.         }
  205.     }
  206. }
  207.  
  208. int getRang(struct data size, double* matr) {
  209.     int result = 0;
  210.     int i, j, k = 0;
  211.     for (i = 0; i < size.lines; i++) {
  212.         for (j = k; j < size.columns; j++) {
  213.             if (fabs(matr[i * size.columns + j]) > EPS) {
  214.                 result++;
  215.                 break;
  216.             }
  217.         }
  218.         if (j == size.columns - 1) {
  219.             return result;
  220.         }
  221.         k = j+1;
  222.     }
  223.     return result;
  224. }
  225. int getRangix(struct data size, double** matrix) {
  226.     int result = 0;
  227.     int i, j, k = 0;
  228.     for (i = 0; i < size.lines; i++) {
  229.         for (j = k; j < size.columns; j++) {
  230.             if (fabs(matrix[i][j]) > EPS) {
  231.                 result++;
  232.                 break;
  233.             }
  234.         }
  235.         if (j == size.columns - 1)
  236.             return result;
  237.         k = j + 1;
  238.     }
  239.     return result;
  240. }
Advertisement
Add Comment
Please, Sign In to add comment