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

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

13.09.2009, 06:02. Показов 9654. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru