Advertisement
strCarne

Untitled

May 9th, 2023
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.13 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #define MATRIX "MATRIX "
  6. #define a "A"
  7. #define b "B"
  8. #define c "C"
  9. #define newLine "\n"
  10. #define EnterLines "Enter the number of lines: "
  11. #define EnterRows "Enter the number of rows: "
  12. #define SizeB std::cout << MATRIX << b << newLine << EnterLines;
  13.  
  14. // total - количество выделенной памяти в байтах
  15. // mallocs - сколько раз была выделена память
  16. // frees - сколько раз была освобождена память
  17. int total = 0;
  18. int mallocs = 0;
  19. int frees = 0;
  20.  
  21. // Макросы для подсчетов total, malloc и frees
  22. #define  malloc(s) (mallocs++, total += (s), malloc((s)))
  23. #define  free(s)   (frees++, free((s)))
  24.  
  25. // Проверка: является ли ввод пользователя
  26. // числом с плавающей точкой
  27. bool IsValidInput(const std::string& num){
  28.     int i = 0;
  29.     int dotCounter  =0;
  30.     while (num[i] != '\0') {
  31.         if (num[i] == '.' && dotCounter <= 1) {
  32.             dotCounter++;
  33.         } else if (!std::isdigit(num[i]) || dotCounter > 1) {
  34.             return false;
  35.         }
  36.         i++;
  37.     }
  38.     return true;
  39. }
  40.  
  41.  
  42. // Функция CreateMatrix создает матрицу, то есть
  43. // выделяет под нее память и заполняет ее значениями,
  44. // которые вводит пользователь
  45. float** CreateMatrix(std::string matrixName, int *linesNum, int *rowsNum) {
  46.     float** X = (float**)malloc(*linesNum * sizeof(float*));
  47.     for (int i = 0; i < *linesNum; i++)
  48.     {
  49.         X[i] = (float*)malloc(*rowsNum * sizeof(float));
  50.         for (int j = 0; j < *rowsNum; j++) {
  51.             std::cout << matrixName << "[" << i + 1 << "][" << j + 1 << "] = ";
  52.             std::string num;
  53.             std::cin >> num;
  54.             while(!IsValidInput(num)){
  55.                 std::cout << "Enter the number please!\n";
  56.                 std::cin >> num;
  57.             }
  58.             X[i][j] = strtof(num.c_str(), nullptr);
  59.         }
  60.     }
  61.     return X;
  62. }
  63.  
  64. // Функция freeArr освобождает память, выделенную под массив
  65. void freeArr(float** X, int linesNum) {
  66.  
  67.     // Очистка памяти (цикл по строкам)
  68.     for (int i = 0; i < linesNum; i++)
  69.  
  70.         // освобождение памяти под строку
  71.         free(X[i]);  
  72.     // Освобождение память массива строк
  73.     free(X);
  74. }
  75.  
  76. // Функция checkMatrixCompatability проверяет: можно
  77. // ли перемножить две матрицы
  78. bool checkMatrixCompatibility(int rowsA, int linesB) {
  79.     return rowsA == linesB;
  80. }
  81.  
  82. // Функция Multiply выделяет память под матрицу
  83. // корректной размерности и записывает в нее
  84. // результат перемножения двух матриц
  85. float** Multiply(float** A, float** B, int linesA, int rowsA, int linesB, int rowsB) {
  86.     float** X = (float**)malloc(linesA * sizeof(float*));
  87.     for (int i = 0; i < linesA; i++) {
  88.         X[i] = (float*)malloc(rowsB * sizeof(float));
  89.         for (int j = 0; j < rowsB; j++) {
  90.             X[i][j] = 0;
  91.             for (int k = 0; k < rowsA; k++) {
  92.                 X[i][j] += A[i][k] * B[k][j];
  93.             }
  94.         }
  95.     }
  96.     return X;
  97. }
  98.  
  99. // Функция Show выводит матрицу на экран
  100. void Show(float** X, int lines, int rows) {
  101.     for (int i = 0; i < lines; i++) {
  102.         for (int j = 0; j < rows; j++) {
  103.             std::cout << X[i][j] << " ";
  104.         }
  105.         std::cout << std::endl;
  106.     }
  107. }
  108.  
  109. // Функция ShowStats выводит на экран
  110. // собранную статистику по total, mallos и frees
  111. void ShowStats() {
  112.     std::cout << "Total memory allocated: " << total << " bytes"<< std::endl;
  113.     std::cout << "Number of allocations: " << mallocs << std::endl;
  114.     std::cout << "Number of frees: " << frees << std::endl;
  115. }
  116.  
  117. int main() {
  118.     std::cout << "This app calculates A * B = C\n";
  119.  
  120.     // Creating the matrix A
  121.     float** A;
  122.     int linesNumA, rowsNumA;
  123.     std::cout << MATRIX << a << newLine << EnterLines;
  124.     std::cin >> linesNumA;
  125.     std::cout << EnterRows;
  126.     std::cin >> rowsNumA;
  127.     A = CreateMatrix(a, &linesNumA, &rowsNumA);
  128.  
  129.     std::cout << std::endl;
  130.  
  131.     // Creating the matrix B
  132.     float** B;
  133.     int linesNumB, rowsNumB;
  134.     SizeB
  135.     std::cin >> linesNumB;
  136.     std::cout << EnterRows;
  137.     std::cin >> rowsNumB;
  138.     B = CreateMatrix(b, &linesNumB, &rowsNumB);
  139.  
  140.     // Выводим матрицы A и B на экран
  141.     std::cout << std::endl << "Matrix A:\n";
  142.     Show(A, linesNumA, rowsNumA);
  143.     std::cout << std::endl << "Matrix B:\n";
  144.     Show(B, linesNumB, rowsNumB);
  145.  
  146.     // Перемножаем матрицы и выводим их на экран в
  147.     // в случае их совместимости
  148.     if (checkMatrixCompatibility(rowsNumA, linesNumB)) {
  149.         float** C;
  150.         int linesNumC = linesNumA, rowsNumC = rowsNumB;
  151.         C = Multiply(A, B, linesNumA, rowsNumA, linesNumB, rowsNumB);
  152.         std::cout << std::endl << "MATRIX C:\n";
  153.         Show(C, linesNumC, rowsNumC);
  154.         freeArr(C, linesNumC);
  155.     } else {
  156.         std::cout <<"Matrixes A and b are not compatible";
  157.     }
  158.     freeArr(A, linesNumA);
  159.     freeArr(B, linesNumB);
  160.  
  161.     std::cout << std::endl;
  162.     ShowStats();
  163.     return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement