Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
lelik001
0 / 0 / 0
Регистрация: 02.11.2016
Сообщений: 21
1

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

19.11.2016, 22:43. Просмотров 924. Ответов 10
Метки нет (Все метки)

мне дана задача: В каждом столбце двумерного массива поменять местами первый отрицательный элемент и последний нулевой. Я написала код, но он не хочет рабоать, я не понимаю почему, найдите пожалуйста ошибку.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#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;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2016, 22:43
Ответы с готовыми решениями:

Найти первый отрицательный элемент в каждой строке матрицы и последний четный элемент в каждом столбце
Дан двумерный массив двухбайтовых знаковых целочисленных элементов 5*8....

Как поменять местами последний нулевой элемент и первый максимальный элементы?
Как поменять местами последний нулевой элемент и первый максимальный элементы?

Поменять местами первый отрицательный и последний положительный
Поменять местами первый отрицательный и последний положительный элементы...

В массиве поменять местами 2 элемента: первый положительный и последний отрицательный
Помогите пожалуйста написать: В заданном одномерном массиве целого типа...

В каждом слове поменять местами первый и последний символы
Доброй ночи. Помогите с программой, заранее спасибо. Дана строка символов до...

10
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
19.11.2016, 23:12 2
Лучший ответ Сообщение было отмечено lelik001 как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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
lelik001
0 / 0 / 0
Регистрация: 02.11.2016
Сообщений: 21
20.11.2016, 16:58  [ТС] 3
большое спасибо!

Добавлено через 17 часов 27 минут
LFC, Здравствуйте, вы мне вчера написали код, еще раз спасибо за него, щас начала разбираться в нем, и не могу понять для чего служат first_neg, last_zero, temp?, объясните пожалуйста.
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
20.11.2016, 17:08 4
first_neg,как не трудно догадаться из названия,получает и хранит индекс первого отрицательного элемента, last_zero - аналогично, это индекс последнего нулевого. temp-переменная для временного хранения значения переменной A[first_neg][j] во время перестановки местами первого отрицательного и последнего нулевого
0
deepz
62 / 62 / 53
Регистрация: 04.10.2013
Сообщений: 263
20.11.2016, 17:08 5
Цитата Сообщение от lelik001 Посмотреть сообщение
Здравствуйте, вы мне вчера написали код, еще раз спасибо за него, щас начала разбираться в нем, и не могу понять для чего служат first_neg, last_zero, temp?, объясните пожалуйста.
first_neg - служит для того чтобы запомнить индекс в массиве
к примеру есть массив
1 -4 2 5 и у массивов нумерация идет с 0 следовательно
индекс у числа -4, равен 1
last_zer аналогично только для нуля
temp служит как временная переменная. С помощью которой, меняются местами первое отрицательное число и последний ноль
0
lelik001
0 / 0 / 0
Регистрация: 02.11.2016
Сообщений: 21
20.11.2016, 17:19  [ТС] 6
Добавлено через 9 минут
LFC, так поняла, спасибо, и последний вопрос, для чего в for пишите вот это last_zero = -1, flag = 0;, а в if пишите !flag?
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
20.11.2016, 17:25 7
Цитата Сообщение от lelik001 Посмотреть сообщение
для чего в for пишите вот это last_zero = -1, flag = 0;
это чтобы если в столбце нету нуля например,то и перестановка не совершится
if(!flag) это тоже самое if(flag == 0)
0
lelik001
0 / 0 / 0
Регистрация: 02.11.2016
Сообщений: 21
20.11.2016, 17:30  [ТС] 8
LFC, все я поняла, еще раз спасибо!
0
deepz
62 / 62 / 53
Регистрация: 04.10.2013
Сообщений: 263
20.11.2016, 17:34 9
Цитата Сообщение от lelik001 Посмотреть сообщение
last_zero = -1, flag = 0;, а в if пишите !flag?
last_zero это индекс, а по скольку индексы положительные от 0 и до ...
Если мы бы указали ему значение 0, а в нашем массиве ( 1 2 3 4 5) не оказалось бы отрицательного числа, то в результате last_zero был бы равен 0, и как результат не верный ответ в конце программы
flag = 0; здесь как булевская переменная false
когда мы в if-е пишем flag с "!". Восклицательный знак как отрицание т.е. Не(false) это true (вообще называется унарная операция вроде), а тело if выполняется, когда внутри условия true
C
1
2
3
4
5
if(!flag){
                if(A[i][j] < 0){//здесь проверка на отрицательное число, если оно таковым является, то 
                    first_neg = i;//индекс этого числа в массиве
                    flag = 1;// и меняем flag на то, что мы нашли такое отрицательное число и ставим 1 т.е true
                }
В следующей итерации, в условии if(!flag), !flag = !1 = false, и как я говорил if выполняется только тогда, когда в условии true,
надеюсь смог донести...
блин, опоздал
0
lelik001
0 / 0 / 0
Регистрация: 02.11.2016
Сообщений: 21
20.11.2016, 23:16  [ТС] 10
deepz, Спасибо за подробные разъяснения!

Добавлено через 1 час 1 минуту
deepz, извините, но не могли бы еще раз пояснить про last_zero, я не могу понять для чего присваеваем именно -1, что это дает?
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
21.11.2016, 07:19 11
Цитата Сообщение от lelik001 Посмотреть сообщение
для чего присваеваем именно -1, что это дает?
если строки 21-22 не выполнены(т.е. в этом столбце нуль не встретился) то переменная last_zero продолжает хранить в себе значение -1,которое гарантированно не является ни одним из индексов массива(ибо индексы только от 0 и выше).Поэтому далее, в строке 24, при проверке last_zero >= 0, это условие не выполняется,а значит и перестановки в строках 25-27 не выполняются. Не было нуля в столбце - нет и перестановок. Занавес.
0
21.11.2016, 07:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2016, 07:19

Поменять местами первый и последний элемент в стеке
Как поменять местами первый и последний элемент в стеке, используя только push...

Поменять местами первый и последний элемент массива
Здравствуйте!! В одномерном массиве поменять местами i и j элементы,...

В каждом столбце матрицы найти последний положительный элемент
Тут находит отрицательный,как сделать что находило последний положительный? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru