Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926

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

13.09.2009, 06:02. Показов 9592. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим,есть двумерный массив 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}
Может,есть математическое решение проблемы?
Какая-то формула?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.09.2009, 06:02
Ответы с готовыми решениями:

Вывести порядковый номер элемента массива
Есть одномерный массив из строк, нужно вывести порядковый номер элемента массива. Как это сделать?)

Порядковый номер элемента одномерного массива
Здравствуйте, дан массив A = (1.4, 1.2, 2.6, 8.4, 16, 3.1, 11.2). Определить номер максимального элемента среди элементов,...

Определить порядковый номер минимального элемента массива
Создайте одномерный массив из 10 чисел. Выведите его на экран. Определите порядковый номер наименьшего из них.

11
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.09.2009, 06:30
Дан двумерный массив mass [i, j] и элемент массива el (I, J)

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

Это что ли?
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.09.2009, 13:17
Цитата Сообщение от #pragma Посмотреть сообщение
..... полагая,что если бы массив был разложен в линейное множество,его строки следовали бы одна за другой,а элементы нумеровались как в обычном линейном множестве,начиная с нуля(или 1)и до количества элементов?
А в памяти элементы и располагаются именно так, и Стандарт языка гарантирует такое представление.
1
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
13.09.2009, 13:43
Цитата Сообщение от 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;
}//==============================================================
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.09.2009, 13:46
Скажем так, в Си нет многомерных массивов как таковых. Есть только массив массивов. 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"
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
13.09.2009, 14:29  [ТС]
То есть если массив семимерный,
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 вернуля уже? :)

0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
13.09.2009, 14:41
скорее так
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
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.09.2009, 15:02
#pragma, ты напутал. Полагаю, что номера размерностей и индексов считаются от 1. При построении выражения 1-ый индекс надо помножить на размерности от 2 до 7, 2-й индекс помножать на размерности от 3 до 7 и т.д. Т.е. каждый индекс умножается на все "более поздние" размерности
1
Отдыхающий:)
 Аватар для <Norton>
94 / 91 / 22
Регистрация: 05.04.2009
Сообщений: 188
13.09.2009, 15:05
Поправьте если я ошибаюсь, но:
К Статически созданному масиву на С++, можно обратиться так:
int a[10][5];
a[0][4] = a[4]//4-ый элемент
12-элемент = a[2][1] - двумерном представлении и a[11] в одномерном.
Происходит это из-за того что в статически созданном масиве элементы располагаются по порядку.
*(a+11) = a[11] = 12-ый элемент
Если нужно больше информации почитайте книгу Герберта Шилдта "С++ для начинающих"
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.09.2009, 15:06
#pragma, я правильно понимаю, что ты хочешь выделить динамически многомерный массив, но не как массив указателей, а одним блоком?
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
13.09.2009, 15: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 в интерпретаторе(заранее неизвестной степени вложенности),при этом проверка и доступ будет осуществляться через перемножение индексов.То есть индекс результирующий будет вычисляться посредством формулы,когда мы знаем все размерности.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.09.2009, 15:37
Тогда ты на верном пути
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.09.2009, 15:37
Помогаю со студенческими работами здесь

Вывести порядковый номер элемента массива C++ Builder
Есть одномерный массив из 10 символов , нужно вывести минимальный элемент массива и его порядковый номер . С минимальным элементом...

Определить порядковый номер 1-го положительного элемента массива А
Код program massiv; uses crt; const n=50; type t=array of integer; var a:t; i:integer; m:integer; begin clrscr;

Нужно узнать порядковый номер элемента массива
Нужно ввести массив состоящий из 11 чисел, потом найти максимум отрицательных, и порядковый номер этих отрицательных чисел. Пока я только...

Как вывести порядковый номер элемента массива
В общем, я написал программу для этой задачи: Найти наименьший элемент массива (начиная с k-го) и его порядковый номер. Поменять местами...

Можно ли как-то получить порядковый номер элемента из этого списка (тот, который выбираешь)?
В Excel сделал список из диапазона ячеек через ДанныеПроверкаСписок. Можно ли как-то получить порядковый номер элемента из этого списка...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru