В каждом столбце матрицы поменять местами первый отрицательный элемент и последний нулевой - 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, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д