С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
6 / 6 / 2
Регистрация: 29.03.2012
Сообщений: 101
1

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

24.06.2018, 09:48. Показов 5938. Ответов 26

Author24 — интернет-сервис помощи студентам
Нужно задать верхнюю треугольную матрицу размера 3х3. Размер строк задаётся динамически.
C++
1
int *matrix[3] = {new int[3],new int[2],new int};
В таком случае получится нечто следующее:
[0][0] [0][1] [0][2]
[1][0] [1][1]
[2][0]


А должно:
[0][0] [0][1] [0][2]
[1][1] [1][2]
[2][2]


Как так сделать? Пробовал создавать все строки размером 3 и потом удалять первые ненужные элементы оператором delete, но компилятор ругается.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2018, 09:48
Ответы с готовыми решениями:

Динамическая матрица
Добрый день, у меня такая проблема. Даны 3 матрицы 4х4, 5х5, 7х7. Надо написать одну общую функцию...

Динамическая матрица С++
Напишите программу, которая принимает с клавиатуры число N и M, создает матрицу размера N на M,...

динамическая матрица
в общем, надо сделать матрицу доступа, её размер в исходном состоянии 1х1, и потом увечивается,...

Динамическая матрица
Здравствуйте, помогите найти ошибку в динамической матрице: у меня почему-то вызывается...

26
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
24.06.2018, 10:10 2
Примерно так
C++
1
2
3
4
5
  int cnt = 3;
 
  vector<vector<int>> a;
  for (int i = 0; i < 3; ++i, --cnt)
    a.push_back(vector<int>(cnt));
Вот полный код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <iterator>
#include <vector>
 
using namespace std;
 
int main() {
  int cnt = 3;
 
  vector<vector<int>> a;
  for (int i = 0; i < 3; ++i, --cnt)
    a.push_back(vector<int>(cnt));
 
  for (const auto& i : a) {
    copy(i.cbegin(), i.cend(), ostream_iterator<int>(cout, " "));
 
    cout << '\n';
  }
}
0
223 / 188 / 97
Регистрация: 15.04.2018
Сообщений: 718
24.06.2018, 11:28 3
ReDoX, меня терзают смутные сомнения, что автор темы перешел с паскаля и хочет делать с индексами то, что он делал там. А чисто "косметика", когда мы сами значения изменяем с 0 на 3 ему не нужна
0
6 / 6 / 2
Регистрация: 29.03.2012
Сообщений: 101
24.06.2018, 12:19  [ТС] 4
Я сам не до конца понимаю, что нужно. Задача звучит так:

Написать функцию, заводящую верхне-треугольную матрицу заданного порядка (он определяется во время вы-
полнения программы; хранить в памяти, естественно, нужно только возможно ненулевые элементы, заведомые нули
ниже главной диагонали хранить незачем) в соответствии со вторым подходом к двумерным динамическим массивам
(возвращает int**).
0
223 / 188 / 97
Регистрация: 15.04.2018
Сообщений: 718
24.06.2018, 12:22 5
как я понимаю задачу - тут работа именно с представлением (выводом) данных. Так что вариант ReDoX, если он написан правильно, должен работать
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
24.06.2018, 12:34 6
А прочитать сначала теорию не?
Треугольная матрица — квадратная матрица, в которой все элементы ниже или выше главной диагонали равны нулю.

Верхнетреугольная матрица квадратная матрица, в которой все элементы ниже главной диагонали равны нулю.
Нижнетреугольная матрица — квадратная матрица, в которой все элементы выше главной диагонали равны нулю.
Унитреугольная матрица (верхняя или нижняя) — треугольная матрица, в которой все элементы на главной диагонали равны единице.
Отсюда просто создается квадратная матрица n-го порядка, элементы ниже главной диагонали которой задаются нулями. Всё.

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
#include <iostream>
 
using namespace std;
 
int main()
{
    int n;
    cout << "Enter size: ";
    cin >> n;
    int **arr = new int*[n];
    for (int i=0; i<n; i++)
    {
        arr[i] = new int[n];
        for (int j = 0; j < n; j++)
        {
            //if (i == j) arr[i][j] = 1;    //Унитриугольная
            //else arr[i][j] = 0;           //матрица
            
            //if (i >= j) //Нижнетреугольная
            if (i <= j) //Верхнетреугольная            
                arr[i][j] = 0;
            else
                arr[i][j] = 1;
        }
    }
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
 
    for (int i = 0; i < n; i++)
        delete[]arr[i];
    delete[]arr;
    return 0;
}
0
6 / 6 / 2
Регистрация: 29.03.2012
Сообщений: 101
24.06.2018, 12:38  [ТС] 7
Так в задании сказано, что хранить в памяти, естественно, нужно только возможно ненулевые элементы, заведомые нули
ниже главной диагонали хранить незачем.
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
24.06.2018, 13:13 8
HelloWorld56, То что представлено в первом посте об этом не упоминает.
Если даже так, то при этом случае получится не верхнетреугольная матрица, а нижне/верхне одновременно, т.к. элементов что там, что там одинаково. (За исключением расположения элементов, само-собой).

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 <iostream>
 
using namespace std;
 
int main()
{
    int n, m;
    cout << "Enter size: ";
    cin >> n;
    
    int **arr = new int*[n];
    
    for (int i = 0; i < n; i++)
    {
        arr[i] = new int[n - i];
        for (int j = 0; j < n - i; j++)
        {
            arr[i][j] = 1;
        }
    }
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n - i; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
 
    for (int i = 0; i < n; i++)
        delete[]arr[i];
    delete[]arr;
    return 0;
}
P.s. в посте выше при условиях '<=' и '>=' нужно убрать '='.
0
6 / 6 / 2
Регистрация: 29.03.2012
Сообщений: 101
24.06.2018, 13:37  [ТС] 9
Насчёт вашего последнего кода: если матрица например 2-ого порядка, то элемент [1][1] является пустым, значит матрица не верхнетреугольная. Если матрица верхнетреугольная - пустым должен быть элемент [1][0].
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
24.06.2018, 13:50 10
HelloWorld56, А ты понимаешь что такое матрица? И как она в памяти расположена?

Добавлено через 1 минуту
Я тебе привел пример верхне/нижне/уни в посте выше. Это то, что требуется. А твои дополнения по-поводу памяти с динамической матрицей - это уже какая-то лажа.
Ты не можешь выделять память под 1 элемент, который будет расположен после несуществующих 2х.
1
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.06.2018, 18:13 11
SuperKir,
Цитата Сообщение от HelloWorld56 Посмотреть сообщение
Написать функцию
HelloWorld56,
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
#include <iostream>
#include <ctime>
using namespace std;
 
int SetMatrix (int **a, int n)
{      
    for (int i = 0; i < n; i++)    
    for (int j = 0; j < n; j++) 
    if (i<=j) a[i][j]=rand()%9 + 1;    
    return **a;
}
 
int main()
{
    srand((int)time(0));
    int n;
    cout <<"n="; cin >>n;    
    
      int **a = new int*[n]; 
    for (int i = 0; i < n; i++)
      a[i]=new int[n];
      
    for (int i = 0; i < n; i++)    
    for (int j = 0; j < n; j++)
    a[i][j]=0;
      
    SetMatrix (a, n);  
    
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < n; j++) 
    cout <<a[i][j]<<" ";    
    cout << endl;
    }
 
    for (int i = 0; i < n; i++)
    delete [] a[i];
    delete [] a;
system("pause");
return 0;
}
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
24.06.2018, 19:01 12
Yetty, Ну а как же задание
Цитата Сообщение от HelloWorld56 Посмотреть сообщение
хранить в памяти, естественно, нужно только возможно ненулевые элементы, заведомые нули ниже главной диагонали хранить незачем
Или теперь Вы, уважаемый, только часть работы делаете, чтобы ее ТС доделал сам?)
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.06.2018, 20:40 13
Цитата Сообщение от SuperKir Посмотреть сообщение
Yetty, Ну а как же задание
согласен, условие насчёт памяти в коде Выше не присутствует.
вариант 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
#include <iostream>
#include <ctime>
using namespace std;
 
int SetMatrix (int **a, int n)
{      
    for (int i = 0; i < n; i++)    
    for (int j = 0; j < n; j++) 
    if (i<=j) a[i][j]=rand()%9 + 1;    
    return **a;
}
 
int main()
{
    srand((int)time(0));
    int n;
    cout <<"n="; cin >>n;    
    
      int **a = new int*[n]; 
    for (int i = 0; i < n; i++)
      a[i]=new int[n];   
      
    SetMatrix (a, n);  
    
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < n; j++) 
    if (i<=j) cout <<a[i][j]<<" ";
    else cout <<0<<" ";
    cout << endl;
    }
 
    for (int i = 0; i < n; i++)
    delete [] a[i];
    delete [] a;
system("pause");
return 0;
}
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
24.06.2018, 21:45 14
Yetty, Вы снова прислали тот же код, любезный)
Суть проблемы ТС в том, что он не может разобраться, как ему "исключить из памяти" нулевые элементы

Что, собственно, я попытался воплотить в #8 посте
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.06.2018, 22:41 15
Цитата Сообщение от SuperKir Посмотреть сообщение
Yetty, Вы снова прислали тот же код, любезный)
Вы опять сначала пишете потом смотрите это другой код. если раньше нулями заполнялись элементы массива, в варианте 2 нули просто распечатываются.
Цитата Сообщение от SuperKir Посмотреть сообщение
Что, собственно, я попытался воплотить в #8 посте
трудно сказать что Вы пытались воплотить. нужно было
Цитата Сообщение от HelloWorld56 Посмотреть сообщение
Написать функцию
вместо этого Вы распечатали единички выше побочной диагонали - даже на кусок треугольной это как-то не тянет.
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
24.06.2018, 23:41 16
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
#include <iostream>
#include <stdexcept>
#include <vector>
 
class MatrixUR {
public:
  MatrixUR(size_t N)
      : m_rows(N)
      , m_cols(N)
      , m_data((1 + N) * N / 2){};
  double &operator()(size_t row, size_t col)
  {
    if (row > col) {
      throw std::out_of_range("row > col");
    }
    size_t pos = row * m_cols + col - (row) * (row + 1) / 2;
    return m_data.at(pos);
  }
  size_t rows() { return m_rows; }
  size_t cols() { return m_cols; }
 
private:
  size_t m_rows;
  size_t m_cols;
  std::vector<double> m_data;
};
 
 
void print(MatrixUR &A)
{
  for (size_t i = 0; i < A.rows(); ++i) {
    for (size_t j = 0; j < i; ++j) {
      std::cout << 0.0 << "\t";
    }
    for (size_t j = i; j < A.cols(); ++j) {
      std::cout << A(i, j) << "\t";
    }
    std::cout << "\n";
  }
}
 
 
int main()
{
  constexpr size_t N = 5;
 
  MatrixUR A(N);
 
  for (size_t i = 0; i < N; ++i) {
    for (size_t j = i; j < N; ++j) {
      A(i, j) = (i + 1) * 100 + (j + 1);
    }
  }
 
  print(A);
  return 0;
}
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
25.06.2018, 00:01 17
Цитата Сообщение от Yetty Посмотреть сообщение
вместо этого Вы распечатали единички выше побочной диагонали - даже на кусок треугольной это как-то не тянет.
Это Вы, видимо, не смотрите. То, что сделали Вы, я сделал (для всех видов) в начале темы. ТСу нужно это:
Цитата Сообщение от HelloWorld56 Посмотреть сообщение
хранить в памяти, естественно, нужно только возможно ненулевые элементы, заведомые нули ниже главной диагонали хранить незачем
Вы наотрез отказываетесь цитировать эту часть, уткнувшись зачем-то в функцию.

Цитата Сообщение от Yetty Посмотреть сообщение
int **a = new int*[n]; for (int i = 0; i < n; i++) a[i]=new int[n];
Это не есть "хранить в памяти только ненулевые элементы"
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
25.06.2018, 00:34 18
Цитата Сообщение от SuperKir Посмотреть сообщение
Вы наотрез отказываетесь цитировать эту часть, уткнувшись зачем-то в функцию.
Что значит уткнувшись ? Выражения подбирай. Такое условие задачи:
Цитата Сообщение от HelloWorld56 Посмотреть сообщение
Написать функцию
Когда дойдёт ?
Цитата Сообщение от SuperKir Посмотреть сообщение
Это не есть "хранить в памяти только ненулевые элементы"
Кто сказал что это хранение ? Стандартное объявление массива. Заполнил значениями элементы главной диагонали и элементы выше главной диагонали. Нули просто распечатал (не заполнял ими элементы). Что Вам вообще неясно, о чём идёт речь ?
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
25.06.2018, 09:11 19
Yetty, Уже на ты, отлично)
Уткнувшись, упершись, как хочешь, это обычное выражение.

Цитата Сообщение от Yetty Посмотреть сообщение
Когда дойдёт ?
Я уже неоднократно писал, что не в функции дело... Про функцию уже давно всё понятно, никто не спорит, что ее надо было (правда появилось это задание не в заголовке, а в комментах, как, собственно, и то, на что я тебе пытаюсь указать).

Цитата Сообщение от Yetty Посмотреть сообщение
Кто сказал что это хранение ? Стандартное объявление массива
Вот именно. Это объявление массива n*n. В куче выделилось место под n*n элементов, и хоть заполняй, хоть нет, но это место уже выделено под массив n*n.

Цитата Сообщение от Yetty Посмотреть сообщение
Нули просто распечатал (не заполнял ими элементы).
Опять же, я поэтому и придираюсь)

Цитата Сообщение от Yetty Посмотреть сообщение
Что Вам вообще неясно, о чём идёт речь ?
А речь идет по этой части задания:
Цитата Сообщение от HelloWorld56 Посмотреть сообщение
хранить в памяти, естественно, нужно только возможно ненулевые элементы, заведомые нули ниже главной диагонали хранить незачем) в соответствии со вторым подходом к двумерным динамическим массивам
(возвращает int**).
Я же говорю, что весь сырбор у ТС был именно по этой части, т.к. обычное объявление всех треугольных матриц я ему присылал ранее, но ему необходима была конкретно по этой части помощь. На что я уже тебе много раз указывал, но ты наотрез не воспринимаешь это, а упираешься рогом (это поговорка...) в первую часть задания с написанием функции)

Сколько еще раз нужно процитировать эту часть, чтобы ты или объяснил, как ты исключаешь из памяти эти элементы, или объяснил, как в твоем коде выполняется эта часть?)
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
25.06.2018, 11:37 20
Цитата Сообщение от SuperKir Посмотреть сообщение
появилось это задание не в заголовке
SuperKir, какая разница когда появилось задание ? в первом, втором или третьем посте ТС ? задание появилось ДО Вашего кода. и код этот ему не соответствует.
Цитата Сообщение от SuperKir Посмотреть сообщение
ему необходима была конкретно по этой части помощь
Это Вы так решили. А по условию:
Цитата Сообщение от HelloWorld56 Посмотреть сообщение
Написать функцию, заводящую верхне-треугольную матрицу...заведомые нули
ниже главной диагонали хранить незачем
Т.е. в функции нужно организовать ввод верхней части треугольной матрицы (без нулей). В моём коде это и сделано - верхние элементы вводятся нули не вводятся. Про способ объявления массива о чём Вы всё время говорите даже слова нет в условии. Если Вы не знаете кстати, то далеко не все компиляторы автоматически заполняют объявленный массив нулями.
Цитата Сообщение от SuperKir Посмотреть сообщение
как ты исключаешь из памяти эти элементы
их не нужно исключать из памяти - нужно нули не вводить. Вы разобрались кстати что Ваш код выводит единички над побочной диагональю, а нужно над главной. и не единички. а произвольные числа.
0
25.06.2018, 11:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2018, 11:37
Помогаю со студенческими работами здесь

Динамическая матрица
помогите написать 2 проги 1) 2) по критериям: 1)Динамические массивы обязательны 2)работать...

Объясните динамическая матрица
Здравствуйте. Объясните пожалуйста вот эти строчки кода. int **matrix = new int * ; for ( int...

У меня динамическая матрица ?
#include &lt;iostream&gt; using namespace std; int main() { int n,i,j; float a; cout...

Двумерная динамическая матрица
в общем помогите, надо написать двумерный массив(int) динамическим и пару функций к нему: 1....

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

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


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

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