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

Динамическое выделение памяти - C++

Восстановить пароль Регистрация
 
smeaz
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 17
05.12.2012, 17:20     Динамическое выделение памяти #1
Здравствуйте! Помогите пожалуйста, мне задали сделать чтобы в выделенном (выделить не удалось, оставил теги B, там где идёт "объявляем и определяем исходную матрицу") куске кода использовалось динамическое выделение памяти, но по словам препода, придётся переделать далеко не только этот кусок. Сам я в программировании ваще не бум бум, данную прогу копирнул из инета, очень прошу вашей помощи!
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
//Транспонирование матрицы
 
#include <iostream>
#include <iomanip.h>
 
using namespace std;
   
//объявляем глобальные переменные,
//определяющие размер матрицы
const int size1 = 5;
const int size2 = 5;
 
//прототип функции для вывода матрицы на экран
void print(int [][size2]);
 
int main()
{
   //объявляем и определяем исходную матрицу
  [B] int array[size1][size2] = {{ 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}};
   int temp;[/B]
   //выводим на экран исходную матрицу
   cout << "Ishodnaya matrica: " << endl << endl;
   print(array);
     
   cout << endl;
   //транспонируем первым способом
   for(int i = 0; i < size1; i++)
   {
      for(int j = i; j < size2; j++)
      {
         temp = array[i][j];
         array[i][j] = array[j][i];
         array[j][i] = temp;
      }
   }
   
   //выводим на экран транспонированную матрицу
   cout << "Transponirovannaya matrica: " << endl << endl;
   print(array);
   
   cout << endl;
   //транспонируем вторым способом
   //объявляем новую матрицу
   int transpArray[size1][size2];
   
   for(int i = 0; i < size1; i++)
      for(int j = 0; j < size2; j++)
         transpArray[j][i] = array[i][j];
         
    //выводим на экран транспонированную матрицу
    cout << "Transponirovannaya matrica: " << endl << endl;
    print(transpArray);
    cout << endl;
}
    
//функция, для вывода матрицы на экран
void print (int array[][size2])
{
   for(int i = 0; i < size1; i++)
   {
      for(int j = 0; j < size2; j++)
      {
         cout << setw(2) << 
         array[i][j] << " ";
      }
      cout << endl << endl;
   }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2012, 17:20     Динамическое выделение памяти
Посмотрите здесь:

C++ динамическое выделение памяти
C++ Динамическое выделение памяти.
C++ динамическое выделение памяти
C++ Динамическое выделение памяти
Динамическое выделение памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.12.2012, 17:55     Динамическое выделение памяти #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
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
#include <iostream>
#include <iomanip>
using namespace std;
 
//объявляем глобальные переменные,
//определяющие размер матрицы
const int rows = 5;
const int cols = 5;
 
//прототип функции для вывода матрицы на экран
void print(int**);
 
int main()
{
    //объявляем и определяем исходную матрицу
    int** array;
    array = new int*[rows];
    for (size_t i = 0; i<rows; ++i)
        array[i] = new int[cols];
 
    for(size_t i = 0, val = 0; i < rows; i++)
    {
        for(size_t j = 0; j < cols; j++)
            array[i][j] = val++;
    }
 
    //выводим на экран исходную матрицу
    cout << "Ishodnaya matrica: " << endl << endl;
    print(array);
 
    cout << endl;
    //транспонируем первым способом
    int temp;
    for(size_t i = 0; i < rows; i++)
    {
        for(size_t j = i; j < cols; j++)
        {
            temp = array[i][j];
            array[i][j] = array[j][i];
            array[j][i] = temp;
        }
    }
 
    //выводим на экран транспонированную матрицу
    cout << "Transponirovannaya matrica: " << endl << endl;
    print(array);
 
    cout << endl;
    //транспонируем вторым способом
    //объявляем новую матрицу
    int** transpArray;
    transpArray = new int*[rows];
    for (size_t i = 0; i<rows; ++i)
        transpArray[i] = new int[cols];
 
    for(size_t i = 0; i < rows; i++)
        for(size_t j = 0; j < cols; j++)
            transpArray[j][i] = array[i][j];
 
    //выводим на экран транспонированную матрицу
    cout << "Transponirovannaya matrica: " << endl << endl;
    print(transpArray);
    cout << endl;
 
    for(size_t i = 0; i < rows; i++)
    {
        delete[] array[i];
        delete[] transpArray[i];
    }
    delete[] array;
    delete[] transpArray;
 
    system("pause");
    return 0;
}
 
//функция, для вывода матрицы на экран
void print (int** array)
{
    for(size_t i = 0; i < rows; i++)
    {
        for(size_t j = 0; j < cols; j++)
            cout << setw(2) << array[i][j] << " ";
        cout << endl;
    }
}
smeaz
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 17
05.12.2012, 18:29  [ТС]     Динамическое выделение памяти #3
Спасибо большое!) Но у меня есть ещё второе задание(( Искренне надеюсь что сложным оно кажется только мне и вас не слишком напряжет.. Думаю лучше будет выложить его картинкой. Заранее спасибо!

 Комментарий модератора 
Запрещено размещать задания в виде картинок и других файлов с их текстом.
Запрещено создавать темы с множеством вопросов во всех разделах, кроме разделов платных услуг. Один вопрос - одна тема.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.12.2012, 19:00     Динамическое выделение памяти #4
Цитата Сообщение от smeaz Посмотреть сообщение
void print(int [][size2]);
массивы передают по указателям, размер отдельным параметром, если функция предназначена только для квадратных/кубических/гиперкубических массивов, то размер передаётся один. Если для параллелепипедальних с квадратной гранью и квадратная всегда ода, то два. Вообще передавай столько размеров, сколько могут различаться. В данном случае
C++
1
void print (int **, size_t);
и реализация
C++
1
2
3
4
5
6
7
8
9
10
11
12
void print (int **array, size_t size2)
{
   for(int i = 0; i < size1; i++)
   {
      for(int j = 0; j < size2; j++)
      {
         cout << setw(2) << 
         array[i][j] << " ";
      }
      cout << endl << endl;
   }
}
, это позволит одной функцией обрабатывать все массивы одного базового типа даже при несовпадающих размерах. Тем более у динамического массива размеры по определению переменны. Функции пофигу, динамиически выделен массив, или статически.
Цитата Сообщение от smeaz Посмотреть сообщение
int array[size1][size2] = {{ 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}};
* *int temp;
Это только декларация, использование дальше, а динамические данные явно удаляются после использования. Значит меняется ещё как минимум одно место. Динамически выделять имеет смысл только массив, а не интовый буфер, но в принципе можно и его. Перед выделением динамического массива надо вычислить, или ввести его размер.
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
//Транспонирование матрицы
 #include <iostream>
#include <iomanip.h>
using namespace std;
//прототип функции для вывода матрицы на экран
void print(int **, size_t);
int main()
{
 size_t size2;
 size_t row;
 int **array;
 int *temp;
 cin>>size2;
 //Создаём саму матрицу
 array=new int *[size2];
 //Перебираем строки матрицы
 for (row=size2-1; row<size2; --row)
 {
  //Создаём строку матрицы
  array[row]=new int [size2];
 }
 // Создаём перменную temp
 //выводим на экран исходную матрицу
 cout << "Исходная матрица" << endl << endl;
 print(array, size2);     
 cout << endl;
 //транспонируем первым способом
 for(int i = 0; i < size2; i++)
 {
  for(int j = i; j < size2; j++)
  {
   *temp = array[i][j];
   array[i][j] = array[j][i];
   array[j][i] = *temp;
  }
 }   
 //выводим на экран транспонированную матрицу
 cout << "Транспонированная матрица: " << endl << endl;
 print(array);
 cout << endl;
 //транспонируем вторым способом
 //объявляем новую матрицу
 int **transpArray; 
 transpArray=new int *[size2];
 //Перебираем строки матрицы
 for (row=size2-1; row<size2; --row)
 {
  //Создаём строку матрицы
  transpArray[row]=new int [size2];
 }
 for(int i = 0; i < size2; i++)
      for(int j = 0; j < size2; j++)
         transpArray[j][i] = array[i][j];         
 //выводим на экран транспонированную матрицу
 cout << "Транспонированная матрица: " << endl << endl;
 print(transpArray, size2);
 cout << endl;
 //перебираем строки матриц
 for (row=size2-1; row<size2; --row)
 {
  //удаляем строки матриц
  delete [] array[row];
  delte [] transpArray[row];
 }
 //удаляем сами матрицы
 delete [] array;
 delte [] transpArray;
 //удаляем переменную temp
 delete temp;
 // так, как функция main не void, то что то надо вернуть
 return 0;
}
    
//функция, для вывода матрицы на экран
void print (int **array, size_t size2)
{
   for(int i = 0; i < size1; i++)
   {
      for(int j = 0; j < size2; j++)
      {
         cout << setw(2) << 
         array[i][j] << " ";
      }
      cout << endl << endl;
   }
}
Первым способом не квадратную матрицу транспонировать нельзя, так как у неё меняются оба размера, сохраняются только их сумма и произведение. Да, меняются местами. Но это значения не имеет, они всё равно меняются. Поэтому два размера тебе ни как, только один.

Добавлено через 2 минуты
Цитата Сообщение от smeaz Посмотреть сообщение
Спасибо большое!) Но у меня есть ещё второе задание(( Искренне надеюсь что сложным оно кажется только мне и вас не слишком напряжет.. Думаю лучше будет выложить его картинкой. Заранее спасибо!

Запрещено размещать задания в виде картинок и других файлов с их текстом.
Запрещено создавать темы с множеством вопросов во всех разделах, кроме разделов платных услуг. Один вопрос - одна тема.
Вложение не существует, прочитать нельзя. Кроме того, с тёмно-жёлтого фона и так то читать не очень, так ещё и двойное растрирование наложится. Причём, глупое, без учёта того, что это текст. Набери задание в пост.
smeaz
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 17
05.12.2012, 19:05  [ТС]     Динамическое выделение памяти #5
Вообще, первоначальный текст задания звучал так: "Транспонировать матрицу случайных действительных чисел, размер которой и диапазон случайных значений вводится с клавиатуры". Возможно я не совсем ту прогу копирнул что нужно, ибо, повторюсь, в c++ полный ноль и вообще впервые сталкиваюсь с языком программирования. Динамическую память препод попросил сделать уже после того как я ему показал этот код, видимо спалив что я тупо скопировал из инета. Так к чему я это, возможно есть более простое решение, удовлетворяющее задание и использующее это динамическое выделение памяти.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.12.2012, 19:36     Динамическое выделение памяти #6
Я её ввести забыл.
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
//Транспонирование матрицы
 #include <iostream>
#include <iomanip.h>
using namespace std;
//прототип функции для вывода матрицы на экран
void print(int **, size_t);
int main()
{
 size_t size2;
 size_t row;
 int **array;
 int *temp;
 cin>>size2;
 int min, max;
 //Создаём саму матрицу
 array=new int *[size2];
 //Перебираем строки матрицы
 for (row=size2-1; row<size2; --row)
 {
  //Создаём строку матрицы
  array[row]=new int [size2];
 }
 // Создаём перменную temp
 // вводим пределы
 cin>>min;
 cin>>max;
 //генерим матрицу
 for(int i = 0; i < size2; i++)
 {
  for(int j = i; j < size2; j++)
  {
   array[i][j]=rnd%(max-min+1)+min;
  }
 }
 //выводим на экран исходную матрицу
 cout << "Исходная матрица" << endl << endl;
 print(array, size2);     
 cout << endl;
 //транспонируем первым способом
 for(int i = 0; i < size2; i++)
 {
  for(int j = i; j < size2; j++)
  {
   *temp = array[i][j];
   array[i][j] = array[j][i];
   array[j][i] = *temp;
  }
 }
 //выводим на экран транспонированную матрицу
 cout << "Транспонированная матрица: " << endl << endl;
 print(array);
 cout << endl;
 //транспонируем вторым способом
 //объявляем новую матрицу
 int **transpArray; 
 transpArray=new int *[size2];
 //Перебираем строки матрицы
 for (row=size2-1; row<size2; --row)
 {
  //Создаём строку матрицы
  transpArray[row]=new int [size2];
 }
 for(int i = 0; i < size2; i++)
      for(int j = 0; j < size2; j++)
         transpArray[j][i] = array[i][j];         
 //выводим на экран транспонированную матрицу
 cout << "Транспонированная матрица: " << endl << endl;
 print(transpArray, size2);
 cout << endl;
 //перебираем строки матриц
 for (row=size2-1; row<size2; --row)
 {
  //удаляем строки матриц
  delete [] array[row];
  delte [] transpArray[row];
 }
 //удаляем сами матрицы
 delete [] array;
 delte [] transpArray;
 //удаляем переменную temp
 delete temp;
 // так, как функция main не void, то что то надо вернуть
 return 0;
}
    
//функция, для вывода матрицы на экран
void print (int **array, size_t size2)
{
   for(int i = 0; i < size1; i++)
   {
      for(int j = 0; j < size2; j++)
      {
         cout << setw(2) << 
         array[i][j] << " ";
      }
      cout << endl << endl;
   }
}
Добавлено через 55 секунд
Полный ноль и прогу из первого поста не напишет, а вот на произведение начинающего прогера она похожа.
smeaz
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 17
05.12.2012, 19:55  [ТС]     Динамическое выделение памяти #7
Цитата Сообщение от taras atavin Посмотреть сообщение
Полный ноль и прогу из первого поста не напишет, а вот на произведение начинающего прогера она похожа.
Говорю же, нагло копирнул из инета её)

Добавлено через 13 минут
taras atavin, А чем плох вариант пользователя yuron_477? Он, кстати, исправил строку #include <iomanip.h> на #include <iomanip>, что говорит о том, что он прогу-то протестировал!
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.12.2012, 20:13     Динамическое выделение памяти #8
Начнём с того, что size1 и size2 имеют семантику размеров массива, оставлены константами, а только переименовал, а у динамического массива это по определению переменные. Так что прогу он может и тестировал, зато вдумчиво не читал. Сказано же: размеры матрицы и диапазон её элементов вводятся с клавиатуры. Так что формальной динамики не достаточно, нужна реальная.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2012, 20:16     Динамическое выделение памяти
Еще ссылки по теме:

Динамическое выделение памяти C++
Динамическое выделение памяти C++

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

Или воспользуйтесь поиском по форуму:
smeaz
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 17
05.12.2012, 20:16  [ТС]     Динамическое выделение памяти #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Начнём с того, что size1 и size2 имеют семантику размеров массива, оставлены константами, а у динамического массива это по определению переменные. Так что прогу он может и тестировал, зато не читал.
Что ж, спасибо большое за грамотную и квалифицированную помощь!)
Yandex
Объявления
05.12.2012, 20:16     Динамическое выделение памяти
Ответ Создать тему
Опции темы

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