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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
#1

Как изменить размерность матрицы - C++

21.07.2011, 21:59. Просмотров 1659. Ответов 27
Метки нет (Все метки)

Помогите плз. Мне нужно просграммно поменять размерность матрицы. Например была матрица mat[5][5]
а должна получиться после определенных вычислений mat[6][7]. Буду очень благадарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2011, 21:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как изменить размерность матрицы (C++):

Как из файла прочитать размерность матрицы и её содержимое? - C++
Помогите пожалуйста, ничего не нашёл! Как из файла прочитать размерность матрицы и её содержимое?

Изменить программу, чтобы размерность массива определялась динамически - C++
то есть надо применить функцию new #include <vcl.h> #include <stdio.h> #pragma hdrstop #pragma argsused #include <iostream.h> ...

Проверьте пожалуйста указатели , размерность ответа не влазит что изменить - C++
Содержание работы: 1. Разработать Си - программу содержащую 6 переменных одного типа и 2 указателя на любые эти переменные. ...

Размерность матрицы в файле - C++
Здраствуйте, вот у меня кусок кода в котором я открываю файл и записываю в матрицу q на w! Хотел бы узнать, как сделать, что бы не...

Размер vs. размерность матрицы - C++
Вопрос скорее теоретический. Чем отличается размер матрицы от размерности? И как правильно спрашивать пользователя в программе: "Введите...

Задать размерность матрицы с клавиатуры - C++
Подскажите пожалуйста как сделать чтобы можно было задавать размер матрицы с клавиатуры. Код программы: #include <iostream.h> ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
21.07.2011, 22:10 #2
Так ты просто объяви матрицу [6][7] и всё, и скопируй содержимое [5][5] в [6][7] как тебе надо
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.07.2011, 22:14 #3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdlib.h>
 
int main()
{
    const int P = 5;
    const int Q = 6;
    const int R = 7;
    int** matr = (int**)malloc(P * sizeof(int*));
    int i = 0;
    for (; i < P; ++i)
        matr[i] = (int*)malloc(P * sizeof(int));
/* some code */
    matr = (int**)realloc(matr, Q * sizeof(int*));
    for (i = 0; i < Q; ++i)
        matr[i] = (int*)realloc(matr, R * sizeof(int));
/* some code */
    for (i = 0; i < Q; ++i)
        free(matr[i]);
    free(matr);
    return 0;
}
nameless
Эксперт C++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
21.07.2011, 22:49 #4
gr_8_zizu,

Как вариант:

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 <vector>
#include <iostream>
#include <algorithm>
 
void GenerateMatrix(std::vector <std::vector <int> > & matrix, std::size_t SIZE)
{
    matrix.resize(SIZE);
    
    std::for_each(matrix.begin(), matrix.end(), [SIZE](std::vector <int>& vec) { 
        vec.resize(SIZE);
    } );
    
    std::generate(matrix.begin(), matrix.end(), [SIZE]() {
        std::vector <int> temp;
        temp.resize(SIZE);
        int current = 0;
        std::generate(temp.begin(), temp.end(), [&current]() {
            return current++;
        } );
        
        return temp;
    } );
}
 
void OutMatrix(std::vector <std::vector <int> > & matrix)
{
    for (std::size_t i = 0; i < matrix.size(); i++)
    {
        std::cout << std::endl;
        for (std::size_t j = 0; j < matrix[i].size(); j++)   
            std::cout << matrix[i][j] << " ";
    }
    std::cout << std::endl;
}
 
int main()
{
    std::vector <std::vector <int> > matrix;
    const int SIZE = 5;
    const int NEW_SIZE = 6;
    
    GenerateMatrix(matrix, SIZE);
    OutMatrix(matrix);          
        
    GenerateMatrix(matrix, NEW_SIZE);
    OutMatrix(matrix);
    
    return 0;
}
http://liveworkspace.org/code/d5736d...0aa7288e656b24
asics
Freelance
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
21.07.2011, 23:01 #5
Цитата Сообщение от nameless Посмотреть сообщение
C++
1
2
3
4
matrix.resize(SIZE);
std::for_each(matrix.begin(), matrix.end(), [SIZE](std::vector <int>& vec) { 
  vec.resize(SIZE);
  } );
Можно еще так:
C++
1
2
std::vector<std::vector<int>> m(SIZE, std::vector<int>(SIZE));
std::swap(matrix, m);
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 00:13  [ТС] #6
Я прошу прощения я немного не уточнил, какой размерности будет матрица будет извесно только в ходе выполнения, тоесть по определенному алгоритму. Мне необходимо просто расширить матрицу. Но я продумывал вариан, такой как просто создание новой матрицы при помощи например new. Но вот тут возникла небольшая проблема, для одномерных массивов этот вариант работает хорошо, но вот для двумерного в маем случае уже ругается. Может быть кто нить знает как с этим бороться. Было бы не плохо узнать, а то я уже и алгоритм под этот случая разобрал. Выручайте!

Добавлено через 2 минуты
Цитата Сообщение от nameless Посмотреть сообщение
gr_8_zizu,

Как вариант:

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 <vector>
#include <iostream>
#include <algorithm>
 
void GenerateMatrix(std::vector <std::vector <int> > & matrix, std::size_t SIZE)
{
    matrix.resize(SIZE);
    
    std::for_each(matrix.begin(), matrix.end(), [SIZE](std::vector <int>& vec) { 
        vec.resize(SIZE);
    } );
    
    std::generate(matrix.begin(), matrix.end(), [SIZE]() {
        std::vector <int> temp;
        temp.resize(SIZE);
        int current = 0;
        std::generate(temp.begin(), temp.end(), [&current]() {
            return current++;
        } );
        
        return temp;
    } );
}
 
void OutMatrix(std::vector <std::vector <int> > & matrix)
{
    for (std::size_t i = 0; i < matrix.size(); i++)
    {
        std::cout << std::endl;
        for (std::size_t j = 0; j < matrix[i].size(); j++)   
            std::cout << matrix[i][j] << " ";
    }
    std::cout << std::endl;
}
 
int main()
{
    std::vector <std::vector <int> > matrix;
    const int SIZE = 5;
    const int NEW_SIZE = 6;
    
    GenerateMatrix(matrix, SIZE);
    OutMatrix(matrix);          
        
    GenerateMatrix(matrix, NEW_SIZE);
    OutMatrix(matrix);
    
    return 0;
}
http://liveworkspace.org/code/d5736d...0aa7288e656b24
спасибо за помощь, но вот клас вектор для меня вообще темный лес, и боюсь если залезу то долго вылезать буду, а мне работу надо до сентября месяца здать. Так что лучше примерчик с int массивами написал бы, и все равно спасибо.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
22.07.2011, 00:34 #7
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
Но я продумывал вариан, такой как просто создание новой матрицы при помощи например new. Но вот тут возникла небольшая проблема, для одномерных массивов этот вариант работает хорошо, но вот для двумерного в маем случае уже ругается.
А какой твой случай-то?
C++
1
2
3
 int** p;
 for (int i; i< 6; i++)
  p[i]= new int [8];
Вот и вся матрица, вместо 6 подставь количество строк, вместо 8 количество столбцов. Главное- скопировать нужным образом, я говорил уже. А как копировать я ума не приложу, чё у тебя за алгоритм.
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 00:49  [ТС] #8
Цитата Сообщение от kravam Посмотреть сообщение
А какой твой случай-то?
C++
1
2
3
 int** p;
 for (int i; i< 6; i++)
  p[i]= new int [8];
Вот и вся матрица, вместо 6 подставь количество строк, вместо 8 количество столбцов. Главное- скопировать нужным образом, я говорил уже. А как копировать я ума не приложу, чё у тебя за алгоритм.
Под случаем я имел ввиду двумерный массив объявить надо. И не получается пример который ты написал, пишет:"... 'Acces violation at address 00401379'..."
asics
Freelance
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
22.07.2011, 00:53 #9
Нужно так:
C++
1
2
3
4
5
6
7
int **p = new int*[6];
for(int i = 0; i < 6; ++i)
  p[i] = new int[8];
//Удаление
for(int i = 0; i < 6; ++i)
  delete[] p[i];
delete[] p;
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 00:59  [ТС] #10
Цитата Сообщение от asics Посмотреть сообщение
Нужно так:
C++
1
2
3
4
5
6
7
int **p = new int*[6];
for(int i = 0; i < 6; ++i)
  p[i] = new int[8];
//Удаление
for(int i = 0; i < 6; ++i)
  delete[] p[i];
delete[] p;
Спасибо уже получилось. А зачем его потом удалять? Если он мне нужен будет все время им же можно будет пользоваться как обычным массивом или он только временным может быть?
asics
Freelance
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
22.07.2011, 01:02 #11
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
Если он мне нужен будет все время им же можно будет пользоваться как обычным массивом
Да.
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
или он только временным может быть?
Когда он вам станет не нужен, тогда и удалите память, я так понимаю в вашей ситуации -- в конце программы.
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 01:05  [ТС] #12
Когда он вам станет не нужен, тогда и удалите память, я так понимаю в вашей ситуации -- в конце программы.[/QUOTE]

Этот массив и будет являться результатом моей программы только немного преобразованный. А доступ к такому массиву такойже как и к обычному? и как с адресами в таком случае?
asics
Freelance
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
22.07.2011, 01:08 #13
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
А доступ к такому массиву такойже как и к обычному?
Да.
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
и как с адресами в таком случае?
Этого не понял.
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 01:27  [ТС] #14
ну в обычном массиве адреса элементов распологаются подрят, а в этом случае так же? Или тут подрят идут адреса только строк, а столбцов уже могут распологаться в другом месте, или все идет подрят как в обычном массиве?

Добавлено через 11 минут
Например: если работать с указателями, то адрес pArray+1 будет в соседнем байте с pArray так?
asics
Freelance
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
22.07.2011, 01:48 #15
Думаю так будет понятно: pArry[i][j] <=> *(*(pArray + i) + j)

Добавлено через 41 секунду
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
ну в обычном массиве адреса элементов распологаются подрят, а в этом случае так же?
Это и есть обычный масив, только память мы под него выделили динамически.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2011, 01:48
Привет! Вот еще темы с ответами:

Считать размерность матрицы из файла - C++
Есть файл, в нем лежат две матрицы, не обязательно квадратные. Надо считать эти две матрицы, а потом их сложить.Файл типизирован, то есть...

Ввести размерность матрицы с клавиатуры - C++
Задача: создать массив N*M, (ввод размерности с клавиатуры) и вывести его на экран. Написала код, но где-то видимо туплю, помогите,...

Ввести размерность матрицы с клавиатуры - C++
Привет,мир! Как сделать так, чтобы самому задавать размерность матрицы. #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std;...

Задать размерность матрицы с клавиатуры - C++
Задан двумерный массив U. Значения n и m должны вводиться. Внутренние значения массива выбираются случайно. Полученный массив должен...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.07.2011, 01:48
Ответ Создать тему
Опции темы

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