Advertisement
Guest User

Untitled

a guest
Oct 19th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.90 KB | None | 0 0
  1. // удаление строки и столбца в матрице
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. void SetAr(int* ar, int row, int col);
  7. void PrintAr(int* m, int row, int col);
  8. void RemoveRow(int r, int* ar, int row, int col, int* no_row_m);
  9. void RemoveCol(int c, int* ar, int row, int col, int* no_col_m);
  10.  
  11. int main(void)
  12. {
  13. srand(time(NULL));
  14.  
  15. int A[5][5], B[4][5];
  16.  
  17. SetAr( (int*)A, 5, 5);
  18. RemoveRow(0, (int*) A, 5, 5, (int*)B );
  19.  
  20. PrintAr((int*)A, 5, 5);
  21. printf("\n\n");
  22. PrintAr((int*)B, 4, 5);
  23.  
  24. int C[4][4];
  25. RemoveCol(0, (int*)B, 4, 5, (int*)C);
  26. printf("\n\n");
  27. PrintAr((int*)C, 4, 4);
  28.  
  29.  getchar();
  30.  return 0;
  31.  
  32. }
  33.  
  34. /*
  35. крч нахой, зашёл я как-то на #stackoverflow узнать как полегче передавать массивы в функцию
  36.     https://ru.stackoverflow.com/questions/191722/%d0%9f%d0%b5%d1%80%d0%b5%d0%b4%d0%b0%d1%87%d0%b0-%d0%bc%d0%b0%d1%81%d1%81%d0%b8%d0%b2%d0%b0-%d0%b2-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d1%8e/191741#191741
  37. * - скопировал из ответа код и всё заработало
  38. в чом цимес:
  39. теперь матрицу передаём в массив как одномерный массив,
  40. но перед этим выполняем преобразование типов
  41. то есть
  42. int Matrix[a][b]; // объявление матрицы
  43.  
  44. func( (int*)Matrix );  // вызов какой-то функции одного аргумента
  45.     здесь (int*) - приводит к типу одномернго массива нашу матрицу Matrix
  46.  
  47. то же самое как мы обычно делаем при делении, чтобы получить вещественно число
  48. int x = 2;
  49. int y = 3;
  50.  
  51. double = (double)x/y;
  52.     здесь (double)x преобразует x к вещественному числу
  53.     чтобы в ответе получить тоже вещественно число
  54.  
  55.     Теперь вот что интересно
  56. в функцию мы передали одномерный(теперь уже массив)
  57. Но как нам простым русским программистам извлечь из этого массива элемент находящийся
  58. в i-ой строке и j-ом столбце
  59.  
  60. Не забываем что массив передаётся в функцию как указатель на его первый элемент
  61. то есть записи
  62.         *ar
  63.         ar[0]
  64. эквивалентны
  65. и ,например, чтобы извлечь i-ый элемент из ОДНОМЕРНОГО массива можно
  66. написать так и так:
  67.         *(ar + i)
  68.         ar[i]           где   0 <= i < SIZE(размера массива)
  69.  
  70. В МНОГОМЕРНЫХ массивах(ПРЕОБРАЗОВАННЫХ В ОДНОМЕРНЫЙ - наш вариант) почти тоже самое,
  71. только добавляется переход
  72. то есть
  73.       a[i][j] // здесь не будет работать
  74.       *(a + i*COLS + j)
  75.       a[i*COLS + j]
  76.  
  77. COLS - число столбцов в массиве
  78. чтобы перейти на нужную сточку надо число столбцов цмножить на номер i-сроки
  79. 0<= i < ROWS(число строк)
  80. и потом прибавляем индекс нужного нам j-ого столбца
  81.  
  82. Для простоты представьте, что двумерный массив мы как бы вытянули в одну линию,
  83. можно сказать создали одномерный массив, сложив все строки двумерного
  84. и теперь у нас всего в нём ROWS*COLS - элементов
  85. то есть
  86. пусть k - счётчик этого одномерно массива
  87. тогда чтобы перебрать все его элементы, можно
  88. for(k=0; k < ROWS*COLS; k++){//шо то делаем}
  89.  
  90. */
  91.  
  92. // первый параметр - это номер строки которую надо удалить
  93. void RemoveRow(int r, int* ar, int row, int col, int* no_row_m)
  94. {
  95.   int i, j, count_row=0;
  96.   for ( i = 0; i < row; i++)
  97.   {
  98.     if (i == r)
  99.     {
  100.         continue;
  101.     }
  102.     else
  103.     {
  104.         for (j = 0; j < col; j++)
  105.         {
  106.             *(no_row_m + count_row*col + j) = *(ar + i*col + j);
  107.         }
  108.         count_row++;
  109.     }
  110.   }
  111. }
  112.  
  113. // первый параметр - это номер столбца который надо удалить
  114. void RemoveCol(int c, int* ar, int row, int col, int* no_col_m)
  115. {
  116.   int i, j, count_col=0;
  117.   for ( j = 0; j < col; j++)
  118.   {
  119.     if (j == c)
  120.     {
  121.         continue;
  122.     }
  123.     else
  124.     {
  125.         for (i = 0; i < row; i++)
  126.         {
  127.             *(no_col_m + i*(col-1) + count_col) = *(ar + i*col + j);
  128.         }
  129.         count_col++;
  130.     }
  131.   }
  132. }
  133.  
  134. // функция заполняет переданный ей массив(общая для всех матриц)
  135. void SetAr(int* ar, int row, int col)
  136. {
  137.   int i, j;
  138.   // srand (time(NULL)); // не знаю почему но если выполнять эту функцию здесь,
  139.   // то матрицы повторяются
  140.   // но это легко обходится если выполнять её в начале функции "main"
  141.  
  142.   for ( i = 0; i < row; i++)
  143.   {
  144.      for (j = 0; j < col; j++)
  145.          // ar[i][j] - здесь не будет работать
  146.          *(ar + col*i + j) = 1 + ( rand() % 4);
  147.   }
  148.  
  149. }
  150.  
  151. // печатаем массив
  152. void PrintAr(int* m, int row, int col) {
  153.     for(int i=0; i<row; i++){
  154.         for(int j =0; j<col; j++)
  155.         {
  156.             printf("%5d", *(m + col*i + j)); // то же самое что и в предыдущей функции
  157.         }
  158.         printf("\n");
  159.     }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement