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

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

13.09.2009, 06:02. Показов 9499. Ответов 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,698
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru