Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
1

Проверка чисел двумерного динамического массива на упорядоченность

20.11.2017, 14:43. Показов 1604. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Писал программу (из заголовка), вроде все в порядке, по логике должно работать, но не хочет. Помогите разобраться в чем проблема. Код:


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
#include "stdafx.h"
#include <cstdlib>
#include <locale.h>
 
void Check(int n, int m, int A[]) {
    int i = 0, j;
    int flag=1;
    printf("Номера столбцов с упорядоченными элементами: \n");
    for (j = 0; j < m; j++) {
        i = 0;
        do {
            if (A[i*m + j] <= A[(i + 1)*m + j]) {
                i++;
                flag = 1;
            }
            else {
                flag = 0;
            }
        } while ((i != n - 1)||(flag!=0));
        if (flag == 1) {
            printf("%d\n", j);
        }
    }
}
 
int main()
{
    setlocale(LC_ALL, "RUS");
    int i, j, n;
    int *A;
    printf("Введите размер массива NxN: ");
    scanf_s("%d", &n);
    int m = n;
    A = (int*)malloc(n * m * sizeof(int));
    for (j = 0; j < m; j++) {
        for (i = 0; i < n; i++) {
            printf("A[%d][%d] = ", j,i);
            scanf_s("%d", &A[i*m + j]);
        }
        printf("\n");
    }
    Check(n, m, A);
    free(A);
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2017, 14:43
Ответы с готовыми решениями:

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

Рекурсивная проверка массива на упорядоченность его элементов
Добрый вечер, уважаемые! Второй день сижу над задачей и ничего в голову не приходит : Написать...

Заполнение двумерного динамического массива
Здравствуйте. Задача такова: нужно ввести с клавиатуры размерность двух динамических массивов...

Создание двумерного динамического массива
Доброго времени суток. Нужно создать двумерный динамический массив (не используя указатели): ...

10
1252 / 863 / 266
Регистрация: 02.04.2009
Сообщений: 3,280
20.11.2017, 18:34 2
Цитата Сообщение от CyberGlitch Посмотреть сообщение
должно работать, но не хочет.
Что конкретно не работает?
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
21.11.2017, 13:35  [ТС] 3
Цитата Сообщение от Kukstyler Посмотреть сообщение
Что конкретно не работает?
Программа должна проверять упорядочен ли столбец двумерного динамического массива размером NxN по возрастанию. Упорядоченные столбцы необходимо вывести на экран
0
1252 / 863 / 266
Регистрация: 02.04.2009
Сообщений: 3,280
21.11.2017, 15:52 4
Лучший ответ Сообщение было отмечено CyberGlitch как решение

Решение

CyberGlitch, ну, то что сразу вижу, это инкремент i только в if:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Check(int n, int m, int A[]) {
    int i = 0, j;
    int flag=1;
    printf("Номера столбцов с упорядоченными элементами: \n");
    for (j = 0; j < m; j++) {
        i = 0;
        do {
            if (A[i*m + j] <= A[(i + 1)*m + j]) {
                i++;  // <---------------------------------------------
                flag = 1;
            }
            else {
                flag = 0;
            }
        } while ((i != n - 1)||(flag!=0));
        if (flag == 1) {
            printf("%d\n", j);
        }
    }
}
Сделайте так, и посмотрите что там вообще с адресами происходит:
C
1
2
3
4
5
6
7
8
9
10
11
        do {
            printf("j=%d  A1=%d  A2=%d ADRESA: A1=%d  A2=%d \n", j, A[i*m + j], A[(i + 1)*m + j]
                 &A[i*m + j], &A[(i + 1)*m + j]   );
 
            if (A[i*m + j] <= A[(i + 1)*m + j]) {
                flag = 1;
            }
            else {
                flag = 0;
            }
            i++;  // <-------------------------------
1
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
22.11.2017, 11:10  [ТС] 5
Цитата Сообщение от Kukstyler Посмотреть сообщение
Сделайте так, и посмотрите что там вообще с адресами происходит:
C
1
2
3
4
5
6
7
8
9
10
11
        do {
            printf("j=%d  A1=%d  A2=%d ADRESA: A1=%d  A2=%d \n", j, A[i*m + j], A[(i + 1)*m + j]
                 &A[i*m + j], &A[(i + 1)*m + j]   );
 
            if (A[i*m + j] <= A[(i + 1)*m + j]) {
                flag = 1;
            }
            else {
                flag = 0;
            }
            i++;  // <-------------------------------
Помогло. Прога заработала, осталось понять как она это делает ибо по логике не должна )
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
#include "stdafx.h"
#include <cstdlib>
#include <locale.h>
 
void Check(int m, int *A) {
    int i, j;
    int flag;
    printf("Номера столбцов с упорядоченными элементами: \n");
    for (j = 0; j < m; j++) {
        i = 0;
        flag = 1;
        do {
            if (*(A+i*m + j) <= *(A+(i + 1)*m + j)) {
                i++;
            }
            else {
                flag = 0;
                break;
            }
        } while (flag != 1);
        if (flag == 1) {
            printf("%d\n", j);
        }
    }
}
 
int main()
{
    setlocale(LC_ALL, "RUS");
    int i, j, n;
    int *A;
    printf("Введите размер массива NxN: ");
    scanf_s("%d", &n);
    int m = n;
    A = (int*)malloc(n * m * sizeof(int));
    for (j = 0; j < m; j++) {
        for (i = 0; i < n; i++) {
            printf("\tA[%d][%d] = ", j, i);
            scanf_s("%d", (A + i*m + j));
        }
        printf("\n");
    }
    Check(m, A);
 
    free(A);
    return 0;
}
0
1252 / 863 / 266
Регистрация: 02.04.2009
Сообщений: 3,280
22.11.2017, 11:17 6
CyberGlitch, лучшее средство - пошаговый debug.
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
22.11.2017, 11:19  [ТС] 7
Цитата Сообщение от Kukstyler Посмотреть сообщение
CyberGlitch, лучшее средство - пошаговый debug.
Это как ?
0
1252 / 863 / 266
Регистрация: 02.04.2009
Сообщений: 3,280
22.11.2017, 11:21 8
CyberGlitch, запустите в своей IDE отладчик (debugger), можно пошагово пройтись по программе, т.е. по каждой сточке/команде и смотреть промежуточные результаты.
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
22.11.2017, 11:24  [ТС] 9
Цитата Сообщение от Kukstyler Посмотреть сообщение
CyberGlitch, запустите в своей IDE отладчик (debugger), можно пошагово пройтись по программе, т.е. по каждой сточке/команде и смотреть промежуточные результаты.
Как это сделать в Visual Studio 15?
0
1252 / 863 / 266
Регистрация: 02.04.2009
Сообщений: 3,280
22.11.2017, 11:25 10
CyberGlitch, https://msdn.microsoft.com/ru-... 0d9d3.aspx
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
22.11.2017, 11:27  [ТС] 11
Спасибо!
0
22.11.2017, 11:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2017, 11:27
Помогаю со студенческими работами здесь

Задание двумерного динамического массива
a=(int**)malloc(n*sizeof(int*)); for(int i=0;i&lt;n;i++) a=(int*)malloc(m*sizeof(int)); ...

Сортировка области динамического двумерного массива
Добрый день. Сортирую двумерный динамический массив пузырьком от минимума к макс и обнуляю...

Создание двумерного динамического массива в функции
Здравствуйте. Помогите мне пожалуйста. При создании двумерного динамического массива через функцию...

Не правильно удаляет столбец двумерного динамического массива
Вот вообщем код, вместо того что-бы удалить столбец он заменяеться на адрессы элементов. #include...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru