Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Появилась интересная задача: создать функцию для создания массива, размерность которого укажут в ходе программы(то есть не 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
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 14:53  [ТС] 21
Author24 — интернет-сервис помощи студентам
Окей, есть предложения как правильней сделать?)
0
Vourhey
20.03.2013, 15:00
  #22

Не по теме:

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

0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,135
Записей в блоге: 2
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
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 15:51  [ТС] 24
хитро...
а преобразование
Цитата Сообщение от Kastaneda Посмотреть сообщение
(char**)p[i]
прокатит? ведь у нас получается в итоге(с глубиной 5) шестикратный *
и тут вроде как нет создания элементов на самой низкой глубине, вернее они создаються как массив из 10 *чаров тоже. но это уже мелочи
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.03.2013, 16:46 25
Цитата Сообщение от JollyRoger Посмотреть сообщение
Доброго времени суток. Появилась интересная задача: создать функцию для создания массива, размерность которого укажут в ходе программы(то есть не a[n] и n укажут-а а[q1][q2][q3][q4]..., и q1,q2... укажут, ка
на плюсах типизация строгая, такое безобразие не допускается.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.03.2013, 16:52 26
Рекурсия с шаблонами
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
20.03.2013, 16:54 27
Цитата Сообщение от MrGluck Посмотреть сообщение
Рекурсия с шаблонами
некатит ибо
Цитата Сообщение от JollyRoger Посмотреть сообщение
то есть не a[n] и n укажут-а а[q1][q2][q3][q4]..., и q1,q2... укажут, как и количество этих q, уже в процессе выполнения программы
а в рантайме такого не сделать, только как уже предлагали выше - встроку
0
2 / 2 / 1
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 17:27  [ТС] 28
Kastaneda, не прокнуло преобразование типа. а жаль
Хм. Можно, в принципе, сделать struct'ы ctruct'ов... Но это уже не торт.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,135
Записей в блоге: 2
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
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
20.03.2013, 18:10 30
Это все равно не рантайм вариант, количество звездочек не удастся скрыть, и в рантайме создатаь удастся лишь массив такого размера, которые был запланирован изначально.
Более простой вариант на C++11:
http://liveworkspace.org/code/MrwgF
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,135
Записей в блоге: 2
20.03.2013, 18:14 31
Цитата Сообщение от Герц Посмотреть сообщение
и в рантайме создатаь удастся лишь массив такого размера, которые был запланирован изначально.
в моем примере size можно смело вводить с клавиатуры (для создания массива, вывод конечно же сломается).
Цитата Сообщение от Герц Посмотреть сообщение
количество звездочек не удастся скрыть
Если вывод массива сделать в аналогичной рекурсии, то кол-во звездочек не важно.

Все это дело можно преобразовать в полноценный рантайм вариант.
0
2 / 2 / 1
Регистрация: 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);
 }
}
Вот код моей функции. Буду эксперементировать, в общем.
0
Заблокирован
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;
}
Миниатюры
Массив произвольной размерности и работа с ним  
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,135
Записей в блоге: 2
21.03.2013, 10:01 34
Цитата Сообщение от IrineK Посмотреть сообщение
Kastaneda, чтобы вывести "размножающуюся" строку осталось дописать несколько строк в ваш код.
Ага, мне просто лень было это сделать)
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.03.2013, 10:12 35
Каков тип этого массива? Массивы строятся на указателях той кратности, сколько у массива индексов. Конечно, можно хранить линерализованный массив, а обращаться к плоскому, но всё равно придётся создать массив указателей на массивы-элементы, а его строить тоже на указателе и получаем двойной указатель. А по задаче какова будет кратность указателя? Но кратность - часть указательного типа, а на плюсах строгая статическая типизация. Динамически типизируются только указатели на полиморфные классы, но всё равно количество классов и сами классы должны быть известны на этапе компиляции и кратность в полиморфизм вообще не включается. Такой массив запрещён, это не джава.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,135
Записей в блоге: 2
21.03.2013, 10:32 36
Дело в том, что char********************************************* и char* занимают одинаковое кол-во памяти и содержат в себе по сути одну и ту же сущность. Поэтому можно так вольно обращаться с указателями, делая сколько угодно преобразований.
0
21.03.2013, 10:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2013, 10:32
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru