Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
#pragma
Временно недоступен
956 / 227 / 14
Регистрация: 12.04.2009
Сообщений: 926
1

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

13.09.2009, 06:02. Просмотров 4441. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2009, 06:02
Ответы с готовыми решениями:

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

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

Найти порядковый номер первого положительного элемента массива
Необходимо найти порядковый номер первого положительного элемента одномерного массива с помощью 3...

Вывести порядковый номер максимального элемента заданного массива
В данном коде в 29 строке (отметила комментарием) я пыталась вывести порядковый номер максимального...

Записать вместо минимального элемента массива его порядковый номер
задан массив целых чисел.Записать вместо min элемента этого массива его порядковый номер.

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

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

Это что ли?
1
CheshireCat
Эксперт С++
2916 / 1265 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.09.2009, 13:17 3
Цитата Сообщение от #pragma Посмотреть сообщение
..... полагая,что если бы массив был разложен в линейное множество,его строки следовали бы одна за другой,а элементы нумеровались как в обычном линейном множестве,начиная с нуля(или 1)и до количества элементов?
А в памяти элементы и располагаются именно так, и Стандарт языка гарантирует такое представление.
1
mirso
527 / 345 / 45
Регистрация: 05.04.2009
Сообщений: 709
13.09.2009, 13:43 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;
}//==============================================================
1
13.09.2009, 13:43
Evg
Эксперт CАвтор FAQ
20297 / 7824 / 601
Регистрация: 30.03.2009
Сообщений: 21,852
Записей в блоге: 30
13.09.2009, 13:46 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"
1
#pragma
Временно недоступен
956 / 227 / 14
Регистрация: 12.04.2009
Сообщений: 926
13.09.2009, 14:29  [ТС] 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 вернуля уже? :)

0
M128K145
Эксперт JavaЭксперт С++
8342 / 3563 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
13.09.2009, 14:41 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
1
Evg
Эксперт CАвтор FAQ
20297 / 7824 / 601
Регистрация: 30.03.2009
Сообщений: 21,852
Записей в блоге: 30
13.09.2009, 15:02 8
#pragma, ты напутал. Полагаю, что номера размерностей и индексов считаются от 1. При построении выражения 1-ый индекс надо помножить на размерности от 2 до 7, 2-й индекс помножать на размерности от 3 до 7 и т.д. Т.е. каждый индекс умножается на все "более поздние" размерности
1
<Norton>
Отдыхающий:)
94 / 91 / 22
Регистрация: 05.04.2009
Сообщений: 188
13.09.2009, 15:05 9
Поправьте если я ошибаюсь, но:
К Статически созданному масиву на С++, можно обратиться так:
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
20297 / 7824 / 601
Регистрация: 30.03.2009
Сообщений: 21,852
Записей в блоге: 30
13.09.2009, 15:06 10
#pragma, я правильно понимаю, что ты хочешь выделить динамически многомерный массив, но не как массив указателей, а одним блоком?
1
#pragma
Временно недоступен
956 / 227 / 14
Регистрация: 12.04.2009
Сообщений: 926
13.09.2009, 15:11  [ТС] 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
20297 / 7824 / 601
Регистрация: 30.03.2009
Сообщений: 21,852
Записей в блоге: 30
13.09.2009, 15:37 12
Тогда ты на верном пути
1
13.09.2009, 15:37
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2009, 15:37

Найти значение и порядковый номер максимального элемента заданного массива
Здравствуйте уважаемые , нужна помощь в решение задачи и небольшая консультация по 2 во 2...

Записать вместо минимального элемента массива его порядковый номер
Задан массив целых чисел. Записать вместо min элемента этого массива его порядковый номер.

Записать вместо min элемента массива его порядковый номер (исправить ошибки)
задан массив целых чисел.Записать вместо min элемента этого массива его порядковый номер.Ошибки в...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru