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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
juventine
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 5
#1

Динамически выделить память под верхний треугольник квадратной матрицы - C++

12.04.2009, 02:56. Просмотров 1284. Ответов 7
Метки нет (Все метки)

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

вот часть текста:
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
#include "stdafx.h"
#include <iostream>
//#include <math.h>
using namespace std;
void main(void)
{
setlocale(LC_ALL,".1251");
int i, j, N, k = 0, l = 0, x = 0, q = 0, *a, y = 0, s = 0;
double sr = 0, sum = 0, *c, min =0, max = 0;
cout<<" Программа:"<<endl;
cout<<" 1) Вводит целочисленную квадратную матрицу, такую, что а[i,j]=a[j,i] для всех i,j;"<<endl;
cout<<" 2) Находит максимальный элемент в тех столбцах, которые не содержат положительных элементов"<<endl;
cout<<" 3) Находит минимум среди средних значений элементов диагоналей, параллельных побочной диагонали матрицы"<<endl<<endl;
while(1 == 1)
{
cout<<endl<<"Задайте размер матрицы(N <= 10): ";
cin>>N;
if(N <= 10 && N > 1) break;
else cout<<endl<<"Будьте внимательны при вводе! Некорректный размер матрицы!!!"<<endl;
 
}
 
s = N;
a = new int [N];
c = new double [N];
 
int **mas = new int*[N];
for(i = 0; i < N; i++)
{
mas[i] = new int[N-i];
//s--;
}
 
 
cout<<"Введите элементы матрицы, расположенные выше главной диагонали, включая главную диагональ:"<<endl;
for(i = 1; i <= N; i++ )
{
k++;
for(j = k; j <= N; j++)
{
 
cout<<"Элемент матрицы ["<<i<<"]["<<j<<"] = ";
 
cin>>mas[i-1][j-1];
cout<<"element ["<<i-1<<"]["<<j-1<<"]="<<mas[i-1][j-1]<<endl<<endl;
 
}
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2009, 02:56     Динамически выделить память под верхний треугольник квадратной матрицы
Посмотрите здесь:
C++ Напечатать верхний треугольник квадратной матрицы
C++ Динамически выделить память под массив
C++ Динамически выделить память под массив
Динамически выделить память под массив функций C++
C++ Можно ли динамически выделить память под массив указателей, на объекты класса?
C++ Как динамически выделить память для строкового массива?
C++ Как выделить динамически память для данных класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.04.2009, 12:35     Динамически выделить память под верхний треугольник квадратной матрицы #2
ошибка была в вводе, а не в выделении..вот рабочий вариант:

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
#include<iostream>
using namespace std;
 
 
void main(void)
{
    setlocale(LC_ALL,".1251");
    int i, j, N, k = 0, l = 0, x = 0, q = 0, *a, y = 0, s = 0;
    double sr = 0, sum = 0, *c, min =0, max = 0;
 
    cout<<" Программа:"<<endl;
    cout<<" 1) Вводит целочисленную квадратную матрицу, такую, что а[i,j]=a[j,i] для всех i,j;"<<endl;
    cout<<" 2) Находит максимальный элемент в тех столбцах, которые не содержат положительных элементов"<<endl;
    cout<<" 3) Находит минимум среди средних значений элементов диагоналей, параллельных побочной диагонали матрицы"<<endl<<endl;
    while(true)
    {
        cout<<endl<<"Задайте размер матрицы(N <= 10): ";
        cin>>N;
        if(N <= 10 && N > 1) break;
            else cout<<endl<<"Будьте внимательны при вводе! Некорректный размер матрицы!!!"<<endl;
    }
 
    s = N;
 
    a = new int [N];
    c = new double [N];
 
    int **mas = new int*[N];
    for(i = 0; i < N; i++)
        mas[i] = new int[N-i];
 
 
    cout<<"Введите элементы матрицы, расположенные выше главной диагонали, включая главную диагональ:"<<endl;
    for(i = 0; i < N; i++ )
    {
        for(j = 0; j < N-i; j++)
        {
            cout<<"Элемент матрицы ["<<i+1<<"]["<<j+1<<"] = ";
            cin>>mas[i][j];
        }
    }
}
juventine
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 5
12.04.2009, 22:08  [ТС]     Динамически выделить память под верхний треугольник квадратной матрицы #3
Весьма Вам благодарен! Спасибо! Все работает!

Добавлено через 8 часов 32 минуты 1 секунду
C++
1
2
3
4
5
6
7
8
9
cout<<"Введите элементы матрицы, расположенные выше главной диагонали, включая главную диагональ:"<<endl;
        for(i = 0; i < N; i++ )
        {
                for(j = 0; j < N-i; j++)
                {
                        cout<<"Элемент матрицы ["<<i+1<<"]["<<j+1<<"] = ";
                        cin>>mas[i][j];
                }
        }

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

написанный мной фрагмент опять не работает...
C++
1
2
3
4
5
6
7
8
9
cout<<"Введите элементы матрицы, расположенные выше главной диагонали, включая главную диагональ:"<<endl;
        for(i = 0; i < N; i++ )
        {
                for(j = i; j < N; j++)
                {
                        cout<<"Элемент матрицы ["<<i+1<<"]["<<j+1<<"] = ";
                        cin>>mas[i][j];
                }
        }
у меня вопрос, в суть которого я не внедрялся изначально:

при динамическом выделен
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.04.2009, 22:18     Динамически выделить память под верхний треугольник квадратной матрицы #4
не понял.. что не понятно?
juventine
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 5
12.04.2009, 22:18  [ТС]     Динамически выделить память под верхний треугольник квадратной матрицы #5
похоже, что я понял, в чем дело...
при записи mas[i] = new int[N-i]
new int[N-i] означает, что выделяется память не просто для 0..(N-i) элементов массива, но
и эти элементы должны иметь соответствующие индексы...
например, mas[2]=new int[2] означает, что выделяется память под элементы [2][0], [2][1]...
в моем случае получалось так: mas[2]= new int[1] и 1 один я трактовал как количество элементов, но никак не как индекс... то есть память выделяется и под соответствующие индексы? надеюсь, теперь-то я разобрался?..))
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.04.2009, 22:24     Динамически выделить память под верхний треугольник квадратной матрицы #6
ну да...

как бы выходило для N=5:

C++
1
2
3
4
5
mas[0] = new int[5];  // mas[0][0], mas[0][1], mas[0][2], mas[0][3], mas[0][4]
mas[1] = new int[4];  // mas[0][0], mas[0][1], mas[0][2], mas[0][3]
mas[2] = new int[3];  // mas[0][0], mas[0][1], mas[0][2]
mas[3] = new int[2];  // mas[0][0], mas[0][1]
mas[4] = new int[1];  // mas[0][0]
juventine
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 5
12.04.2009, 22:26  [ТС]     Динамически выделить память под верхний треугольник квадратной матрицы #7
в моем случае, похоже, память придется выделять под нижний треугольник относительно побочной диагонали, ибо под верхний треугольник уйдет лишняя память...


Monte-Cristo, спасибо большое за участие... уж извиняйте, что я пока такой дилетант..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2009, 22:38     Динамически выделить память под верхний треугольник квадратной матрицы
Еще ссылки по теме:
C++ Как динамически выделить память для конструкторов класса?
C++ Что будет, если два раза динамически выделить память по одному указателю?
C++ Выделить память под переменную
Напечатать верхний треугольник матрицы, включая элементы главной диагонали, по строкам C++
C++ Не могу удалить динамически выделенную память под массив

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

Или воспользуйтесь поиском по форуму:
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.04.2009, 22:38     Динамически выделить память под верхний треугольник квадратной матрицы #8
все мы когда-то были делетантами.. да и остались... ибо познать все, увы, не возможно

для нижнего треугольника выделять так

C++
1
2
3
        int **mas = new int*[N];
        for(i = 0; i < N; i++)
                mas[i] = new int[i+1];
Yandex
Объявления
12.04.2009, 22:38     Динамически выделить память под верхний треугольник квадратной матрицы
Ответ Создать тему
Опции темы

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