Осталось 15 минут, помогите с лабой. Матрицы на Си

Задана матрица A целых чисел размера N M (N, M не превышают 20, задаются как параметры). Преобразовать ее в матрицу B путем удаления столбца этой матрицы с максимальным номером, в котором все элементы больше 1 и упорядочены по возрастанию.

Если такого столбца не найдется, программа должна выдать соответствующее сообщение. На печать следует вывести как исходную, так и результирующую матрицу. Матрицы в программе должно быть две. Исходня матрица должна остаться не измененной.

В программе должна быть предусмотренна проверка на правильность ввода параметра N и M. В случае не правильного ввода необходимо выдать "Error" и завершить работу программы

вот мой код.

#include <stdio.h>
#define N 20
#define M 20

int main()
{
    int arr[N][M],n,m,x,del;

    int a = scanf("%d", &n);
    if(a==0){
        printf("Error");
        return -1;
    
    a = scanf("%d", &m);
    if(a==0){
        printf("Error");
        return -1;
    } 

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            scanf("%d", &x);
            arr[i][j] = x;
        }
    }
    

    int flag = 0;
    for(int i=m-1; -1<i; i--)
    {
        for(int j=0; j<n; j++)
        {
            if(arr[j][i] > 1)
            {   if(j+1!=n+1)
                {
                if(arr[j][i] < arr[j+1][i])
                {
                    flag = 1;
                }
                else flag = 0;
                }
            }
            else{
                flag = 0;
            } 

            //printf("%d ", arr[j][i]);
        }
        if(flag == 1)
        {
            del = i;
            break;
        }
        //printf("\n");
    }
    if(flag == 0) printf("not found\n");
    printf("A:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    printf("B:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if(flag==1){
                if(j == del) continue;
            }
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

Ответы (1 шт):

Автор решения: Павел Ериков
  1. Если у вас a != 0, то у вас ничего не происходит т.к. у вас написано вот так:

    int a = scanf("%d", &n);
    if (a == 0) {
        printf("Error");
        return -1;
    
        //Тут дальше ваш код
    }
    

    А должно быть примерно вот так:

    int a = scanf("%d", &n);
    if (a == 0) {
        printf("Error");
        return -1;
    }else{
        //Тут дальше ваш код
    }
    

    Или же просто поставить скобку } после return -1; если без else делать

  2. В двойном цикле, внутренний цикл должен идти от 0 до n - 1. Чтобы не выходить за пределы матрицы при проверке if(arr[j][i] < arr[j + 1][i])

  3. Если элемент матрицы <= 1, то вам уже не подходит этот столбец. Так что мало просто flag = 0, после else. Нужно так же пропустить этот столбец при помощи break.

→ Ссылка