Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Wa1N3
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 6
#1

Двумерный массив за один цикл - C++

23.11.2013, 21:00. Просмотров 885. Ответов 8
Метки нет (Все метки)

Нужно пройти по всем элементам двумерного массива за один цикл, без вложенных циклов. Я понимаю, что в памяти элементы двумерного массива находятся последовательно, но вообще не понимаю к чему и как нужно обращаться.
Был бы очень признателен за пример с объяснением.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2013, 21:00     Двумерный массив за один цикл
Посмотрите здесь:

C++ Цикл выполняется один раз
C++ вложенный цикл и двумерный массив
Двумерный массив: определить количество столбцов, содержащих хотя бы один отрицательный элемент. C++
C++ Как можно вложить двумерный массив в двумерный?
C++ Дан двумерный массив А(4,4) в виде квадратной матрицы. Составьте программу, обнуляющую побочную диагональ матрицы, если в ней найдется хоть один отриц
Двумерный массив. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент C++
C++ Выделить память под двумерный массив за один вызов функции malloc
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HidForce
55 / 55 / 13
Регистрация: 17.11.2012
Сообщений: 1,435
23.11.2013, 21:44     Двумерный массив за один цикл #2
например, таким образом можно вывести элементы матрицы
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
#include <iostream>
 
using namespace std;
 
int main()
{
    int aMatrix[3][3] = {1, 2, 3, 
                         4, 5, 6, 
                         7, 8, 9};
    int m, n = 0;
 
    for (int i = 0; i < 9; i++)
    {
        if (i <= 2)
            m = 0;
        else if (i > 2 && i <= 5)
            m = 1;
        else if (i > 5 && i <= 8)
            m = 2;
 
        cout << aMatrix[m][n] << "  ";
        if (i == 2)
            cout << endl;
        if (i == 5)
            cout << endl;
        
        n++;
        if (n == 3)
            n = 0;
    }
 
    cout << endl;
    return 0;
}
Max Dark
В поиске работы
1610 / 1411 / 505
Регистрация: 09.10.2013
Сообщений: 3,199
Записей в блоге: 8
Завершенные тесты: 2
23.11.2013, 21:45     Двумерный массив за один цикл #3
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
const int rows = 123; // кол-во строк
const int cols = 321; // кол-во столбцов
 
int arr[rows][cols];  // массив
 
int total = rows*cols;// всего элементов в массиве
int counter = 0;      // счетчик
 
// пример с while
while(counter<total) {
    int i, j;
    i = counter % cols; // номер строки = остаток деления счетчика на колво столбцов
    j = counter%rows;   // номер столбца = остаток от деления счетчика на колво строк
    arr[i][j] = counter;// тут ваши действия с массивом
    ++counter;// увеличиваем счетчик
}
 
// пример с for
// отличия от while не большие, смысл переменных тот же
for(counter = 0; counter<total; counter++) {
    int i, j;
    i = counter%cols;
    j = counter%rows;
    if(i == 0)
        cout<<endl
    cout<<arr[i][j]<<' ';
}
vua72
414 / 414 / 85
Регистрация: 28.11.2010
Сообщений: 1,177
Завершенные тесты: 1
23.11.2013, 21:59     Двумерный массив за один цикл #4
Для статических двумерных массивов, если i - индекс строки, j - столбца, m - число элементов в строке, то a[i*m+j] эквивалентно a[i][j].
В одном цикле, просто перебираем индекс элементов от нуля до n*m-1 и рассматриваем массив как одномерный
C++
1
2
for(int i=0; i<n*m; ++i[)
a[i]=чему-то;
zss
Модератор
Эксперт С++
6192 / 5795 / 1877
Регистрация: 18.12.2011
Сообщений: 14,804
Завершенные тесты: 1
23.11.2013, 22:04     Двумерный массив за один цикл #5
В двумерном массиве строки расположены друг за другом.
Это можно доказать так:
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
int main()
{
    const int rows = 3; // кол-во строк
    const int cols = 3; // кол-во столбцов
    const int total = rows*cols;// всего элементов в массиве
    union a
    {
        int arr2[rows][cols];  // двумерный массив
        int arr1[total]; // одномерный массив поверх двумерного
    }arr_u;
 
    for(int counter = 0; counter<total; counter++) 
    {
        arr_u.arr1[counter]=counter;
    }
    for(int counter = 0; counter<total; counter++) 
    {
        int i, j;
        i = counter/cols;
        j = counter%rows;
        if(j == 0)
            cout<<endl;
        cout<<arr_u.arr2[i][j]<<' ';
    }
    system("PAUSE");
    return 0;
}
Mendow
1 / 1 / 0
Регистрация: 31.07.2013
Сообщений: 13
23.11.2013, 22:22     Двумерный массив за один цикл #6
Если можно использовать помимо одного цикла условие то можно так написать

Код
$array = array();
$j=4;//количество столбцов в массиве 
$i=0;
$n=$j+1;
$j=0;

for($i=0;$i<=$n;$i++){
   if($i==$n-1){
       $j++;
       $i=-1;
       echo '<br />';
   }elseif($j == $n){
       break;
   }else{
   $array[$j][$i] = __;//тут заполнять массив нужными штуками 
   }
}
это был вариант с условием не очень элегантный.Есть более красивый

Код
$array = array();
$j=4;
$i=4;
for($k=0; $k<=($i*$j); $k++){
 $m = ($k-($k % $j))/$j;
 $n = $k % $j;
$array [$m][$n]= __;//тут заполнять массив нужными штуками 
echo "_".$array [$m][$n]."_</br>";
}
Написано на пхп,но могу написать и на с++ если надо.

Добавлено через 2 минуты
Опоздал(
Wa1N3
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 6
23.11.2013, 22:54  [ТС]     Двумерный массив за один цикл #7
Всем огромное спасибо за помощь!
Есть ещё теоретический вопрос. С точки зрения оптимизации лучше использовать один цикл, но при этом производить дополнительные вычисления(остаток от деления), или использовать 2 вложенных цикла? Можно без объяснений.
zss
Модератор
Эксперт С++
6192 / 5795 / 1877
Регистрация: 18.12.2011
Сообщений: 14,804
Завершенные тесты: 1
24.11.2013, 10:26     Двумерный массив за один цикл #8
Mendow,А отформатировать текст сложно было?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2013, 11:23     Двумерный массив за один цикл
Еще ссылки по теме:

Найти ошибку! Двумерный массив, определить кол., столбцов где хоть один элемент <0 C++
Дано двумерный массив целых чисел. Найти номера строк, в которых есть только один непарный элемент C++
Двумерный массив: номер первого из столбцов, содержащих хотя бы один нулевой элемент C++
C++ Объединить два одномерных массива в один двумерный массив, состоящий из двух столбцов
C++ Дан массив из 10 элементов.Перенести в один другой массив четные числа.Затем перенести в еще один другой масси

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

Или воспользуйтесь поиском по форуму:
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
24.11.2013, 11:23     Двумерный массив за один цикл #9
C++
1
2
3
4
for (std::size_t i = 0; i < sizeof(a) / sizeof(**a); i++)
    a[0][i];
for (auto p = *a; p < *a + sizeof(a) / sizeof(**a); p++)
    *p;
Yandex
Объявления
24.11.2013, 11:23     Двумерный массив за один цикл
Ответ Создать тему
Опции темы

Текущее время: 21:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru