Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // удаление строки и столбца в матрице
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- void SetAr(int* ar, int row, int col);
- void PrintAr(int* m, int row, int col);
- void RemoveRow(int r, int* ar, int row, int col, int* no_row_m);
- void RemoveCol(int c, int* ar, int row, int col, int* no_col_m);
- int main(void)
- {
- srand(time(NULL));
- int A[5][5], B[4][5];
- SetAr( (int*)A, 5, 5);
- RemoveRow(0, (int*) A, 5, 5, (int*)B );
- PrintAr((int*)A, 5, 5);
- printf("\n\n");
- PrintAr((int*)B, 4, 5);
- int C[4][4];
- RemoveCol(0, (int*)B, 4, 5, (int*)C);
- printf("\n\n");
- PrintAr((int*)C, 4, 4);
- getchar();
- return 0;
- }
- /*
- крч нахой, зашёл я как-то на #stackoverflow узнать как полегче передавать массивы в функцию
- 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
- * - скопировал из ответа код и всё заработало
- в чом цимес:
- теперь матрицу передаём в массив как одномерный массив,
- но перед этим выполняем преобразование типов
- то есть
- int Matrix[a][b]; // объявление матрицы
- func( (int*)Matrix ); // вызов какой-то функции одного аргумента
- здесь (int*) - приводит к типу одномернго массива нашу матрицу Matrix
- то же самое как мы обычно делаем при делении, чтобы получить вещественно число
- int x = 2;
- int y = 3;
- double = (double)x/y;
- здесь (double)x преобразует x к вещественному числу
- чтобы в ответе получить тоже вещественно число
- Теперь вот что интересно
- в функцию мы передали одномерный(теперь уже массив)
- Но как нам простым русским программистам извлечь из этого массива элемент находящийся
- в i-ой строке и j-ом столбце
- Не забываем что массив передаётся в функцию как указатель на его первый элемент
- то есть записи
- *ar
- ar[0]
- эквивалентны
- и ,например, чтобы извлечь i-ый элемент из ОДНОМЕРНОГО массива можно
- написать так и так:
- *(ar + i)
- ar[i] где 0 <= i < SIZE(размера массива)
- В МНОГОМЕРНЫХ массивах(ПРЕОБРАЗОВАННЫХ В ОДНОМЕРНЫЙ - наш вариант) почти тоже самое,
- только добавляется переход
- то есть
- a[i][j] // здесь не будет работать
- *(a + i*COLS + j)
- a[i*COLS + j]
- COLS - число столбцов в массиве
- чтобы перейти на нужную сточку надо число столбцов цмножить на номер i-сроки
- 0<= i < ROWS(число строк)
- и потом прибавляем индекс нужного нам j-ого столбца
- Для простоты представьте, что двумерный массив мы как бы вытянули в одну линию,
- можно сказать создали одномерный массив, сложив все строки двумерного
- и теперь у нас всего в нём ROWS*COLS - элементов
- то есть
- пусть k - счётчик этого одномерно массива
- тогда чтобы перебрать все его элементы, можно
- for(k=0; k < ROWS*COLS; k++){//шо то делаем}
- */
- // первый параметр - это номер строки которую надо удалить
- void RemoveRow(int r, int* ar, int row, int col, int* no_row_m)
- {
- int i, j, count_row=0;
- for ( i = 0; i < row; i++)
- {
- if (i == r)
- {
- continue;
- }
- else
- {
- for (j = 0; j < col; j++)
- {
- *(no_row_m + count_row*col + j) = *(ar + i*col + j);
- }
- count_row++;
- }
- }
- }
- // первый параметр - это номер столбца который надо удалить
- void RemoveCol(int c, int* ar, int row, int col, int* no_col_m)
- {
- int i, j, count_col=0;
- for ( j = 0; j < col; j++)
- {
- if (j == c)
- {
- continue;
- }
- else
- {
- for (i = 0; i < row; i++)
- {
- *(no_col_m + i*(col-1) + count_col) = *(ar + i*col + j);
- }
- count_col++;
- }
- }
- }
- // функция заполняет переданный ей массив(общая для всех матриц)
- void SetAr(int* ar, int row, int col)
- {
- int i, j;
- // srand (time(NULL)); // не знаю почему но если выполнять эту функцию здесь,
- // то матрицы повторяются
- // но это легко обходится если выполнять её в начале функции "main"
- for ( i = 0; i < row; i++)
- {
- for (j = 0; j < col; j++)
- // ar[i][j] - здесь не будет работать
- *(ar + col*i + j) = 1 + ( rand() % 4);
- }
- }
- // печатаем массив
- void PrintAr(int* m, int row, int col) {
- for(int i=0; i<row; i++){
- for(int j =0; j<col; j++)
- {
- printf("%5d", *(m + col*i + j)); // то же самое что и в предыдущей функции
- }
- printf("\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement