C/C++

Помогите пожалуйста доделать задачу на языке СИ!!!

#include
#include
#include
#define n 3
#define m 5
int main()

{
setlocale(LC_ALL, "rus");
int mas[n][m], i, j, max, maxj;
for (i = 0; i < n; i++)
{
printf("Введите элементы %d строки\n", i + 1);
for (j = 0; j < m; j++)
scanf_s("%d", &mas[i][j]);
}
max = mas[0][0];
maxj = 0;
for (i = 0; i < n; i++)

for (j = 0; j < m; j++)

if (max < mas[i][j])
{
max = mas[i][j];
maxj = j;
}

for (j = maxj; j < m - 1; j++)
for (i = 0; i < n; i++)
mas[i][j] = mas[i][j + 1];

_getch();
}

У этой задачи условие : Составьте программу удаления столбца, содержащего максимальный элемент матрицы A (N, N).
А нужно: Составьте программу удаления строки и столбца, содержащего максимальный элемент матрицы A (N, N).
++**++ ...
++**++ ...
3
   Делайте проще!

http://all-ht.ru/inf/prog/c/func/memmove.html   —    описание функции memmove().

   У функции memmove() всего 3 параметра: указатель на цель, указатель на источник, количество переносимых байт.

   Пусть у Вас массив int mas[n][m], нужно удалить столбец col (0 ≤ col < m). Лучше всего объявить указатель int * pm = mas + col.

int mbs = (m - col - 1) * sizeof(int);   // mbs — число байт справа от столбца col в любой строке матрицы
for (i = 0; i < n; ++i) {
memmove(pm, pm + 1, mbs);  // перенос части строки матрицы справа от позиции col и до конца строки на один элемент влево
pm += m;  // перестановка указателя на целую строку вперёд
}

   Ещё проще удалить целую строку матрицы. Пусть у Вас тот же массив, нужно удалить строку row (0 ≤ row < n). Вот как это делается:

int * pm = mas + m * row;
memmove(pm, pm + m, sizeof(int) * m * (n - 1 - row));

   Адрес mas + m * row указывает на начало строки row.
   sizeof(int) * m * (n - 1 - row)   —  число байт занимаемых частью матрицы ниже строки row до конца матрицы.
Asylzat .
Asylzat .
16 172
Лучший ответ
Asylzat . Не забывайте про #include <string.h>
Asylzat . А если нужно удалить и строку и столбец, то сначала удалите целую строку, а потом не забудьте уменьшить число строк в переменной n. После этого удаляйте столбец.

И не забудьте уменьшить длину строки m.
Asylzat . Даже в случае квадратной матрицы сто́ит использовать две разные переменные для ширины и высоты матрицы.
Asylzat . А сквозной поиск максимума в двумерном массиве лучше производить с помощью двух указателей, это позволит перемещаться по матрице как по одномерной цепочке данных.

int * maxPtr = mas;
int * scnPtr = mas + 1;
for (i = 1; i < n * m; ++i, scnPtr++) if ((*maxPtr) < (*scnPtr)) maxPtr = scnPtr;
int Offs = maxPtr - mas;

/* Offs / m — строка, Offs % m — столбец */
Asylzat . | 0 | 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 | 9 |
|10|11|12|13|14|
|15|16|17|18|19|
|20|21|22|23|24|
Вот ссылка на вырезку из библиотеки с матрицами. Тим пара методов для работы с ними.
Она не ограничивается типом или размерами и выполнена на чистом Си.
Так же есть и main с примером использования (Минор - этом матрица без i сроки и j столбца, как тебе и нужно).
https://pastebin.com/gK3qVaPi
Евгений Михайлов U.D.P
Библиотеку писал сам, в основном для себя, и это начальная версия. просьба не кидаться помидорами из-за кривого кода. Гуру сишников приветствую в помощи по исправлению го.. нокода)