2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
1

Массив произвольной размерности и работа с ним

20.03.2013, 11:05. Показов 4448. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Появилась интересная задача: создать функцию для создания массива, размерность которого укажут в ходе программы(то есть не a[n] и n укажут-а а[q1][q2][q3][q4]..., и q1,q2... укажут, как и количество этих q, уже в процессе выполнения программы) и поменять местами первый с последним, второй с предпоследним и так далее элементы. Вопрос в следующем: как, собственно, создать такой массив, как сделать необходимое (изначально неизвестное) количество вложенных циклов для затрагивания всех элементов массива? Если вариантов несколько-то лучше самый простой и быстродейственный

З.Ы. Для количества вложенных циков-на ум приходит эллипсис, хотя с ним и гемор. А вот идей по созданию массива полный 0.
З.З.Ы. Создать строку вместо массива не предлагать-индусский код не для меня.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2013, 11:05
Ответы с готовыми решениями:

Работа с матрицами произвольной размерности. Создать функцию, которая для произвольной матрицы вычисляет
a)количество столбцов, содержащих данный элемент b) и еще что бы что нибудь считала, не важно но...

Работа с матрицами произвольной размерности. Создать функцию, которая для произвольной матрицы вычисляет:
а) максимальную сумму по столбцам б) количество минимальных элементов массива Распишите...

Работа с матрицами произвольной размерности. Создать функцию, которая для произвольной матрицы вычисляет
а) номер столбца, в котором расположен максимальный элемент б) сумму минимальных элементов в...

работа с матрицами произвольной размерности
Помогите пожалуйста,с заданием. Заранее большое спасибо.

35
Почетный модератор
7390 / 2636 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.03.2013, 11:09 2
Задача не интересная. Это даже не задача. Самое обычное выделение динамической памяти. new. Кол-во циклов у тебя уже известно, когда пользователь задаст размер массива.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.03.2013, 11:12 3
Создать одномерный массив, размерности N = q1*q2*...*qn. А для доступа по n-мерным координатам сделать обертку, принимающую Point<N>.
0
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 11:29  [ТС] 4
Vourhey, не смешно. Как выделять память через new я знаю, вопрос в том как создать массив произвольной РАЗМЕРНОСТИ а не РАЗМЕРА. То есть могут задать a[q1] а могут a[q1][q2][q3][q4][q5]...[q100500].
Tulosba, просил же не предлагать строку. Это не вариант.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.03.2013, 11:41 5
Цитата Сообщение от JollyRoger Посмотреть сообщение
просил же не предлагать строку
У Вас, видимо, какое-то странное понятие "строки".
0
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 11:46  [ТС] 6
Под строкой я имел в виду одномерный массив.
0
250 / 232 / 46
Регистрация: 05.02.2010
Сообщений: 3,288
20.03.2013, 12:40 7
насколько я понимаю, произвольной размерности, нельзя создать
0
7 / 7 / 1
Регистрация: 21.01.2013
Сообщений: 55
20.03.2013, 12:50 8
Вам лучше ознакомиться с STL - Vector.
И не придется создавать велосипед.
0
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 12:54  [ТС] 9
Да я знаком. Вектор отличается от динамического массива тем, что можно количество элементов менять после того, как он создан, и тем, что для обмена элементов можно менять ссылки на них. Это не устраняет ни одной из 2х моих задач(создание многомерного массива и операции над ним).
0
5231 / 3203 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
20.03.2013, 13:01 10
Кажется я понял, что нужно. По-моему тут рекурсия будет хорошим вариантом с точки зрения простоты реализации.
1
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 13:23  [ТС] 11
Функция-рекурсия и для создания массива(используя то что ссылка на w[0]=*w) и для операций с ним, которая вызывает себя в цикле, но каждый раз уменьшая размерность на 1, и начинающая реальные операции только когда доходит до размерности в 1, то есть до строки...
Непросто, но да ладно. Есть только одна загвоздка в таком случае: w[0][0][0]=***w. И сколько этих звёздочек будет в массиве, знать заранее нельзя(размерность же). Как в таком случае передать ссылку на массив какой-то функции(в моём случае, функции перестановки)?

CollSpack, я и не хочу создавать велосипед, поэтому и написал сюда
0
5231 / 3203 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
20.03.2013, 13:27 12
Цитата Сообщение от JollyRoger Посмотреть сообщение
Есть только одна загвоздка в таком случае: w[0][0][0]=***w. И сколько этих звёздочек будет в массиве, знать заранее нельзя. Как в таком случае передать ссылку на массив функции?
Ну можно передавать *ptr, по сути без разницы. Разница будет только на последнем этапе, когда нужно будет выделять память непосредственно под тип данных, но это тоже решаемо.
P.S. ты путаешь указатели и ссылки.
0
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 13:39  [ТС] 13
Да я их вообще не различаю(указатели и ссылки) :о Разве это не одно и то же?
всмысле *ptr? Я знаю только один метод правильно послать массив n-той размерности в функцию: послать указатель n-той степени(то есть (n)w, вместо (n)-нужное количество звёздочек)+размерность отдельно посылать. Есть альтернатива части с n-тым количеством звёздочек?
0
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
20.03.2013, 13:51 14
Ссылка должна быть прикреплена к конкретному объекту, а указатель может быть сам по себе.
0
5231 / 3203 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
20.03.2013, 13:52 15
Цитата Сообщение от JollyRoger Посмотреть сообщение
Разве это не одно и то же?
Нет, скажем так: ссылки - это удобные указатели (с некоторыми ограничениями)


Цитата Сообщение от JollyRoger Посмотреть сообщение
Я знаю только один метод правильно послать массив n-той размерности в функцию: послать указатель n-той степени(то есть (n)w, вместо (n)-нужное количество звёздочек)+размерность отдельно посылать. Есть альтернатива части с n-тым количеством звёздочек?
На самом деле пока память выделяется под указатели совсем не важно сколько звездочек. Т.е. в рекурсии в каждом вызове можно использовать указатель с 2 звездочками, этого будет достаточно.
Другое дело что потом работать с этим N-мерным массивом хз как, если только опять через рекурсию, и то там костыли городить придеться.
0
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 14:26  [ТС] 16
Окей-с, попробуем...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
**char arr_create(char* IdOfType, char **atop, int *dim_arr, int dim, int curr_dim=0){
//IdOfType-пока не нужен, для простоты будем создавать массив int'ов
//atop-ссылка большей на 1 размерности, чем наша. a[7] это atop от a[7][x];
//dim_arr-массив интов, содержит размерности массива
//dim-количество размерностей
//curr_dim-размерность в которой работаем, если не задано то 0
 int i;
 if(dim==curr_dim-1){   //то есть если это последняя размерность, ниже спускаться некуда. тут создаём строку int'ов.
  int **asdf=new int[dim_arr[curr_dim]];
  return asdf;
 }
 //else не пишу, return завершит выполнение функции если будет тот случай
 for(i=0;i<dim_arr[curr_dim];i++) arr_create(IdOfType, atop[i], dim_arr, dim, curr_dim+1);
}
Что-то вроде этого?) мне выдаёт ошибку "expected unqualified-id before 'char' " в первой строке функции. Вообще не совсем понял схему передачи ссылок с **...
0
Почетный модератор
7390 / 2636 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.03.2013, 14:30 17
**char
что это?
0
Tulosba
20.03.2013, 14:40
  #18

Не по теме:

Цитата Сообщение от Vourhey Посмотреть сообщение
**char
что это?
Это значит: сначала надо освоить инструмент, а потом уже этим инструментом что-то делать.

0
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 14:48  [ТС] 19
Это указатель на указатель на чар. Как я понял, Kastaneda имел в виду что у нас есть (n)w, где (n)-нужное количество звёздочек, и это указатель. Как *w его передать нельзя, но если сделать указатель на него-выйдет **r, и его уже можно передавать. Хотя я считаю, что если r-указатель на (n)w, то это будет (n+1)r, а не (2)r.
хз вообще
0
Почетный модератор
7390 / 2636 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.03.2013, 14:50 20
Цитата Сообщение от JollyRoger Посмотреть сообщение
Это указатель на указатель на чар.
Это не он.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2013, 14:50
Помогаю со студенческими работами здесь

Работа с матрицами произвольной размерности
Создать функцию которая для произвольной матрицы вычисляет: А) номер столбца в котором расположен...

Работа с матрицами произвольной размерности:
Работа с матрицами произвольной размерности: Создать функцию которая для произвольной матрицы:а)...

Дан двумерный массив произвольной размерности
Попросили сделать, не очень шарю в VBA. Прошу помочь. Дан двумерный массив произвольной...

Как в классе реализовать массив произвольной размерности?
Доброго времени суток. Написал класс, который создает одно-дву-трех мерные массивы с возможностью...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru