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

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

20.12.2012, 09:24. Показов 5487. Ответов 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
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.12.2012, 15:51 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от taras atavin Посмотреть сообщение
Оба языка прямо запрещают такой синтаксис.
Да ладно вам!
C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main() {
    int a[3];
    a[0,2] = 8;
    cout << a[2] << endl; // 8
    return 0;
}
0
gray_fox
20.12.2012, 15:56
  #42

Не по теме:

palva, смысл поддержки кода с подобными кульбитами стремится к нулю)

0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 15:56  [ТС] 43
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp||In function 'int main()':|
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|5|warning: left-hand operand of comma has no effect|
||=== Build finished: 0 errors, 1 warnings ===|
Нужны комментарии?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.12.2012, 16:03 44
taras atavin, Warning - не ошибка. И к стандарту никакого отношения не имеет.
0
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.12.2012, 16:03 45
Цитата Сообщение от gray_fox Посмотреть сообщение
смысл поддержки кода с подобными кульбитами стремится к нулю
Я, например, часто использую запятую, например
C++
1
for(i=0, j=0, k=0; i<n; i++) {...}
Для всяких счетчиков такая инициализация очень удобна.

Цитата Сообщение от taras atavin Посмотреть сообщение
Нужны комментарии?
А зачем мне комментарии. Такой синтаксис не запрещен. Просто оптимизатор видит его избыточность. Если бы вместо чисел стояли обращения к функциям, то оптимизатор бы промолчал.
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
20.12.2012, 16:08 46
Цитата Сообщение от palva Посмотреть сообщение
Я, например, часто использую запятую
Я про запятые внутри [].
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 16:08  [ТС] 47
Смотри скриншот:
Миниатюры
Многомерный массив и массив массивов  
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 16:11  [ТС] 48
Цитата Сообщение от palva Посмотреть сообщение
for(i=0, j=0, k=0; i<n; i++) {...}
Кстати да. В c++ для запятой два отдельных случая: разделение параметров и разделение операторов в отдельной позиции заголовка цикла for. В отличие от паскаля.
0
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.12.2012, 16:13 49
Например, я хочу подсчитать количество обращений к массиву в моей программе. Каждое обращение к массиву я сопровождаю наращиванием счетчика, а потом печатаю счетчик.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int s=0;
void p() {s++;}
int main() {
    int a[3];
    a[p(),2] = 8;
    cout << a[p(),2] << endl; // 8
    cout << s << endl; // 2
    return 0;
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.12.2012, 16:15 50
palva, Ну это знаете-ли изврат. Кто будет такой код сопровождать - постарается найти автора.
taras atavin, и что? это всего-лишь предупреждение.
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
20.12.2012, 16:16 51
palva, жуть.
0
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.12.2012, 16:39 52
Ну а как иначе написать такую вдруг возникшую задачу? Я беру готовый текст и в редакторе делаю замену 'a[' на 'a[p(),' (конечно, если у меня нет массивов с именами кончающимися на a), а потом делаю обратную замену, если это рабочий код.

Добавлено через 8 минут
Обращение a[i++] ведь никого не смущает? А кого смутит наращивание еще двух счетчиков: a[j++,k++,i++]
Например, я сканирую в одном цикле сразу три массива одинаковой длины.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 16:41  [ТС] 53
Цитата Сообщение от palva Посмотреть сообщение
А кого смутит наращивание еще двух счетчиков: a[j++,k++,i++]
Я уже дал скриншот, на котором видно, что запятая в квадратных скобках запрещена. Вопрос в мотивации: почему это запрещено. На паскале запятая имеет два назначения и может разделять индексы, на плюсах не может, но имеет два назначения, из них одно совпадает. Зачем на ровном месте конструкция
C++
1
a[TVerctor (i,j,k)]
? Меня не напрягает ни векторный, ни строчный индекс.
0
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
20.12.2012, 16:45 54
предлагаю вынести тему в религию
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 16:49  [ТС] 55
Но зачем? На паскале мотивация автора очевидна: так как там индексы могут быть только целого, символьного, перечислимого, или ограниченного типа, то нет возможности прикрутить к массиву векторный индекс, а массив массивов удобен далеко не всегда. А на плюсах? Ладно, пусть индекс может быть любого типа, включая TImage. Ну и что? А зачем запрещены несколько индексов?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
20.12.2012, 16:57 56
Цитата Сообщение от palva Посмотреть сообщение
А кого смутит наращивание еще двух счетчиков: a[j++,k++,i++]
Меня например. Мне вообще не понятно, зачем так писать. Хотя о чём я, давайте сразу
C++
1
 std::cout << (std::cout << a[p(), 2[p(), a] = 8, 2] << std::endl, s) << std::endl;  // 8 2
ведь подобное никого не смущает.
1
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.12.2012, 17:09 57
Меня смущает это: 2[ по-моему это даже не скомпилируется.
Но я не об этом. Использование запятой внутри квадратных скобок разрешено, как разрешено в любом выражении си. Но операция запятая очень редко применяется и многих смущает, а некоторые даже не в курсе, что она существует.
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
20.12.2012, 17:14 58
Цитата Сообщение от palva Посмотреть сообщение
2[ по-моему это даже не скомпилируется.
Да ладно вам!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
 
int s = 0;
 
void p() {
   s++;
}
 
 
int main() {
    int a[3];
    std::cout << (std::cout << a[p(), 2[p(), a] = 8, 2] << std::endl, s) << std::endl;
}
http://liveworkspace.org/code/377A2p
Я конечно передёргиваю, но то, что это разрешено, ещё не значит, что это стоит использовать. Код всё таки для людей писать.
0
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.12.2012, 17:32 59
А что означает: 2[p(), a] не понимаю. Это обращение к массиву, который начинается с адреса 2 что ли?

Добавлено через 1 минуту
Цитата Сообщение от gray_fox Посмотреть сообщение
Код всё таки для людей писать.
Бывают такие люди, для который и подобного кода не жалко.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 17:32  [ТС] 60
Цитата Сообщение от palva Посмотреть сообщение
Использование запятой внутри квадратных скобок разрешено, как разрешено в любом выражении си.
Запрещено, что хорошо видно на скриншоте.
0
20.12.2012, 17:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2012, 17:32
Помогаю со студенческими работами здесь

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

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

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

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


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

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