Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/27: Рейтинг темы: голосов - 27, средняя оценка - 4.89
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

Многомерный массив и массив массивов

20.12.2012, 09:24. Показов 5484. Ответов 66
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На паскале это синонимы. Например, всё валидно:
Pascal
1
2
3
4
5
6
7
var a:array[1..n]of array[1..n]of array[1..n] of real; {объявлен одномерный массив одномерных массивов одномерных массивов реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1][2,3]:=2; {А здесь как к одномерном массиву двумерных массивов реалов}
        a[3,4]:=a[5,5]; {И здесь как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
,
Pascal
1
2
3
4
5
6
var a:array[1..n]of array[1..n,1..n] of real; {Объявлен одномерный массив двумерных массивов реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
Pascal
1
2
3
4
5
6
var a:array[1..n]of array[1..n]of array[1..n] of real; {Объявлен одномерный массив двумерных массивов реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
,
Pascal
1
2
3
4
5
var a:array[1..n,1..n]of array[1..n] of real; {объявлен двумерный массив одномерных массивов реалов}
begin
        a[1][2,3]:=2; {А обращаемся к нему как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
,
Pascal
1
2
3
4
5
6
7
var a:array[1..n,1..n,1..n]of real; {объявлен трёхмерный массив реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1][2,3]:=2; {А здесь как к одномерном массиву двумерных массивов реалов}
        a[3,4]:=a[5,5]; {И здесь как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
. А на c/c++ нет самого понятия многомерного массива. А теперь вопрос: почему? Почему на паскале это синонимы и почему на c/c++ существует только одно из этих двух понятий?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2012, 09:24
Ответы с готовыми решениями:

Многомерный массив. С++
Здравствуйте нужно решить две задачки. а) Найдите сумму всех элементов матрицы размером 6х6,...

Многомерный массив
Найти максимальный элемент в массиве. Размеры массива задайте сами. Сделайте три варианта...

Многомерный массив
Вот надо решить задачу. Первую я сделал. Помогите пожалуйста со второй и если можно то без...

многомерный массив
помогите сделать задачу через указатели Сформировать массив типа char размером в 7х5х8...

66
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
20.12.2012, 09:31 2
В С++ многомерный массив это тоже массив массивов.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 09:59  [ТС] 3
Нет.
C++
1
2
3
4
float a[10][10][10]; //Одномерный массив одномерных массивов одномерных массивов флоатов
a[2,4][3]=2; // Попытка обращения как к двумерному массиву одномерных массивов флоатов, не валидна
a[2][4,3]=2; // Попытка обращения как к одномерному массиву двумерных массивов флоатов, не валидна
a[2,4,3]=2; // Попытка обращения как к трёхмерному массиву флоатов, не валидна
. Это мы для краткости при общении между собой делаем вид, что и на c++ эти понятия существуют оба и синонимичны. Но на самом деле это не так. На c/c++ существуют только одномерные массивы.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
20.12.2012, 10:06 4
Цитата Сообщение от taras atavin Посмотреть сообщение
На c/c++ существуют только одномерные массивы.
Цитата Сообщение от daslex Посмотреть сообщение
В С++ многомерный массив это тоже массив массивов.
В С++ многомерный массив это одномерный массив массивов, причем массивов столько, сколько там измерений.

В Паскале также. Память, она и есть память.
Цитата Сообщение от taras atavin Посмотреть сообщение
Попытка обращения как к двумерному массиву одномерных массивов флоатов, не валидна
Просто синтаксис другой
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 10:11  [ТС] 5
Цитата Сообщение от daslex Посмотреть сообщение
Просто синтаксис другой
Не только.
Pascal
1
a[3]:=a[5];
копирует целый элемент-двумерный массив в другой такой же, а
C++
1
a[3]=a[5];
не может выполнить поэлементное копирование, надо писать цикл и вкладывать в него ещё один цикл, но в
Pascal
1
a[3]:=a[5];
эти циклы уже спрятаны в оператор и максимально оптимизированы, а в
C++
1
for (i=9; i>=0; --i) for (j=9; j>=0; --j) a[3][i][j]=a[5][i][j];
простор, чтоб помешать компилятору оптимизировать явные циклы, огромен. Кроме того, синонимы и не должны различаться ни чем, кроме написания и произношения. В данном случае разница должна ограничиваться только синтаксисом.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
20.12.2012, 10:17 6
Цитата Сообщение от taras atavin Посмотреть сообщение
не может выполнить поэлементное копирование, надо писать цикл и вкладывать в него ещё один цикл, но
Это не значит, что многомерный массив в C++ это не массив массивов. Можно и без циклов обойтись
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 10:20  [ТС] 7
А неизбежно вытекает зависимость времени копирования от мозгов двух программистов, которые писали компилятор и приложение.

Добавлено через 20 секунд
Цитата Сообщение от daslex Посмотреть сообщение
Можно и без циклов обойтись
Это как?

Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Это не значит, что многомерный массив в C++ это не массив массивов.
На паскале многомерный массив и массив массивов различаются только синтаксически и только при конкретном обращении, а при следующем обращении уже можно использовать другой синтаксис. На c/c++ нет второго синтаксиса, значит нет и синонима.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.12.2012, 10:20 8
По той же причине, по которой в языке нету свойств с параметрами - это всего лишь синтаксический сахар и ничего более.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 10:27  [ТС] 9
Цитата Сообщение от diagon Посмотреть сообщение
По той же причине, по которой в языке нету свойств с параметрами - это всего лишь синтаксический сахар и ничего более.
Простой пример: индесы элемента есть координаты центра описываемой этим элементом ячейки шлаковой ванны по разным осям. На паскале я могу обойтись тремя индексами, на c++ буду вынужден юзать один векторный индекс. А отсюда или лишний вызов на каждом шаге цикла контруктора вектора, или придётся явно указать, что все три счётчика есть поля вектора. На паскале ООП на пустом месте не навязывается, нет ни создания объекта для его использования в единственной операции, ни явного объединения индексов в единую сущность. А на c++ я вынужден или класть в стакан тонны синтаксического сахара, или маяться короткоживущими объектами. Вместо одной крупинки синтаксического сахара.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
20.12.2012, 10:27 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int N=5;
    const int M=10;
    int Arr[M][N];
 
    for (int i=0;i<M*N;i++) Arr[0][i]=i; //Инициализация двумерного массива числами по порядку имитируя одномерный
 
//Вывод массива на экран распространенным способом
    for (int i=0;i<M;i++)
    {
        for (int j=0;j<N;j++)
        {
            cout<<Arr[i][j]<<"\t";
        }
        cout<<endl;
    }
Докажи мне, что двумерный массив это не одномерный массив
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 10:36  [ТС] 11
Массив у меня динамический массив-объект. Да, есть ещё возможность каждый тип массива-элемента сделать отдельным классом. Но это тонны синтаксического дёгтя.

Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Докажи мне, что двумерный массив это не одномерный массив
Элементарно: элементы двумерного массива адресуются двумя индексами через запятую в общих скобках. И это именно альтернативная синтаксическая конструкция, так что искать здесь семантическую разницу не нужно. Синонимы не могут различаться семантически, иначе это не синонимы.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
20.12.2012, 10:37 12
Цитата Сообщение от taras atavin Посмотреть сообщение
Элементарно: элементы двумерного массива адресуются двумя индексами через запятую в общих скобках.
и в памяти прямоугольная область отводится
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 10:38  [ТС] 13
Цитата Сообщение от daslex Посмотреть сообщение
и в памяти прямоугольная область отводится
И к ней ещё одна линейная с указателями на нулевые элементы массивов-элементов:
C++
1
Arr[i]
- это косвенная адресация указателя, а не эквивалент подвыражения arr+i*sizeof(int) в выражении arr+i*sizeof(int)+j. Но это к делу не относится: стандарт паскаля не гарантирует, что многомерный массив не может быть реализован на двойном указателе.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
20.12.2012, 10:40 14
Цитата Сообщение от daslex Посмотреть сообщение
элементы двумерного массива адресуются двумя индексами через запятую в общих скобках
Это Паскаль
А В C++ первый индекс в первой скобке, второй во второй, третий в третей и т.д.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 10:46  [ТС] 15
Цитата Сообщение от daslex Посмотреть сообщение
Это Паскаль
А В C++ первый индекс в первой скобке, второй во второй, третий в третей и т.д.
В паскале можно так и так, но второй вариант соответствует массиву массивов, а через запятую - многомерному массиву. Семантически это одно и тоже, на то это и синонимы. Но это два альтренативных синтаксиса и два варианта прочтения. Как
C++
1
char s[]="fsajfashbd";
- нуль-терминальная строка на массиве чаров, а
C++
1
char s[]={'f', 's', 'a', 'j', 'f', 'a', 's', 'h', 'b', 'd', '\0'};
- массив чаров, представляющий нуль-терминальную строку.
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.12.2012, 10:51 16
На самом деле в языке C есть двумерные массивы и есть массивы массивов. Они описываются и инициализируются по-разному. Их различие обнаруживается если мы попросим компилятор дать нам их длину. Компилятор их четко различает. Однако синтаксис обращения к элементам один и тот же, поскольку запятая в языке C занята под знак операции и ее использование внутри квадратных скобок имеет совсем другой смысл. Компилятор даже позволяет обращаться с двумерным массивом как с массивом массивов, но в реальных программах это вряд ли стоит использовать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main() {
  char sa[10][10];
  char *sp[]={"435", "", "sgjh"};
  cout << sizeof(sa) << endl; // 100
  cout << sizeof(sp) << endl; // 12
  sa[2][1] = sp[0][1];
  sp[1]=sa[2];
  cout << sp[1][1] << endl; // 3
  return 0;
}
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
20.12.2012, 11:04 17
Цитата Сообщение от taras atavin Посмотреть сообщение
второй вариант соответствует массиву массивов
а что такое массив массивов?

Добавлено через 11 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Можно и без циклов обойтись
Это как?
memcpy например
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
20.12.2012, 11:05 18
Цитата Сообщение от palva Посмотреть сообщение
C++
1
char *sp[]
Это массив указателей.
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.12.2012, 11:12 19
Цитата Сообщение от gray_fox Посмотреть сообщение
Это массив указателей.
Конечно. А как еще иначе реализовать массив массивов? Можно еще как массив объектов, в которых переопределена операция []. Вы такую конструкцию называете массивом массивов?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
20.12.2012, 11:27 20
Цитата Сообщение от palva Посмотреть сообщение
Можно еще как массив объектов, в которых переопределена операция []. Вы такую конструкцию называете массивом массивов?
char *sp[]
здесь *sp[]= объект типа char
и какая разница? Вы сами сказали, что это массив массивов
Цитата Сообщение от palva Посмотреть сообщение
А как еще иначе реализовать массив массивов
Добавлено через 5 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Да, есть ещё возможность каждый тип массива-элемента сделать отдельным классом. Но это тонны синтаксического дёгтя.
Шаблоны вообще-то есть
0
20.12.2012, 11:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2012, 11:27
Помогаю со студенческими работами здесь

Многомерный массив, Си!!!
Дан массив целых чисел a. Изменить индексацию массива на a

Многомерный массив
Имеется вот такое задание: Создать программу, которая реализует журнал с оценками в виде двумерного...

Многомерный массив
Пожалуйста помогите написать программу. Выделить память под многомерный массив, заполнить его...

многомерный массив
помогите пожалуйста написать программу: Дана целочисленная прямоугольная матрица. Определить:...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru