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

Построить вектор из элементов матрицы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
kirich iz Che
 Аватар для kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
05.07.2010, 10:23     Построить вектор из элементов матрицы #1
по заданной квадратной матрице размером nxn построить вектор длиной 2n-1, элементы которого - максимумы элементов диаогоналей, паралленльных главной, включая главную диагональ.
решение задачи нужно сделать ввиде класса, снабженного соответствующими методами, а массив выделять динамически. помогите плиз
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2010, 10:23     Построить вектор из элементов матрицы
Посмотрите здесь:

Построить вектор, элементы которого являются наибольшими числами каждой строки данной матрицы C++
C++ Построить вектор, каждый элемент которого равен количеству равных элементов в соответствующей строке матрицы
C++ Создать функцию, где из квадратной матрицы S(m, m), m<=10 построить вектор Р
C++ Матрица А(7,7). Построить вектор b(7) из элементов главной диагонали
C++ Построить вектор на основе матрицы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Volodya
2 / 2 / 1
Регистрация: 25.10.2009
Сообщений: 8
05.07.2010, 14:39     Построить вектор из элементов матрицы #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
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
 
int main()
{
  srand(time(NULL));
  int max;
  int i, j, k, n;
  n = 7;                // это размерность матрицы
  int arr[7][7];      //  здесь без динамического выделения
  int vect[7];
  for(i = 0; i < n ; i++)
    {
      for(j = 0; j < n; j++)
    {
      arr[i][j] = rand() % 10;
      printf("%d ", arr[i][j]);
    }
      printf("\n");
    }
 
 
  for(k = 0; k < (2 * n - 1); k++)
    {
      max = -1;
      j = abs((n - 1) - k);
      for(i = 0; i <= ((n - 1) - abs((n - 1) - k)); i++)
    {
      if(k < n) 
        if(arr[i][j] > max)
          max = arr[i][j];
      if(k >= n)
          if(arr[j][i] > max)
        max = arr[j][i];
      j++;
    }
      vect[k] = max;
    }
  printf("Result: \n\n");
  for(i = 0; i < (2 * n - 1); i++)
    printf("%d ", vect[i]);
  printf("\n");
  return 0;
}
может быть тебе это поможет, писал на СИ и нет динамического выделения)
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
05.07.2010, 17:18     Построить вектор из элементов матрицы #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот с классами и динамическим выделением памяти:
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
#include <iostream>
#include <ctime>
#include <cassert>
#include <cmath>
 
class matrix_vector
{
public:
    matrix_vector(size_t sz); //Формирует матрицу со значениями из отрезка [0, default_value-1]
    matrix_vector(size_t sz, int lval, int rval); //Формирует матрицу со значениями из отрезка [lval, rval]
    ~matrix_vector();
    void print_matrix(); //Печать матрицы
    void print_vector(); //Печать вектора
private:
    void alloc_matrix(); //Выделение памяти для матрицы
    void make_vector(); //Создание и заполнение вектора
    int** _matrix; //Матрица
    int* _vector; //Вектор
    size_t _sz; //Размер матрицы
    static const size_t default_value=10; //Значение по умолчанию для генерации элементов матрицы
};
 
matrix_vector::matrix_vector(size_t sz)
    :_sz(sz)
{
    alloc_matrix();
    srand(static_cast<size_t>(time(NULL)));
    for(size_t i=0; i<_sz; ++i)
        for(size_t j=0; j<_sz; ++j)
            _matrix[i][j]=rand()%default_value;
    make_vector();
}
 
matrix_vector::matrix_vector(size_t sz, int lval, int rval)
    :_sz(sz)
{
    assert(rval>lval); //Проверка корректности границ отрезка
    alloc_matrix();
    srand(static_cast<size_t>(time(NULL)));
    for(size_t i=0; i<_sz; ++i)
        for(size_t j=0; j<_sz; ++j)
            _matrix[i][j]=rand()%(rval-lval+1)+lval;
    make_vector();
}
 
void matrix_vector::print_matrix()
{
    for(size_t i=0; i<_sz; ++i)
    {
        for(size_t j=0; j<_sz; ++j)
            std::cout << _matrix[i][j] << "\t";
        std::cout << std::endl;
    }
}
 
void matrix_vector::print_vector()
{
    std::cout << "(  ";
    for(size_t i=0; i<(2*_sz-1); ++i)
        std::cout << _vector[i] << "  ";
    std::cout << ")" << std::endl;
}
 
matrix_vector::~matrix_vector()
{
    for(size_t i=0; i<_sz; ++i)
        delete[] _matrix[i];
    delete[] _matrix;
    delete[] _vector;
}
 
void matrix_vector::alloc_matrix()
{
    _matrix=new int*[_sz];
    for(size_t i=0; i<_sz; ++i)
        _matrix[i]=new int [_sz];
}
 
void matrix_vector::make_vector()
{
    const size_t n=2*_sz-1;
    _vector=new int[n];
    for(size_t m=0; m<n; ++m)
    {
        size_t h=_sz-abs(static_cast<int>(_sz-m-1));
        size_t temp=abs(static_cast<int>(_sz-h));
        size_t index=(_sz*_sz-1)-temp*(m<_sz?1:_sz);
        int max=_matrix[index/_sz][index%_sz];
        index-=(_sz+1);
        for(size_t i=0; i<h-1; ++i, index-=(_sz+1))
            if(_matrix[index/_sz][index%_sz]>max)
                max=_matrix[index/_sz][index%_sz];
        _vector[m]=max;
    }
}
 
int main()
{
    matrix_vector mv(5, -5, 5);
    std::cout << "Initial matrix:" << std::endl;
    mv.print_matrix();
    std::cout << "Resulting vector:" << std::endl;
    mv.print_vector();
    system("pause");
    return EXIT_SUCCESS;
}
kirich iz Che
 Аватар для kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
05.07.2010, 17:51  [ТС]     Построить вектор из элементов матрицы #4
неймлес, обьясни примерно алгоритм, а то я чет запуталсяя(
вернее я половину не понял х)
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
05.07.2010, 18:27     Построить вектор из элементов матрицы #5
Я так думаю, что непонятен тебе алгоритм поиска максимальных элементов диагоналей, т.е. содержимое вспомогательной функции make_vector().
Из матрицы nxn мы вычленяем 2*n-1 диагоналей, начиная с самой нижней, двигаясь из нижнего левого в правый верхний угол матрицы.
Для каждой диагонали мы:
  1. Вычисляем h - число элементов диагонали (т.е. для первой диагонали - один элемент, для второй - два, и т.д., для последней - один);
  2. Вычисляем index - смещение текущего элемента диагонали относительно элемента матрицы с нулевым индексом. Т.е., если текущий элемент располагается на пересечении строки row и столбца col матрицы размером nxn, то его смещение index=row*n+col. Таким образом, зная смещение элемента, можно всегда рассчитать его координаты: row=index/n, col=index%n;
  3. За максимум диагонали берем элемент, определяемый смещением index;
  4. После этого идет переход к смещению следующего элемента диагонали, которое, как нетрудно заметить, меньше предыдущего на n+1, где n - размер матрицы;
  5. Дальше мы перебираем все остальные элементы диагонали и ищем среди нее максимальный элемент.
ЗЫ. Начальный элемент для каждой диагонали располагается либо на нижней строке, либо на правом столбце, поэтому и нужно вычислять temp - вспомогательную величину, которая определяет расстояние от текущего элемента матрицы до правого нижнего элемента либо в столбцах, либо в строках (в зависимости от рассматриваемой диагонали).
kirich iz Che
 Аватар для kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
05.07.2010, 20:07  [ТС]     Построить вектор из элементов матрицы #6
а что за time?

Добавлено через 12 минут
я запостил заявку утром, сам успел кой чего накатать, и у вас взял
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
110
111
112
113
114
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <windows.h>
 
using namespace std ;
 
 
class pilot
{
public:
int *matrx;
unsigned int n;
int *vect;
pilot(int size)
{
n=size;
matrx = new int[n*n];
 
 
}
 
 
 
void init (int n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cout << "matrix[" << i+1 << "][" << j+1 << "] = ";
cin >>matrx[j+i*n];
}
}
};
 
void vector(int n)
{
        const size_t t=2*n-1;
        vect=new int[t];}
 
 
 
 
void print (int n)
{
cout << "\n";
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
cout << matrx[j+i*n] << ' ';
cout << "\n";
}
};
~ pilot ()
{
delete[] matrx;
};
 
void bI (int n)
{
int i, j, k, max;
for(k = 0; k < (2 * n - 1); k++)
    {
      max = -1;
      j = abs((n - 1) - k);
      for(i = 0; i <= ((n - 1) - abs((n - 1) - k)); i++)
        {
          if(k < n) 
            if(matrx[j+i*n] > max)
              max = matrx[j+i*n];
          if(k >= n)
              if(matrx[j+i*n] > max)
                max = matrx[j+i*n];
          j++;
        }
      vect[k] = max;
    }
}
void print_vector()
{int i;
        cout << "(  ";
        for( i=0; i<(2*n-1); i++)
                std::cout << vect[i] << "  ";
        cout << ")" <<endl;
}
 
} ;
 
 
 
 
 
 
int main ()
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
int p, i, j, k, tmp, n;
cout << "Введите кол-во строк и столбцов\n" ;
cin >> n; //кол-во строк
pilot m(n);
m.n=n;
pilot(m.n);
m.init (m.n);
m.print (m.n);
m.bI(m.n);
cout << "Полученный вектор:" <<endl;
        m.print_vector();
 
getchar();
getchar();
return 0;
}
Выдает
Необработанное исключение в "0x00411bd4" в "практика 4.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
на
C++
1
vect[k] = max;
в чем может быть проблема?

Добавлено через 1 час 2 минуты
все, вродь смог, спасибо большое ребят!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2010, 02:57     Построить вектор из элементов матрицы
Еще ссылки по теме:

Построить вектор из общих элементов двух векторов C++
Построить вектор из максимальных элементов столбцов матрицы C++
Из элементов матрицы сформировать вектор средних арифметических парных элементов C++

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
06.07.2010, 02:57     Построить вектор из элементов матрицы #7
Цитата Сообщение от kirich iz Che Посмотреть сообщение
а что за time?
time используется для инициализации зерна генератора случайный чисел системным временем.
Yandex
Объявления
06.07.2010, 02:57     Построить вектор из элементов матрицы
Ответ Создать тему
Опции темы

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