Форум программистов, компьютерный форум CyberForum.ru

Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы - C++

Восстановить пароль Регистрация
 
Yentroistok
1 / 1 / 0
Регистрация: 25.02.2012
Сообщений: 59
13.05.2012, 10:32     Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы #1
Дана матрица, размерность вводит пользователь, данные тоже. Осуществить сортировку вставками, массива, который будет получен из суммы модулей элементов строк.

код написал, но когда ввожу размер матрицы 2*3 или 3*4, т.е. не одинаковое кол-вао строк и столбцов, то вылетает ошибка в этом месте программы:

C++
1
(matrix[j][i] > 0)?Summa[j] += matrix[j][i]: Summa[j] += (-1)*matrix[j][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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
//_____________________________Соритровка Вставками___________________________//
void insert_sort(int *a, int N) 
{
    for(int *q=a+1; q<a+N; q++) 
    {
        int x = *q;       // инициализируем временную переменную текущим значением элемента массива
        int *p = q-1;     //запоминаем индекс предыдущего элемента массива
        while(p>=a && *p>x)     // пока индекс не равен 0 и предыдущий элемент массива больше текущего
        
            *(p+1) = *p--;   // перестановка элементов массива
            *(++p) = x;
        
    }
}
//_____________________________Основная программа________________________________//
void main()
{
    setlocale(LC_ALL, "Russian");
 
//_____________Дана динамическая целочисленная матрица(выделяем память)________________________//
 
    unsigned int n, m;
    n = m = 0;
    printf("Введите n(ширину матрицы): ");
    scanf("%ud", &n);
    printf("Введите m(высоту матрицы): ");
    scanf("%ud", &m);
 
    int** matrix = new int* [n];
    int j;
    for (j = 0; j != n; ++j)
    {
        matrix[j] = new int [m];             
    }
 
//______________Задаём значения матрицы_____________________//
    unsigned int i_n, j_m;
    for (i_n = 0 ; i_n < n; i_n++)
    {
        for (j_m = 0; j_m < m; j_m++)
        {
            printf("Элемент matrix[%u][%u] = ", i_n, j_m);
            while (scanf_s("%d", &matrix[i_n][j_m])!=1)
                {
                    printf("Ошибка ввода, введите заново \n");
                    fflush(stdin);
                }
            
        }
    }    
    
//___________Вывод матрицы на экран____________________________//
    printf("Выводим матрицу на экран\n");
    for (i_n = 0 ; i_n < n; i_n++)
    {
        for (j_m = 0; j_m < m; j_m++)
        {
            printf(" %d ", *&matrix[i_n][j_m]);
        }
        printf("\n");
    }
    getch();
     
//_________Построение одномерного динамического массива, каждый эллемент\
    которого равен сумме элементов одной строки исходной матрицы.___________________//
    
    int *Summa = new int [m];
 
    unsigned int i;
    for (j = 0; j < m; ++j)                                     
    {
        Summa[j] = 0;
        for (i = 0; i < n; ++i)           
        {
            (matrix[j][i] > 0)?Summa[j] += matrix[j][i]: Summa[j] += (-1)*matrix[j][i];    // молдули элементов строк, если число отрицательное
        }
    }
 
    printf("Вывод массива с суммой элементов строк матрицы\n");
    for (j = 0; j < m; ++j)
    {
        printf(" %d ", *&Summa[j]);
    }
    getch();
 
// Вызов процедуры соритровки
//________________Освободить память от матрицы._______________________//
 insert_sort(Summa, n);
 
//_____________Вывод на экран отсортированного массива________________//
 printf("\nВывод массива с суммой элементов строк матрицы(После соритровки)\n");
    for (j = 0; j != m; ++j)
    {
        printf(" %d ", *&Summa[j]);
    }
    getch();
 
//___________Освобождаем память_______________//
    for (j = 0; j != n; ++j)
    {
        delete[] matrix[j];
    }
    delete[] matrix; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2012, 10:32     Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы
Посмотрите здесь:

C++ Определение количества столбцов матрицы, состоящих из положительных элементов
C++ матрицы, упорядочить ее строки согласно кол-ву строк с нулями
C++ Перестановка местами строк и столбцов матрицы
Ошибка при вводе матрицы. C++
Подскажите где ошибка (номер строк и столбцов всех седловых точек матрицы) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 10:56     Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы #2
Цитата Сообщение от Yentroistok Посмотреть сообщение
Построение одномерного динамического массива, каждый эллемент\
которого равен сумме элементов одной строки исходной матрицы.
int *Summa = new int [m];
unsigned int i;
for (j = 0; j < m; ++j) {
Summa[j] = 0;
for (i = 0; i < n; ++i) {
(matrix[j][i] > 0)?Summa[j] += matrix[j][i]: Summa[j] += (-1)*matrix[j][i]; //} }
если исходить из правильности комментария, то количество элементов в массиве Summa должна соответствовать количеству строк массива matrix, вы же выделяете по количеству столбцов.

также ошибка в условии этих циклов, надо поменять местами m и n.

И еще, для получения модуля есть стандартная функция abs или fabs из заголовка math.h (или <cmath>).
Yentroistok
1 / 1 / 0
Регистрация: 25.02.2012
Сообщений: 59
13.05.2012, 10:58  [ТС]     Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы #3
antoha398, Спасибо)
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 10:59     Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы #4
Цитата Сообщение от Yentroistok Посмотреть сообщение
*&Summa[j] или такой *&matrix[i_n][j_m]
что вы хотите получить от такой конструкции? пишите просто Summa[j].
и в конце вы забыли освободить память от массива Summa.
Yentroistok
1 / 1 / 0
Регистрация: 25.02.2012
Сообщений: 59
13.05.2012, 18:58  [ТС]     Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы #5
А еще появился такой вопрос: Как вывести на экран строки матрицы в порядке убывания суммы модулей элементов строк.

Тут я поменял. Сделал по убыванию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
void insert_sort(int *a, int N) 
{
    for(int *q=a+1; q<a+N; q++) 
    {
        int x = *q;       // инициализируем временную переменную текущим значением элемента массива
        int *p = q-1;     //запоминаем индекс предыдущего элемента массива
        while(p>=a && *p<x)     // пока индекс не равен 0 и предыдущий элемент массива МЕНЬШЕ(*p<x) текущего
        
            *(p+1) = *p--;   // перестановка элементов массива
            *(++p) = x;
    }
}
Пробовал выводить по сумме элементов строки матрицы в соответствии с элементами массива Summa, но ничего не вышло.

P/S/
antoha398, память освободил.
Yandex
Объявления
13.05.2012, 18:58     Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы
Ответ Создать тему
Опции темы

Текущее время: 03:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru