В каждом столбце матрицы поменять местами первый отрицательный элемент и последний нулевой - C (СИ)

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

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

мне дана задача: В каждом столбце двумерного массива поменять местами первый отрицательный элемент и последний нулевой. Я написала код, но он не хочет рабоать, я не понимаю почему, найдите пожалуйста ошибку.
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,x,y,q,d,f,g,h,z;      // i j - индексы массива mas[0][2]
printf("Vvedite zna4enie strok=");
scanf("%d",&x);
 while(x<=0)     // на случай, если пользователь введет отрицательное количество строк
    {
        printf("error, kol-vo elementov >0 ");
        scanf("%d", &x);
    }
printf("\nVvedite zna4enie stolbcov=");
scanf("%d",&y);
 while(y<=0)     // на случай, если пользователь введет отрицательное количество столбцов
    {
        printf("error, kol-vo elementov >0 ");
        scanf("%d", &y);
    }
int M[x][y];
for(i=0;i<x;i++)     //пока циклы выполняются, прога будет запрашивать значения элемента
{
for(j=0;j<y;j++)
{
printf("\nVvedite zna4enie elementa [%d][%d]=",i,j);
scanf("%d",&M[i][j]);
}
}
for (i=0,q=0;;i++);
{
    if (q=y)
    {
        break;
    }
    if(M[i][q]<0)
    {
        d=i;
        f=q;
        return 0;
    }
    if (M[i][q]==0)
    {
        g=i;
        h=q;
    }
    if(i==x-1)
    {
        z=M[d][f];
        M[d][f]=M[g][h];
        M[g][h]=z;
        i=0;
        q++;
    }
}
for(i=0;i<y;i++)   // пока циклы выполняются,  выводится на экран весь получившийся массив
{
for(j=0;j<x;j++)
{
printf("[%d][%d]=%d\n",i,j,M[i][j]);
}
}
return 0;
}

Решение задачи: «В каждом столбце матрицы поменять местами первый отрицательный элемент и последний нулевой»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 7
#define M 9
int main(void)
{
    int A[N][M], i, j, flag = 0, first_neg, last_zero, temp;
    srand(time(NULL));
    for(i = 0; i < N; i++, putchar('\n'))
        for(j = 0; j < M; j++)
            printf("%3d", A[i][j] = rand() % 10 - 5);
    for(j = 0; j < M; j++){
        for(i = 0, last_zero = -1, flag = 0; i < N; i++){
            if(!flag){
                if(A[i][j] < 0){
                    first_neg = i;
                    flag = 1;
                }
            }
            if(A[i][j] == 0)
                last_zero = i;
        }
        if(flag && last_zero >= 0){
            temp = A[first_neg][j];
            A[first_neg][j] = A[last_zero][j];
            A[last_zero][j] = temp;
        }
    }
    putchar('\n');
    for(i = 0; i < N; i++, putchar('\n'))
        for(j = 0; j < M; j++)
            printf("%3d", A[i][j]);
    return 0;
}

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

  1. Включаем необходимые заголовочные файлы для работы с I/O, генерацией случайных чисел и временем.
  2. Определяем размерность матрицы NxM.
  3. Инициализируем переменные для работы с матрицей и временной переменной.
  4. Инициализируем генератор случайных чисел начальным значением, используя текущее время.
  5. Заполняем матрицу случайными числами от -5 до 5.
  6. Перебираем строки матрицы, начиная с последней.
  7. Для каждой строки перебираем столбцы, начиная с первого.
  8. Если это первая отрицательная встреча, запоминаем индекс первого отрицательного элемента и флаг переключается.
  9. Если это первая встреча с нулевым элементом, запоминаем индекс последнего нулевого элемента.
  10. Если флаг переключился и последний нулевой элемент найден, меняем элементы местами.
  11. Выводим матрицу на экран.
  12. Возвращаем 0, чтобы указать, что программа успешно завершилась.

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


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

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

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