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

[C/C++] Можно ли выразить порядковый номер элемента массива через индексы? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.75
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
13.09.2009, 06:02     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #1
Допустим,есть двумерный массив a[5][6], и необходимо получить доступ к элементу a[3][4];можно ли как-то узнать его порядковый номер в массиве,полагая,что если бы массив был разложен в линейное множество,его строки следовали бы одна за другой,а элементы нумеровались как в обычном линейном множестве,начиная с нуля(или 1)и до количества элементов?
Например:
C++
1
2
3
4
5
a = { { 1, 0, 1, 0, 8, 0},
      { 1, 0, 1, 0, 5, 0},
      { 1, 0, 1, 0, 0, 0},
      { 1, 0, 1, 6, 0, 0},
      { 1, 0, 1, 0, 4, 0}}
Представить как
C++
1
a = { 1,0,1,0,8,0,  1,0,1,0,5,0,  1,0,1,0,0,0,  1,0,1,6,0,0,  1,0,1,0,4,0}
Может,есть математическое решение проблемы?
Какая-то формула?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2009, 06:02     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы?
Посмотрите здесь:

C++ Минимальный элемент массива и его порядковый номер
порядковый номер желаемого элемента C++
Найти порядковый номер первого положительного элемента массива C++
Массив. Удалить все положительные элементы, имеющие четный порядковый номер, идущие после минимального элемента массива C++
Вывести порядковый номер элемента массива C++ Builder C++
В массиве A=(a1, а2, ., an) удалить все положительные элементы, имеющие четный порядковый номер, идущие после минимального элемента массива C++
Найти в массиве порядковый номер наиболее близкого элемента к заданному целому числу Х C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
13.09.2009, 06:30     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #2
Дан двумерный массив mass [i, j] и элемент массива el (I, J)

В линейном аналоге массива mass элемент el будет иметь номер I*j+ J

Это что ли?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,315
13.09.2009, 13:17     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #3
Цитата Сообщение от #pragma Посмотреть сообщение
..... полагая,что если бы массив был разложен в линейное множество,его строки следовали бы одна за другой,а элементы нумеровались как в обычном линейном множестве,начиная с нуля(или 1)и до количества элементов?
А в памяти элементы и располагаются именно так, и Стандарт языка гарантирует такое представление.
mirso
524 / 342 / 17
Регистрация: 05.04.2009
Сообщений: 709
13.09.2009, 13:43     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #4
Цитата Сообщение от CheshireCat Посмотреть сообщение
А в памяти элементы и располагаются именно так
А выводится в консоль - примерно
так
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
42
43
44
45
46
47
//---------------------13_09_2009--------------------------------
#include <iostream>
#include <iomanip>
//=============================================================== 
int main()
{
const unsigned short int n = 5, m = 6;
unsigned int a[n][m] = { { 1, 0, 1, 0, 8, 0},
             { 1, 0, 1, 0, 5, 0},
             { 1, 0, 1, 0, 0, 0},
             { 1, 0, 1, 6, 13, 9},
             { 1, 0, 1, 0, 4, 0} };
 
    //---------------------a[n][m]-------------------------------
    for( size_t i = 0; i < n; i++ )
    {
        for( size_t j = 0; j < m; j++ )
        {
            std::cout << "a[" << i << "][" << j << "] = "
                      <<  a[     i     ][     j     ] << "; ";
        }
        std::cout << std::endl;
    }
    //---------------------address-------------------------------
    for( size_t i = 0; i < n; i++ )
    {
        for( size_t j = 0; j < m; j++ )
        {
            std::cout << " a[" << i << "][" << j << "] = "
                      <<  &a[     i     ][     j     ] << ";\n";
        }
    }
    //---------------------a[n*m]--------------------------------
    for( size_t i = 0; i < n*m; i++ )
    {
        std::cout << "a[" << std::setw( 2 ) << i << "] = "
                          << std::setw( 2 ) << *(*a + i) 
                    << "; ";
        if ( i%m  == m - 1 ) 
        std::cout << std::endl; 
    }//---------------- элемент масива----------------------
    std::cout << " a[3][4] = " << *(*a + 3*m + 4) << ";\n";
    std::cout << " a[3][5] = " << *(*a + 3*m + 5) << ";\n";
    
system("pause");
return EXIT_SUCCESS;
}//==============================================================
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
13.09.2009, 13:46     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #5
Скажем так, в Си нет многомерных массивов как таковых. Есть только массив массивов. kravam написал, как туда устраивать доступ

В общем случае будет примерно так: если есть массив "int arr[A][B][C][D]", то доступ к элементу "arr[a][b][c][d]" осуществляется (по стандарту языка) по адресу "((int*)&arr[0][0][0][0]) + a*(B*C*D) + b*(C*D) + c *(D) + d"
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
13.09.2009, 14:29  [ТС]     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #6
То есть если массив семимерный,
C++
1
a[4][2][5][3][6][9][1]
,то доступ к
C++
1
a[2][1][4][2][4][6][0]
Будет выражаться формулой
C++
1
2*(4*2*5*3*6*9*1) + 1*(2*5*3*6*9*1) + 4*(5*3*6*9*1) + 2*(3*6*9*1) + 4*(6*9*1) + 6*(9*1) + 0*(1) +1
Правильно,или я напутал что-то?

Не по теме:

Evg вернуля уже?

M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
13.09.2009, 14:41     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #7
скорее так
2*(2*5*3*6*9*1) + 1*(5*3*6*9*1) + 4*(3*6*9*1) + 2*(6*9*1) + 4*(9*1) + 6*1 + 0
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
13.09.2009, 15:02     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #8
#pragma, ты напутал. Полагаю, что номера размерностей и индексов считаются от 1. При построении выражения 1-ый индекс надо помножить на размерности от 2 до 7, 2-й индекс помножать на размерности от 3 до 7 и т.д. Т.е. каждый индекс умножается на все "более поздние" размерности
<Norton>
Отдыхающий:)
 Аватар для <Norton>
94 / 91 / 10
Регистрация: 05.04.2009
Сообщений: 188
13.09.2009, 15:05     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #9
Поправьте если я ошибаюсь, но:
К Статически созданному масиву на С++, можно обратиться так:
int a[10][5];
a[0][4] = a[4]//4-ый элемент
12-элемент = a[2][1] - двумерном представлении и a[11] в одномерном.
Происходит это из-за того что в статически созданном масиве элементы располагаются по порядку.
*(a+11) = a[11] = 12-ый элемент
Если нужно больше информации почитайте книгу Герберта Шилдта "С++ для начинающих"
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
13.09.2009, 15:06     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #10
#pragma, я правильно понимаю, что ты хочешь выделить динамически многомерный массив, но не как массив указателей, а одним блоком?
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
13.09.2009, 15:11  [ТС]     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #11
Цитата Сообщение от <Norton> Посмотреть сообщение
Поправьте если я ошибаюсь, но:
К Статически созданному масиву на С++, можно обратиться так:
int a[10][5];
a[0][4] = a[4]//4-ый элемент
12-элемент = a[2][1] - двумерном представлении и a[11] в одномерном.
Происходит это из-за того что в статически созданном масиве элементы располагаются по порядку.
*(a+11) = a[11] = 12-ый элемент
Если нужно больше информации почитайте книгу Герберта Шилдта "С++ для начинающих"
Спасибо за совет,но Шилдта,я надеюсь,уже не открою никогда Не советуют данное чтиво в авторитетных кругах.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
#pragma, я правильно понимаю, что ты хочешь выделить динамически многомерный массив, но не как массив указателей, а одним блоком?
Да,именно это и нужно,чтобы обеспечить многомерность DIM в интерпретаторе(заранее неизвестной степени вложенности),при этом проверка и доступ будет осуществляться через перемножение индексов.То есть индекс результирующий будет вычисляться посредством формулы,когда мы знаем все размерности.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2009, 15:37     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы?
Еще ссылки по теме:

Проверить можно ли выразить линейно один из векторов массива через заданный вектор C++
C++ Определить порядковый номер минимального элемента массива
Вывести порядковый номер максимального элемента заданного массива C++
C++ Определить порядковый номер наибольшего элемента в последовательности
Записать вместо минимального элемента массива его порядковый номер C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
13.09.2009, 15:37     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы? #12
Тогда ты на верном пути
Yandex
Объявления
13.09.2009, 15:37     [C/C++] Можно ли выразить порядковый номер элемента массива через индексы?
Ответ Создать тему
Опции темы

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