Перед первым столбцом матрицы, содержащим только положительные элементы, вставить столбец из единиц - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дана матрица размера M × N. Перед первым столбцом, содержащим только положительные элементы, вставить столбец из единиц. Если требуемых столбцов нет, то вывести матрицу без изменений. Уже 5 часов не могу доделать программу, подскажите пожалуйста. Столбец с положительными элементами нахожу, а вставить столбец из единиц не могу. Пытался сделать через дополнительную матрицу, вот код:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
int main()
{
    setlocale(LC_CTYPE,"Russian");
    printf("Введите размер матрицы N = ");
    int N,M;
    srand(time(NULL));
    scanf("%d",&N);
    if(N<2){
        printf("В матрице должно быть минимум 2 строки!");
        return 0;
    }
    printf("Введите размер матрицы M = ");
    scanf("%d",&M);
    int arr[N][M];
    int i,j;
    ///Initialize
    printf("Ввести матрицу вручную или автоматически?\n1. Вручную\n2. Автоматически\n");
    int sw;
    scanf("%d",&sw);
    if(sw == 2){
        for(i=0;i<=N-1;i++){
            for(j=0;j<=M-1;j++){
                arr[i][j] = rand()/400-20;
            }
        }
    } else {
        printf("\nВведите элементы матрицы:\n");
        for(i=0;i<=N-1;i++){
            for(j=0;j<=M-1;j++){
                scanf("%d",&arr[i][j]);
            }
        }
    }
    printf("\nПервоначальная матрица:\n");
    ///M - строки N - столбцы
    ///Вывод первоначальной матрицы
    for(i=0;i<=N-1;i++){
        printf("\n");
        for(j=0;j<=M-1;j++){
            printf("%3d ",arr[i][j]);
        }
    }
    ///program
    ///-------------------поиск столбца с положительными членами------------------
    int current = 0,z=0,stl = -1;
    for(j=0;j<M;j++){
        for(i=0;i<N;i++){
            if(arr[i][j]>0 && current == j){
                z++;///Если строка одна и элемент больше нуля увеличиваем счётчик
                if(z == N){ ///z == N-1 если счётчик равен количеству элементов столбца
                    stl = j; ///Присваиваем номер столбца в котором все члены положительны
                    break;
                }
            }
            if(i == N-1){///если последняя итерация то увеличиваем строку на 1
                current++;
                z = 0;
            }
        }
    }
    printf("Положительные члены в %d столбце",stl);
    ///---------------нашли столбец и засунули в stl------------------------
    int siz = M+1;
    int narr[N][siz];
    int temp;
    int k = 1; ///Счётчик для сдвига матрицы
    if(stl != -1){
        printf("\nНовая матрица:\n");
        for(i=0;i<N;i++){
            for(j=0;j<siz;j++){
                narr[i][j] = 1; ///заполняем массив единицами
            }
        }
        j = 0;
        for(i=0;i<N;i++){
            for(j=0;j<siz;j++){
                if(j == stl){
                    narr[i][j] = arr[i][stl];
                    narr[i][j+1] = arr[i][stl];
                    ///j+=2;
                    continue;
                    ///narr[i][j] = arr[i][j]; ///заполняем массив таким же массивом кроме последнего столбца
                    ///printf("\n--------\n%d\n--------\n",narr[i][j+1]);
                }
            }
        }
 
        for(i=0;i<N;i++){
            for(j=0;j<siz;j++){
                /**if(j == stl && stl == 0){
                    temp = narr[i][j];
                    narr[i][j] = narr[N-1][siz-1];
                    narr[i][j+1] = temp;
                    continue;
                }
                if(j == stl){
                    temp = narr[i][j];
                    narr[i][j] = narr[N-1][siz-1];
                    narr[i][j+1] = temp;
                }
                */
            }
            k++;
        }
        for(i=0;i<N;i++){
            printf("\n");
            for(j=0;j<siz;j++){
                printf("%3d ",narr[i][j]);
            }
        }
    } else {
        for(i=0;i<=N-1;i++){
            printf("\n");
            for(j=0;j<=M-1;j++){
                printf("%3d ",arr[i][j]);
            }
        }
    }

    return 0;
}

Решение задачи: «Перед первым столбцом матрицы, содержащим только положительные элементы, вставить столбец из единиц»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define M  10
#define N  3
 
int matrix_insert(int mat[N][M], int m){
    int i, j, a, b;
    for(j = 0; j < m; ++j){
        i = 0; 
        while((i < N) && (mat[i][j] > 0))
            ++i;
 
        if(i == N){
            for(a = 0; a < N; ++a){
                for(b = m; b > j; --b)
                    mat[a][b] = mat[a][b - 1];
                mat[a][b] = 1;
            }
            ++m;
            ++j;
        }
    }
    return m;
}
 
int main(void){
    int i, j, m;
    int mat[N][M];
 
    m = M / 2;
    for(i = 0; i < N; ++i){
        for(j = 0; j < m; ++j)
            mat[i][j] = ((rand() % 10) < 7) ? (2 + rand() % 3) : -(2 + rand() % 3);
    }
 
    m = matrix_insert(mat, m);
    for(i = 0; i < N; ++i){
        for(j = 0; j < m; ++j)
            printf("% 2d ", mat[i][j]);
        putchar('\n');
    }
    return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы с массивами и вводом-выводом
  2. Объявление матрицы с фиксированным размером
  3. Определение функции, которая будет вставлять дополнительный столбец из единиц перед первым столбцом матрицы
  4. В функции main создается матрица случайных чисел
  5. Вызывается функция matrix_insert для вставки дополнительного столбца из единиц перед первым столбцом матрицы
  6. Выводится на экран полученная матрица

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы