Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/47: Рейтинг темы: голосов - 47, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 25
1

Перебор многомерного массива через оператор for

10.09.2018, 21:20. Показов 8967. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят помогите пытаюсь решить задачу в книге уже 2 день. Какой тип нужно поставить в серийном операторе for (тип должен быть явным, то есть без auto и decltype и псевдонимы типов), и можете сказать почему такой тип.
Вот само упражнение: Напишите 3 разных версии программы для вывода элементов массива ia(многомерный).Одна версия должна использовать для управления перебором серийный оператор for, а другие две - обычный цикл for, но в одном случае использовать индексирование, а в другом указатели.Во всех 3 программах указывайте тип явно. C++
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2018, 21:20
Ответы с готовыми решениями:

При инициализации многомерного массива через сер. оператор for выводится адрес
const size_t rowCnt = 3, colCnt = 4; int ia; size_t cnt = 0; for (auto &row : ia) { for...

Перебор Многомерного массива
Уважаемые помогите перебрать многомерный массив if($qrand1){ ...

Перебор многомерного массива
Доброго времени суток Не получается перебрать массив $mas = array( array( "site"...

Перебор ассоциативного многомерного массива
Подскажите пож есть ли возможность перебрать многомерный ассоциативный массив внутри функции JS....

14
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
10.09.2018, 23:13 2
Лучший ответ Сообщение было отмечено Sark13 как решение

Решение

Цитата Сообщение от Sark13 Посмотреть сообщение
Какой тип нужно поставить в серийном операторе for (тип должен быть явным, то есть без auto и decltype и псевдонимы типов), и можете сказать почему такой тип.
Матрица 3х3
C++
1
 int arr[3][3] = {{}};
Чтобы перебрать матрицу, нужен двойной цикл for.
Во внешнем цикле нужно перебирать строки матрицы
а во внутреннем цикле перебирать элементы строки.

Чтобы обратиться к строке, нужна ссылка на неё.
C++
1
2
 int a[] = {1,2,3};  // это отдельная строка матрицы
     int (&p) [3] = a; // а это ссылка на неё
Перебор матрицы
C++
1
2
3
4
5
6
7
    for( int (&row)[3]: arr)
    {
        for( int&  elem: row)
        {
            std::cout << elem << std::endl;
        }
    }
1
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 25
10.09.2018, 23:22  [ТС] 3
А зачем нужно указывать в скобках и ставить после скобок [3], что это значит?
0
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
10.09.2018, 23:27 4
Лучший ответ Сообщение было отмечено Sark13 как решение

Решение

Цитата Сообщение от Sark13 Посмотреть сообщение
после скобок [3], что это значит?
Это количество элементов в строке (если Матрица 3х3)
К сожалению писать [3] обязательно.

Цитата Сообщение от Sark13 Посмотреть сообщение
А зачем нужно указывать в скобках
это ссылка на массив

Цитата Сообщение от JaponDemon Посмотреть сообщение
int (&p) [3] = a; // а это ссылка на неё
1
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 25
10.09.2018, 23:52  [ТС] 5
Спасибо, могу продвигаться дальше, не пишите я не прочитаю.

Добавлено через 7 минут
А если будет например
C++
1
2
3
4
int arr[2][4] = {
{1,2,3,4},
{1,2,3,4}
};
То нужно писать int(&p)[8]=arr;?
Пишите я прочту)
0
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
11.09.2018, 01:32 6
Цитата Сообщение от Sark13 Посмотреть сообщение
А если будет например
Ссылка на двумерный массив нужна?

C++
1
 int(&p)[2][4]=arr;
Ссылка на строку двумерного массива ?
Строка двумер. массива это одномерный массив.
Ссылка первую строку
C++
1
 int(&p)[4]=arr[0];
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 25
11.09.2018, 08:04  [ТС] 7
Получается, что
C++
1
int &parr[4]=arr[0]
&parr[4] это ссылка на строку двумерного массива но какого? А =arr[0] это элемент строки двумерного массива.
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,881
Записей в блоге: 1
11.09.2018, 08:09 8
Цитата Сообщение от JaponDemon Посмотреть сообщение
К сожалению писать [3] обязательно
не обязательно писать это

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
int main()
{
    int a[][3] = {1,2,3, 1,2,3, 1,2,3};  // это отдельная строка матрицы
     
    for(auto& row : a)
    {
        for( auto&  elem : row)
        {
            std::cout << elem << std::endl;
        }
    }
 
      return 0;
}
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 25
11.09.2018, 08:12  [ТС] 9
Это количество элементов в строке (если Матрица 3х3)
К сожалению писать [3] обязательно.
Значит [3] это кол-во элементов в самом внутреннем массиве? Или нет?
Я то же не понимаю немного про двумерный массив я 2 дня искал 0 информации. И мне интересно было, потом есть sfml. Прочитай про это.
0
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
11.09.2018, 10:41 10
Цитата Сообщение от Sark13 Посмотреть сообщение
Значит [3] это кол-во элементов в самом внутреннем массиве? Или нет?
Да, это количество элементов в массиве (одномерном ), на который получаем ссылку.
Строка матрицы 3х3 -- это одномерный массив длиной 3, значит ссылка на этот массив
будет
C++
1
int (&p) [3]
Цитата Сообщение от _stanislav Посмотреть сообщение
не обязательно писать это
Просили же
Цитата Сообщение от Sark13 Посмотреть сообщение
for (тип должен быть явным, то есть без auto и decltype и псевдонимы типов
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 25
11.09.2018, 11:15  [ТС] 11
JaponDemon, а если будет[2][11][12], то как написать к какому надо обращаться?
0
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
11.09.2018, 13:06 12
пятимерный )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 int myArray[15][10][2][11][12] = {{{{{}}}}};
 
 
    for( int (&fourDArray)[10][2][11][12]: myArray)
    {
    for( int (&threeDArray)[2][11][12]: fourDArray)
    {
    for( int (&twoDArray)[11][12]: threeDArray)
        {
            for( int  (&row)[12]: twoDArray)
            {
                for( int&  elem: row)
                       {
                           std::cout << elem << std::endl;
                       }
            }
        }
    }
    }
Добавлено через 3 минуты
Цитата Сообщение от Sark13 Посмотреть сообщение
JaponDemon, а если будет[2][11][12], то как написать к какому надо обращаться?
Sark13, плохо знаю С++. И на месте отвечающего не совсем уверено себя чувствую.
Попробуйте сами разобраться.
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 25
13.09.2018, 22:20  [ТС] 13
JaponDemon, тут столкнулся с проблемой уже в обычном операторе for.
Ошибка comparison between distinct pointer types 'int (*)[11]' and 'int*' lacks a cast [-fpermissive], не могу понять почему так происходит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <iterator>
using std::endl; using std::cout;
int main ()
{
    setlocale( LC_ALL,"Russian" );
    int ia[2][11] = {
        {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
        {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
    };
    for (int (*i)[11] = std::begin(ia); i != std::end(ia[2]); ++i) {
        for (int *j = std::begin(*i); j != std::end(*i); ++j)
            cout << *j << ", ";
    cout << endl;
    }
    return 0;
}
0
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
14.09.2018, 00:22 14
Лучший ответ Сообщение было отмечено Sark13 как решение

Решение

Цитата Сообщение от Sark13 Посмотреть сообщение
i != std::end(ia[2])
так а что такое ia[2] ?
Матрица 2 х 11, значит в ней строки есть ia[0] и ia[1]. А строки ia[2] нет.
Если без указателей, то вот же, дойти до двух:
C++
1
 for (int i = 0; i < 2; ++i) {
Значит с указателями проверить что
C++
1
 i != ia + 2
или
C++
1
 i != std::end(ia)
Цитата Сообщение от Sark13 Посмотреть сообщение
индексирование
C++
1
2
3
4
5
 for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 11; ++j)
            std::cout << ia[i][j] << ", ";
        std::cout << endl;
    }
Итераторы
C++
1
2
3
4
5
    for (int (*i)[11] = std::begin(ia); i != std::end(ia); ++i) {
        for (int *j = std::begin(*i); j != std::end(*i); ++j)
            cout << *j << ", ";
        cout << endl;
    }
Указатели
C++
1
2
3
4
5
    for (int (*i)[11] = ia; i != ia + 2; ++i) {
        for (int *j = *i; j != *i + 11; ++j)
            cout << *j << ", ";
        cout << endl;
    }
1
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 25
14.09.2018, 08:38  [ТС] 15
Спасибо, помогло.
0
14.09.2018, 08:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2018, 08:38
Помогаю со студенческими работами здесь

Циклический перебор многомерного массива
Есть вот такая функция - выводит меню if (!empty($is_intersected)) { $this-&gt;_menu .= '&lt;li...

Как написать серийный оператор for для многомерного массива?
подскажите как написать серийный оператор for для многомерного массива

Передача многомерного массива через Ajax
Добрый день. Имеется форма с чекбоксами, ссылка на скрин ниже https://ibb.co/dpQtWT Код...

Создание многомерного массива через for( for(.) ) Не хочет работать
Есть вот такая функция, по идее вроде как должна создать многомерный массив, но почемуто:...


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

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