В каждом столбце матрицы поменять местами первый отрицательный элемент и последний нулевой - 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;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с I/O, генерацией случайных чисел и временем.
- Определяем размерность матрицы NxM.
- Инициализируем переменные для работы с матрицей и временной переменной.
- Инициализируем генератор случайных чисел начальным значением, используя текущее время.
- Заполняем матрицу случайными числами от -5 до 5.
- Перебираем строки матрицы, начиная с последней.
- Для каждой строки перебираем столбцы, начиная с первого.
- Если это первая отрицательная встреча, запоминаем индекс первого отрицательного элемента и флаг переключается.
- Если это первая встреча с нулевым элементом, запоминаем индекс последнего нулевого элемента.
- Если флаг переключился и последний нулевой элемент найден, меняем элементы местами.
- Выводим матрицу на экран.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.