С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.59
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
#1

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

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

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

З.Ы. Для количества вложенных циков-на ум приходит эллипсис, хотя с ним и гемор. А вот идей по созданию массива полный 0.
З.З.Ы. Создать строку вместо массива не предлагать-индусский код не для меня.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2013, 11:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив произвольной размерности и работа с ним (C++):

Матрица произвольной размерности - C++
Разработать класс, объект которого реализует «пользовательский» тип данных. Обеспечить его произвольную размерность за счет использования в...

Матрица произвольной размерности - C++
Матрица произвольной размерности, представленная размерностями и линейным динамическим массивом коэффициентов матрицы, в котором она...

Даны две матрицы произвольной размерности - C++
При выполнении этого задания необходимо написать две функции. Одна из этих функций должна получать и обрабатывать матрицу целиком. Другая...

Характеристический многочлен матрицы произвольной размерности - C++
не могу придумать как реализовать характеристический многолчен: дана матрица :\begin{pmatrix}3 &1 \\ 2 &4 \end{pmatrix} нужно найти ее...

Разработать класс Vector – геометрический вектор произвольной размерности - C++
Разработать класс Vector – геометрический вектор произвольной размерности (размерность задается в конструкторе вектора). Реализовать метод...

9. Матрица произвольной размерности, представленная раз* мерностями и динамическим массивом указателей на динамиче* ские массивы - строки матрицы. - C++
Всем привет!помогите пожалуйста с задачей. Матрица произвольной размерности, представленная раз* мерностями и динамическим массивом...

35
JollyRoger
2 / 2 / 0
Регистрация: 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
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
20.03.2013, 14:30 #17
**char
что это?
0
Tulosba
20.03.2013, 14:40
  #18

Не по теме:

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

0
JollyRoger
2 / 2 / 0
Регистрация: 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
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
20.03.2013, 14:50 #20
Цитата Сообщение от JollyRoger Посмотреть сообщение
Это указатель на указатель на чар.
Это не он.
0
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 14:53  [ТС] #21
Окей, есть предложения как правильней сделать?)
0
Vourhey
20.03.2013, 15:00
  #22

Не по теме:

На меня не смотри. Я вообще не понял, че те надо, поэтому предложений нет и не будет.

0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
20.03.2013, 15:02 #23
Я имел ввиду нечто следующее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void recursion (char **p, int size, int depth)
{
   if (!depth) return;
   for (int i = 0; i < size; i++) {
      p[i] = (char*)new char*[size];
   }
   
   for (int i = 0; i < size; i++) {
      recursion((char**)p[i], size, depth-1);
   }
}
 
int main ()
{
   char **ptr = new char*[10];
   recursion (ptr, 10, 5);
}
вообще я не уверен, что там правильно, т.к. под вечер на работе голова закипает, да и думать уже лень, но направление мысли должно быть понятно.
1
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 15:51  [ТС] #24
хитро...
а преобразование
Цитата Сообщение от Kastaneda Посмотреть сообщение
(char**)p[i]
прокатит? ведь у нас получается в итоге(с глубиной 5) шестикратный *
и тут вроде как нет создания элементов на самой низкой глубине, вернее они создаються как массив из 10 *чаров тоже. но это уже мелочи
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
20.03.2013, 16:46 #25
Цитата Сообщение от JollyRoger Посмотреть сообщение
Доброго времени суток. Появилась интересная задача: создать функцию для создания массива, размерность которого укажут в ходе программы(то есть не a[n] и n укажут-а а[q1][q2][q3][q4]..., и q1,q2... укажут, ка
на плюсах типизация строгая, такое безобразие не допускается.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
20.03.2013, 16:52 #26
Рекурсия с шаблонами
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.03.2013, 16:54 #27
Цитата Сообщение от MrGluck Посмотреть сообщение
Рекурсия с шаблонами
некатит ибо
Цитата Сообщение от JollyRoger Посмотреть сообщение
то есть не a[n] и n укажут-а а[q1][q2][q3][q4]..., и q1,q2... укажут, как и количество этих q, уже в процессе выполнения программы
а в рантайме такого не сделать, только как уже предлагали выше - встроку
0
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 17:27  [ТС] #28
Kastaneda, не прокнуло преобразование типа. а жаль
Хм. Можно, в принципе, сделать struct'ы ctruct'ов... Но это уже не торт.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
20.03.2013, 17:45 #29
Цитата Сообщение от JollyRoger Посмотреть сообщение
Kastaneda, не прокнуло преобразование типа. а жаль
Всмысле? Вот рабочий пример
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
#include <iostream>
 
const int size = 3;
 
void createArray (char **p, int depth)
{
   if (depth == 1) {
        char ch = 'a';
        for (int i = 0; i < size; i++) {
            ((char*)p)[i] = ch + i;
        }
        return;
   }
 
   for (int i = 0; i < size; i++) {
      p[i] = (char*)new char*[size];
   }
   
   for (int i = 0; i < size; i++) {
      createArray((char**)p[i], depth-1);
   }
}
 
int main ()
{
   char **ptr = new char*[size];
   createArray (ptr, size);
 
   for (int i = 0; i < size; i++) {
       for (int j = 0; j < size; j++) {
           for (int k = 0; k < size; k++) {
               std::cout << ((char***)ptr)[i][j][k] << " ";
           }
           std::cout << std::endl;
       }
       std::cout << std::endl;
   }
}
вывод
Bash
1
2
3
4
5
6
7
8
9
10
11
a b c
a b c
a b c
 
a b c
a b c
a b c
 
a b c
a b c
a b c
имеем указатель на указатель (т.е. как бы двумерный массив), но делаем из него 3 мерный. По идее число size можно вводить с клавиатуры, все будет работать. Только вывод массива уже захардкодить неполучиться (как сейчас - тройной цикл), придется тоже через рекурсию делать.

Добавлено через 4 минуты
как вариант - меняем size на 4 и вывод хардкодим вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
   for (int i = 0; i < size; i++) {
       for (int j = 0; j < size; j++) {
           for (int k = 0; k < size; k++) {
               for (int n = 0; n < size; n++) {
                    std::cout << ((char****)ptr)[i][j][k][n] << " ";
               }
               std::cout << std::endl;
           }
           std::cout << std::endl;
       }
       std::cout << std::endl;
   }
вывод
Кликните здесь для просмотра всего текста
Bash
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
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
 
a b c d
a b c d
a b c d
a b c d
2
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
20.03.2013, 18:10 #30
Это все равно не рантайм вариант, количество звездочек не удастся скрыть, и в рантайме создатаь удастся лишь массив такого размера, которые был запланирован изначально.
Более простой вариант на C++11:
http://liveworkspace.org/code/MrwgF
0
20.03.2013, 18:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2013, 18:10
Привет! Вот еще темы с ответами:

Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля. - C++
Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля.

Из двух целочисленных массивов различной размерности сформировать общий массив. Упорядочить полученный массив - C++
Кто может сделайте пожалуйста. Из двух целочисленных массивов различной размерности сформировать общий массив. Упорядочить полученный...

Массив размерности n+m - C++
Даны два упорядоченных числовых массива размерности n и m. Получить из них новый упорядоченный массив размерности n+m, не используя...

Стек и работа с ним - C++
Добрый вечер! Мне дали задания: 1. Написать функцию для удаления всех элементов с четными номерами из односвязного списка 2....


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

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

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