Advertisement
kirya_shkolnik

eee

Feb 3rd, 2023 (edited)
906
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.72 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. /* Проверки на правильность ввода int и double */
  8. int myInput();
  9. double myInputDouble();
  10. void myInputPointer(int* a);
  11. int compareString(char* a, char* b);
  12. int isCharInt(char ch);
  13. int isMyInputCorrect(int res);
  14. int isMyInputDoubleCorrect(double res);
  15.  
  16.  /* Создание и ввод матриц */
  17. int** resmat(int m, int n);
  18. double **resmatDouble(int m, int n);
  19. int** input(int m, int n, int* matrixCorrect);
  20. double** inputDouble(int m, int n, int* matrixCorrect);
  21.  
  22.  /* Вывод матрицы */
  23. // void output(int** matrix, int m, int n);
  24.  void output(double** matrix, int m, int n) {
  25.     for (int i = 0; i < m; i++) {
  26.         for (int j = 0; j < n; j++) {
  27.             if (j == 0)
  28.                 printf("%lf", matrix[i][j]);
  29.             else
  30.                 printf(" %lf", matrix[i][j]);
  31.         }
  32.         if (i != m - 1) printf("\n");
  33.     }
  34. }
  35.  /* Определитель матрицы */
  36. double determinant(double** mat, int n);
  37.  
  38. int main() {
  39.   int n, i, j;
  40.    
  41.   n = myInput();
  42.   if ( isMyInputCorrect(n) && n > 0) {
  43.       int matrixCorrect = 1;
  44.       double** mat = inputDouble(n,n,&matrixCorrect);
  45.      
  46.       printf("%.6lf\n", determinant(mat, n));
  47.     //   output(mat,n,n);
  48.      
  49.       free(mat);
  50.      
  51.       return 0;
  52.   }
  53. }
  54.  
  55. double determinant(double** mat, int n) {
  56.   double det = 0;
  57.   int c, subi, i, j, subj;
  58.   double** submat;
  59.  
  60.   if (n == 2) {
  61.     return((mat[0][0] * mat[1][1]) - (mat[1][0] * mat[0][1]));
  62.   }
  63.   else {
  64.     submat = resmatDouble(n,n);
  65.  
  66.     for (c = 0; c < n; c++) {
  67.       subi = 0;
  68.       for (i = 1; i < n; i++) {
  69.         subj = 0;
  70.         for (j = 0; j < n; j++) {
  71.           if (j == c) {
  72.             continue;
  73.           }
  74.           submat[subi][subj] = mat[i][j];
  75.           subj++;
  76.         }
  77.         subi++;
  78.       }
  79.       det = det + (pow(-1, c) * mat[0][c] * determinant(submat, n - 1));
  80.     }
  81.  
  82.     free(submat);
  83.   }
  84.  
  85.   return det;
  86. }
  87.  
  88.  
  89. double **resmatDouble(int m, int n) {  // m -rows n -cols
  90.     double **mat = (double **)malloc(m * n * sizeof(double) + m * sizeof(double *));
  91.     double *ptr = (double *)(mat + m);
  92.     for (int i = 0; i < m; i++) mat[i] = ptr + n * i;
  93.     return mat;
  94. }
  95.  
  96. int** input(int m, int n, int* matrixCorrect) {  // m -rows n -cols
  97.     int** mat = (int**)malloc(m * n * sizeof(int) + m * sizeof(int*));
  98.     int* ptr = (int*)(mat + m);
  99.     int flag = 1;
  100.     int temp;
  101.     for (int i = 0; i < m; i++) mat[i] = ptr + n * i;
  102.     for (int i = 0; i < m; i++)
  103.         for (int j = 0; j < n; j++) {
  104.             if (flag) {
  105.                 temp = myInput();
  106.                 if (!isMyInputCorrect(temp)) {
  107.                     flag = 0;
  108.                     *matrixCorrect = 0;
  109.                 } else {
  110.                     mat[i][j] = temp;
  111.                 }
  112.             }
  113.         }
  114.     return mat;
  115. }
  116.  
  117. double** inputDouble(int m, int n, int* matrixCorrect) {  // m -rows n -cols
  118.     double** mat = (double**)malloc(m * n * sizeof(double) + m * sizeof(double*));
  119.     double* ptr = (double*)(mat + m);
  120.     int flag = 1;
  121.     int temp;
  122.     for (int i = 0; i < m; i++) mat[i] = ptr + n * i;
  123.     for (int i = 0; i < m; i++)
  124.         for (int j = 0; j < n; j++) {
  125.             if (flag) {
  126.                 // Сделать проверку на дабл
  127.                
  128.                 temp = myInputDouble();
  129.                 // temp = myInputDouble();
  130.                 if (!isMyInputDoubleCorrect(temp)) {
  131.                     flag = 0;
  132.                     *matrixCorrect = 0;
  133.                 } else {
  134.                     mat[i][j] = temp;
  135.                 }
  136.             }
  137.         }
  138.     return mat;
  139. }
  140.  
  141.  
  142.  
  143. /**************** Проверка на ввод инта **********
  144.  * Концепция:
  145.  *
  146.  * Попытка проверить на инты без сторонних библиотек
  147.  *
  148.  * Так, моя идея создать функцию myInput() и там проверять через строки
  149.  * Так как злые дяди и тети запретили мне использовать сторонние библиотеки
  150.  * и я не могу использовать strcmp() я создал свой strcmp()
  151.  * Более детальное объяснение снизу. Мы русские с нами бог...
  152.  *************************************************/
  153.  
  154. /*************************************************
  155.  * Функция myInput():
  156.  * Какую же гадость я написал...
  157.  *
  158.  * У нас есть две строки checker
  159.  * Изначально из консоли мы записываем в checker1
  160.  * Переносим это все в int a
  161.  * Потом int a преобразуем в строку и записываем в checker2
  162.  * И по сути если мы ввели не int то здесь строки будут разные
  163.  *
  164.  * Проверка на одинаковость строк через другую непонятную функцию
  165.  *************************************************/
  166. int myInput() {
  167.     int a;
  168.     char checker1[256], checker2[256];
  169.     if (1 != scanf("%s", checker1)) {
  170.         a = -2147483647;
  171.     } else {
  172.         sscanf(checker1, "%d", &a);
  173.         sprintf(checker2, "%d", a);
  174.         if (compareString(checker1, checker2) != 0) {
  175.             a = -2147483647;
  176.         }
  177.     }
  178.     return a;
  179. }
  180. double myInputDouble() {
  181.     double a, b;
  182.     char checker1[256], checker2[256];
  183.     if (1 != scanf("%lf", &a)) {
  184.         a = -2147483647;
  185.     } else {
  186.         sprintf(checker1, "%lf", a);
  187.         sscanf(checker1, "%lf", &b);
  188.         sprintf(checker2, "%lf", b);
  189.         if (compareString(checker1, checker2) != 0) {
  190.             a = -2147483647;
  191.         }
  192.     }
  193.     return a;
  194. }
  195.  
  196. /*************************************************
  197.  * Функция compareString():
  198.  * Какую же гадость я написал x2...
  199.  *
  200.  * Концепция что мы проверяем посимвольно и если вдруг какой-то
  201.  * символ другой возвращаем разницу этих символов по таблице ASCI
  202.  *************************************************/
  203. int compareString(char* a, char* b) {
  204.     while ((*a == *b) && (*a != 0)) {
  205.         // printf("%s. %d | ", a, *a);
  206.         // printf("%s. %d\n", b, *b);
  207.         a++;
  208.         b++;
  209.     }
  210.  
  211.     return *a - *b;
  212. }
  213.  
  214. /*************************************************
  215.  * Функция myInputPointer():
  216.  * Жизнь меня заставляет использовать указатель...
  217.  *
  218.  * Концепция один в один как myInput() только вместо return используем указатель
  219.  *************************************************/
  220.  
  221. void myInputPointer(int* a) {
  222.     char checker1[256], checker2[256];
  223.     if (1 != scanf("%s", checker1)) {
  224.         *a = -2147483647;
  225.     } else {
  226.         sscanf(checker1, "%d", a);
  227.         sprintf(checker2, "%d", *a);
  228.         if (compareString(checker1, checker2) != 0) {
  229.             *a = -2147483647;
  230.         }
  231.     }
  232. }
  233.  
  234. /*************************************************
  235.  * Функция isCharInt():
  236.  * Жизнь странная штука. Теперь я добавляю еще одну странную функцию...
  237.  *
  238.  * Смысл украден с myInput()
  239.  * Мы должны проверить является ли char числом [0-9]
  240.  * Получаем char ch, значение заносим в char[] checker1, потом переносим
  241.  * значение char[] checker1 в int a и потом в char[] checker2
  242.  * По итогу сравниваем checker1 и checker2
  243.  *
  244.  * Возвращаемые значения: целая положительная цифра [0-9] or -10 if error
  245.  *************************************************/
  246.  
  247. int isCharInt(char ch) {
  248.     int a, res = 1;
  249.     char checker1[256], checker2[256];
  250.     sprintf(checker1, "%c", ch);
  251.     sscanf(checker1, "%d", &a);
  252.     sprintf(checker2, "%d", a);
  253.     if (compareString(checker1, checker2) != 0) {
  254.         res = -10;
  255.     } else {
  256.         res = a;
  257.     }
  258.     return res;
  259. }
  260.  
  261. /*************************************************
  262.  * Я устал делать проверки поетому пусть он за меня делает
  263.  **************************************************/
  264. int isMyInputCorrect(int res) {
  265.     if (res != -2147483647) {
  266.         return 1;
  267.     } else {
  268.         return 0;
  269.     }
  270. }
  271. int isMyInputDoubleCorrect(double res) {
  272.     if (res != -2147483647) {
  273.         return 1;
  274.     } else {
  275.         return 0;
  276.     }
  277. }
  278.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement