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

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

12.04.2009, 02:56. Просмотров 1365. Ответов 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;
 
}
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2009, 02:56
Ответы с готовыми решениями:

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

Динамически выделить память под массив
Задание было в следующем: дан вещественный двумерный массив А. Поменять местами...

Динамически выделить память под массив
Добрый день форусчани Как можно выделить память под массив объекта класса...

Динамически выделить память под массив функций
QByteArray (SerfingThread::*lp_GetRequest)(const QByteArray&amp; ,const...

Можно ли динамически выделить память под массив указателей, на объекты класса?
Прошу прощения если не правильно назвал вопрос. Не знаю как правильно...

7
Monte-Cristo
2796 / 1384 / 107
Регистрация: 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];
        }
    }
}
1
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];
                }
        }
у меня вопрос, в суть которого я не внедрялся изначально:

при динамическом выделен
0
Monte-Cristo
2796 / 1384 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
12.04.2009, 22:18 4
не понял.. что не понятно?
1
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 один я трактовал как количество элементов, но никак не как индекс... то есть память выделяется и под соответствующие индексы? надеюсь, теперь-то я разобрался?..))
0
Monte-Cristo
2796 / 1384 / 107
Регистрация: 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]
1
juventine
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 5
12.04.2009, 22:26  [ТС] 7
в моем случае, похоже, память придется выделять под нижний треугольник относительно побочной диагонали, ибо под верхний треугольник уйдет лишняя память...


Monte-Cristo, спасибо большое за участие... уж извиняйте, что я пока такой дилетант..
0
Monte-Cristo
2796 / 1384 / 107
Регистрация: 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];
0
12.04.2009, 22:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2009, 22:38

Как выделить динамически память для данных класса
Как выделить динамически память для данных класса ? class circle { double...

Как динамически выделить память для конструкторов класса?
подскажите как динамически выделить память для конструкторов класса? class...

Как динамически выделить память для строкового массива?
Собственно сам вопрос.


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

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

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