0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
|
|
1 | |
Создать массив с n-ым количеством измерений27.09.2016, 06:44. Показов 4176. Ответов 54
Метки нет (Все метки)
Всем привет,
Задали мне в универе проект и я не могу никак с ним разобратся. Суть: задается в cin по шаблону (тип в скобках) имя массива (string) количество измерений dim (int) количество елементов в каждом измерении(лист intoв через комму) цифры которые нужно поместить в массив, через комму. Получается что-то такое А 2 2,3 1,2,3,4,5,6 - создает двухмерную матрицу 2 строки 3 столбца. B 3 3, 2, 3 ... - трехмерную матрицу 3 на 2 на 3. Если dim = 1 создается вектор, 0 - скаляр. Проблема заключается в том,что моя программа должна работать для любого номера измерений. Тоесть при dim =4 должна получатся 4х-мерная матрица, при 5 - 5-мерная и так далее. Я мог бы написать код для каждого случая отдельно если б я знал что максимум измерений будет 5,например. Но я не знаю,сколько их будет. Собственно мой вопрос: возможно ли написать код который создаст n-размерную матрицу, в зависимости от значение которое пользователь введет? Я чувствую,что есть какой-то способ это сделать.. Но не могу додуматся какой) Помогите пожалуйста.
0
|
27.09.2016, 06:44 | |
Ответы с готовыми решениями:
54
Создать массив с неизвестным количеством ячеек Как создать массив с неизвестным количеством элементов Создать с помощью new динамический массив с указанным количеством элементов Создать динамический массив с количеством элементов, которое вводит пользователь |
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
|
|
27.09.2016, 17:30 [ТС] | 21 |
Ну я понимаю, но в мейне у вас 3 цикла для 3хмерного массива, и я не понимаю как их адаптировать к любому количеству изменений
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
27.09.2016, 17:33 | 22 |
А вот так не надо, пожалуйста. Такие слова надо обосновывать. А обосновать их ой как трудно!
Могу даже предположить, что понятие единственно правильного существует только в политике. И то только потому, что вся политика построена на лжи.
0
|
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
|
||||||
27.09.2016, 17:35 | 23 | |||||
На циклы внимания не обращать:
Это то же самое, что и m[3][1][7] = 999, если использовать возможности компилятора; Так понятно ??
0
|
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
|
|
27.09.2016, 18:14 [ТС] | 25 |
Хорошо, буду ждать
0
|
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
|
||||||
27.09.2016, 18:29 | 26 | |||||
Слегка упростил код. Вот что получилось:
0
|
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
|
|
27.09.2016, 18:36 [ТС] | 27 |
Сейчас еще более непонятно получилось.... А где dimensions теперь? И что n=0 в мейне делает?
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
||||||
27.09.2016, 18:40 | 28 | |||||
Ну вот, в спешке навалял кое-что. Возможны ошибки, и вообще это псевдокод и демонстрация идеи
Кликните здесь для просмотра всего текста
Сейчас меня ждут другие великие дела. Буду рад услышать ваши замечания. Повторяю - проект не закончен.
0
|
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
|
|
27.09.2016, 18:43 | 29 |
n - это переменная счетчик, каждое значение которой присваивается элементу многомерного массива. Напр.: nds[2,3,1] = n;
Далее, в данному примере, количество измерений dimensions не принципиально. Вы просто формируете строку std::string а не массив std::vector. В строку записываются данные в следующем формате: string s_args = "2,3,1" - это эквивалентно nds[2][3][1] = n трехмерного массива созданного на уровне компилятора. Добавлено через 1 минуту Байт, в данном случае Вы как и я допускаете принципиальную ошибка усложняя код. (см. мой пример выше).
0
|
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
|
|
27.09.2016, 19:19 [ТС] | 30 |
Спасибо за помощь. Приду домой - попробую оба варианта.
Байт, операции стандартные + - * / % а также max и min. Они будут сложнее?
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
27.09.2016, 19:48 | 31 |
Умножение в каком смысле? Если поэлементное, то ничем не сложнее сложения. А если как матриц... Правда, я не знаю как умножаются матрицы размерности больше двух
Вообще все поэлементные операции так же просты, как и сложение. Возможно. Как я уже сказал, делал впопыхах. Уже вижу более простые, понятные и безопасные конструкции.
0
|
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
|
|
28.09.2016, 04:30 [ТС] | 32 |
Invader: ваша программа не работает если изменить колличество dimensions либо N
Байт, до меня, вроде бы, доходит. Но можете подробнее свой код описать? Например у меня есть массив значений для двухмерной матрицы размерами 2х3: 1,2,3,4,5,6. Если я использую create(2) с вашего кода, то создам двухмерный массив, но как мне потом эти значения перевести в него на правильные места? Меня еще очень запутывает то, какая переменная у вас за что отвечает. Если вы б могли уточнить - был бы оочень благодарен
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||||||
28.09.2016, 06:38 | 33 | |||||
0
|
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
|
||||||
28.09.2016, 07:56 [ТС] | 34 | |||||
Mr.X Спасибо, попробую ваш код и отпишусь!
Байт можете еще рассказать как именно ваша функция setVal устанавливает значения в массиве? Например мне нужно создать 2хмерный 2х3 массив, и у меня есть 6 значений который должны в нем быть (1,2,3,4,5,6) - куда мои значения идут в вашей функции? И как мне потом получить индекс к каждому из элементов? Напоследок хотел бы показать код, который я написал для 3х измерений максимум
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|||||||||||
28.09.2016, 10:40 | 35 | ||||||||||
Это не дело, конечно. Мой подход как раз позволяет этого избежать. Я немного модифицировал свой код. Сделал его естественнее, что-ли. Может быть будет понятнее. Подожди немного...
Добавлено через 5 минут Идея в том, чтобы "вытянуть" многомерный массив в одномерный. Собственно, так и поступает транслятор. Когда он видит mas[2][3] = { {1,2,3}, {4,5,6}} он его фактически заменяет на m[6] = { 1, 2, 3, 4, 5, 6 }; И вместо mas[i][j] берет m[3*i+j] Добавлено через 10 минут Кликните здесь для просмотра всего текста
Добавлено через 54 секунды Это для 5-мерного массива Добавлено через 15 минут А это для твоего примерчика 2 х 3
Не проверял. Возможны ошибки. Буду благодарен за их обнаружение (а еще больше - за исправление)
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||||||
28.09.2016, 12:59 | 36 | |||||
Реализовал функцию print:
0
|
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
|
|
28.09.2016, 17:23 [ТС] | 37 |
Mr.X а у Вас тоже для максимум 3 измерений? В мейне я вижу 3 цикла для 3хмерной структуры, 1 цикл для одномерной... Все как в моей.. или я что-то пропустил?
Добавлено через 11 минут Байт а ваша setVal назначает каждому элементу значение Val? Его можно переписать чтобы каждый элемент соответвующие значение получал? Как в моем 2х3 = [ [1,2,3] [4,5,6]]. И потом, если я хочу добавить каждый элемент, то я делаю Val[0][1] + Val[0][2] и тд.. но если у меня все в одном массиве, как в вашем примере, и мне нужно получить доступ к элементу val[0][2], как мне знать где он находится в одномерном массиве a[X]?
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
28.09.2016, 17:40 | 38 |
Не, у меня для любого количества измерений. А эти циклы исключительно для демонстрации доступа к элементам матрицы по индексам, которые задаются списком в фигурных скобках.
Печать матрицы производится функцией print, которую надо еще доработать чуть-чуть.
0
|
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
|
|
28.09.2016, 17:44 [ТС] | 39 |
Mr.X
А как можно получить доступ если я задам 4 измерений, например к элементу [0][2][2][1]?
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
28.09.2016, 17:53 | 40 |
0
|
28.09.2016, 17:53 | |
28.09.2016, 17:53 | |
Помогаю со студенческими работами здесь
40
Создать и заполнить одномерный массив случайным количеством случайных элементов Как правильно создать массив с заданным в ручную количеством элементов в массиве Необходимо создать двумерный массив с количеством строк равным количеству полученных узлов xml документа. создать сценарий который формирует массив степеней числа два с ключами равными соответствующим показателям степени с количеством элементов меньше пере Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |