NickAndNick

Матрица. Поиск и замена по колонкам

Dec 16th, 2012
101
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include <locale.h>
  6. #include <time.h>
  7.  
  8. #define LEFT -25
  9. #define RIGTH 75
  10.  
  11. int __cdecl random_matrix(int **, const size_t, const size_t, const int _left, int _rigth);
  12. void __cdecl show_matrix(int **, const size_t, const size_t);
  13. int __cdecl is_positive_column(int **, const size_t, const size_t);
  14. void __cdecl delete_matrix(int **, size_t);
  15. int ** __cdecl create_matrix(int **, const size_t, const size_t);
  16. void resign(int **, const size_t, const size_t);
  17.  
  18. int main() {
  19.     size_t rows, cols, index;
  20.     int is_positive = 0;
  21.     int ** matrix = NULL;
  22.  
  23.     setlocale(LC_CTYPE, "Russian_Russia.1251");
  24.     printf("Введите строки: ");
  25.     scanf_s("%i", &rows);
  26.     printf("Введите столбцы: ");
  27.     scanf_s("%i", &cols);
  28.  
  29.     srand((unsigned)time(NULL));
  30.     matrix = create_matrix(matrix, rows, cols);
  31.  
  32.     if (random_matrix(matrix, rows, cols, LEFT, RIGTH)) {
  33.         printf("Исходная матрица:\n");
  34.         show_matrix(matrix, rows, cols);
  35.  
  36.         for (index = 0; index < cols; index++) {
  37.             if (is_positive = is_positive_column(matrix, rows, index)) {
  38.                 if (index)
  39.                     resign(matrix, rows, index - 1);
  40.                 break;
  41.             }
  42.  
  43.             if (is_positive && !index) break;
  44.         }
  45.  
  46.         printf("Изменённая матрица:\n");
  47.         show_matrix(matrix, rows, cols);
  48.     }
  49.  
  50.     delete_matrix(matrix, rows);
  51.     _getch();
  52. }
  53. int random_matrix(int ** _matrix, const size_t _rows, const size_t _cols, const int _left, int _rigth) {
  54.     size_t row, col;
  55.  
  56.     if (_left >= _rigth) return 0;
  57.  
  58.     if (_left < 0 && _rigth >= 0) _rigth += abs(_left);
  59.     else if (_left < 0 && _rigth < 0) _rigth = abs(_left) - abs(_rigth);
  60.     else if (_left >= 0 && _rigth > 0) _rigth -= _left;
  61.  
  62.     for (row = 0; row < _rows; row++)
  63.         for (col = 0; col < _cols; col++)
  64.             _matrix[row][col] = rand() % _rigth + _left;
  65.  
  66.     return 1;
  67. }
  68.  
  69. void show_matrix(int ** _matrix, const size_t _rows, const size_t _cols) {
  70.     size_t row, col;
  71.  
  72.     if (_cols && _rows)
  73.         for (row = 0; row < _rows; row++, printf("\n"))
  74.             for (col = 0; col < _cols; col++)
  75.                 printf("%5i", _matrix[row][col]);
  76.     else printf("Нет данных для отображения!\n");
  77. }
  78.  
  79. int is_positive_column(int ** _matrix, const size_t _rows, const size_t _col_index) {
  80.     size_t row;
  81.  
  82.     for (row = 0; row < _rows; row++)
  83.         if (_matrix[row][_col_index] < 0)
  84.             return 0;
  85.     return 1;
  86. }
  87.  
  88. void resign(int ** _matrix, const size_t _rows, const size_t _col_index) {
  89.     size_t row;
  90.  
  91.     for (row = 0; row < _rows; row++)
  92.         _matrix[row][_col_index] *= -1;
  93. }
  94.  
  95. void delete_matrix(int ** _matrix, size_t _rows) {
  96.     size_t row;
  97.  
  98.     for (row = 0; row < _rows; row++)
  99.         free(_matrix[row]);
  100.     free(_matrix);
  101. }
  102.  
  103. int ** create_matrix(int ** _matrix, const size_t _rows, const size_t _cols) {
  104.     size_t row;
  105.     _matrix = (int **)calloc(_rows, sizeof(int *));
  106.  
  107.     for (row = 0; row < _rows; row++)
  108.         _matrix[row] = (int *)calloc(_cols, sizeof(int));
  109.  
  110.     return _matrix;
  111. }
RAW Paste Data