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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.59
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 11:05     Массив произвольной размерности и работа с ним #1
Доброго времени суток. Появилась интересная задача: создать функцию для создания массива, размерность которого укажут в ходе программы(то есть не a[n] и n укажут-а а[q1][q2][q3][q4]..., и q1,q2... укажут, как и количество этих q, уже в процессе выполнения программы) и поменять местами первый с последним, второй с предпоследним и так далее элементы. Вопрос в следующем: как, собственно, создать такой массив, как сделать необходимое (изначально неизвестное) количество вложенных циклов для затрагивания всех элементов массива? Если вариантов несколько-то лучше самый простой и быстродейственный

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

C++ Даны две матрицы произвольной размерности
9. Матрица произвольной размерности, представленная раз* мерностями и динамическим массивом указателей на динамиче* ские массивы - строки матрицы. C++
Матрица произвольной размерности C++
Матрица произвольной размерности C++
Разработать класс Vector – геометрический вектор произвольной размерности C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 14:53  [ТС]     Массив произвольной размерности и работа с ним #21
Окей, есть предложения как правильней сделать?)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
20.03.2013, 15:00
  #22

Не по теме:

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

Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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);
}
вообще я не уверен, что там правильно, т.к. под вечер на работе голова закипает, да и думать уже лень, но направление мысли должно быть понятно.
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 15:51  [ТС]     Массив произвольной размерности и работа с ним #24
хитро...
а преобразование
Цитата Сообщение от Kastaneda Посмотреть сообщение
(char**)p[i]
прокатит? ведь у нас получается в итоге(с глубиной 5) шестикратный *
и тут вроде как нет создания элементов на самой низкой глубине, вернее они создаються как массив из 10 *чаров тоже. но это уже мелочи
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.03.2013, 16:46     Массив произвольной размерности и работа с ним #25
Цитата Сообщение от JollyRoger Посмотреть сообщение
Доброго времени суток. Появилась интересная задача: создать функцию для создания массива, размерность которого укажут в ходе программы(то есть не a[n] и n укажут-а а[q1][q2][q3][q4]..., и q1,q2... укажут, ка
на плюсах типизация строгая, такое безобразие не допускается.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
20.03.2013, 16:52     Массив произвольной размерности и работа с ним #26
Рекурсия с шаблонами
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 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, уже в процессе выполнения программы
а в рантайме такого не сделать, только как уже предлагали выше - встроку
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 17:27  [ТС]     Массив произвольной размерности и работа с ним #28
Kastaneda, не прокнуло преобразование типа. а жаль
Хм. Можно, в принципе, сделать struct'ы ctruct'ов... Но это уже не торт.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
20.03.2013, 18:10     Массив произвольной размерности и работа с ним #30
Это все равно не рантайм вариант, количество звездочек не удастся скрыть, и в рантайме создатаь удастся лишь массив такого размера, которые был запланирован изначально.
Более простой вариант на C++11:
http://liveworkspace.org/code/MrwgF
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.03.2013, 18:14     Массив произвольной размерности и работа с ним #31
Цитата Сообщение от Герц Посмотреть сообщение
и в рантайме создатаь удастся лишь массив такого размера, которые был запланирован изначально.
в моем примере size можно смело вводить с клавиатуры (для создания массива, вывод конечно же сломается).
Цитата Сообщение от Герц Посмотреть сообщение
количество звездочек не удастся скрыть
Если вывод массива сделать в аналогичной рекурсии, то кол-во звездочек не важно.

Все это дело можно преобразовать в полноценный рантайм вариант.
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 19:26  [ТС]     Массив произвольной размерности и работа с ним #32
Хм, не знаю почему у тебя запустилось а у меня нет
C++
1
2
3
4
5
6
7
8
9
10
11
void arr_create(string IdOfType, char **atop, int *dim_arr, int dim, int curr_dim){
 int i;
 if(dim==curr_dim-1){
  int *asdf=new int[dim_arr[curr_dim]];
  return;
 }
 for(i=0;i<dim_arr[curr_dim];i++){
  atop[i]=(char*)new char*[dim_arr[curr_dim+1]];
  arr_create(IdOfType, (char**)atop[i], dim_arr, dim, curr_dim+1);
 }
}
Вот код моей функции. Буду эксперементировать, в общем.
IrineK
Заблокирован
21.03.2013, 04:34     Массив произвольной размерности и работа с ним #33
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
39
40
41
#include <iostream>
using namespace std;
 
const int N = 3;
void multiArray (int **P, int depth)
{   int n = 1;
    if (depth == 1) 
    {   for (int i = 0; i < N; i++) 
        {   ((int*)P)[i] = n + i;
            cout<<((int*)P)[i]<<"\t";
         }
         cout<<"\n";
             return;
    }
   for (int i = 0; i < N; i++) 
     P[i] = (int*)new int*[N];
    cout<<"---------------------------------------\n";
 
   for (int i = 0; i < N; i++) 
       multiArray((int**)P[i], depth-1);
 }
 
 
int main()
{   int depth;
    int **S = new int*[N];
    
    cout<<"\nThe second layer\n";
    depth = 2;
    multiArray(S,depth);
 
    cout<<"\nThe third layer\n";
    depth = 3;
    multiArray(S,depth);
    
    cout<<"\nThe fourth layer\n";
    depth = 4;
    multiArray(S,depth);
    cin.get();
    return 0;
}
Миниатюры
Массив произвольной размерности и работа с ним  
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.03.2013, 10:01     Массив произвольной размерности и работа с ним #34
Цитата Сообщение от IrineK Посмотреть сообщение
Kastaneda, чтобы вывести "размножающуюся" строку осталось дописать несколько строк в ваш код.
Ага, мне просто лень было это сделать)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.03.2013, 10:12     Массив произвольной размерности и работа с ним #35
Каков тип этого массива? Массивы строятся на указателях той кратности, сколько у массива индексов. Конечно, можно хранить линерализованный массив, а обращаться к плоскому, но всё равно придётся создать массив указателей на массивы-элементы, а его строить тоже на указателе и получаем двойной указатель. А по задаче какова будет кратность указателя? Но кратность - часть указательного типа, а на плюсах строгая статическая типизация. Динамически типизируются только указатели на полиморфные классы, но всё равно количество классов и сами классы должны быть известны на этапе компиляции и кратность в полиморфизм вообще не включается. Такой массив запрещён, это не джава.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 10:32     Массив произвольной размерности и работа с ним
Еще ссылки по теме:

C++ Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля.
C++ Из двух целочисленных массивов различной размерности сформировать общий массив. Упорядочить полученный массив
C++ Характеристический многочлен матрицы произвольной размерности

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.03.2013, 10:32     Массив произвольной размерности и работа с ним #36
Дело в том, что char********************************************* и char* занимают одинаковое кол-во памяти и содержат в себе по сути одну и ту же сущность. Поэтому можно так вольно обращаться с указателями, делая сколько угодно преобразований.
Yandex
Объявления
21.03.2013, 10:32     Массив произвольной размерности и работа с ним
Ответ Создать тему
Опции темы

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