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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Циркулянты http://www.cyberforum.ru/cpp-beginners/thread720423.html
Помогите пж. написать код :)) Добавлено через 15 минут По заданному вектору а=(a0,a1...,an-1) построить циркулянтную матрицу (nxn) A,у которой первая строка совпадает с а, а каждая последующая строка есть циклический сдвиг (влево) предыдущей строки.
C++ Обработка целочисленного вектора Помогите пж. написать код http://www.cyberforum.ru/cpp-beginners/thread720419.html
Десятичное представление заданного числа C++
Помогите написать код:
Дан целочисленный массив размера N. Сжать массив, удалив из него все элементы, модуль которых не превышает 1 C++
Помогите пожалуйста написать программу. Дан целочисленный массив размера N. Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Примечания: массив вводиться с клавиатуры, N задается в виде константы в исходном коде программы.
C++ Дано действительное число х, натуральное число n. Вычислить:* http://www.cyberforum.ru/cpp-beginners/thread720411.html
x ( x - n )( x - 2 n )( x - 3 n )…( x - n2 ) Добавлено через 6 часов 5 минут жду решения ответьте плиз
C++ Как вывести массив в обратном порядке? Нужно задать массив, найти его центр и вывести его ещё раз в обратном порядке. С последним никак не могу разобраться. #include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; int _tmain(int argc, _TCHAR* argv) {const int SIZE = 9; подробнее

Показать сообщение отдельно
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.12.2012, 19:00     Динамическое выделение памяти
Цитата Сообщение от 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 Посмотреть сообщение
Спасибо большое!) Но у меня есть ещё второе задание(( Искренне надеюсь что сложным оно кажется только мне и вас не слишком напряжет.. Думаю лучше будет выложить его картинкой. Заранее спасибо!

Запрещено размещать задания в виде картинок и других файлов с их текстом.
Запрещено создавать темы с множеством вопросов во всех разделах, кроме разделов платных услуг. Один вопрос - одна тема.
Вложение не существует, прочитать нельзя. Кроме того, с тёмно-жёлтого фона и так то читать не очень, так ещё и двойное растрирование наложится. Причём, глупое, без учёта того, что это текст. Набери задание в пост.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru