Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

вложенный цикл и двумерный массив - C++
Ребят, пытаюсь сделать программу, которая будет красиво выводить мне таблицу прогресса силовых показателей спортсменов, и я должен...

Выделить память под двумерный массив за один вызов функции malloc - C++
Выделить память под двумерный массив за один вызов функции malloc Если можно - с комментариями

Объединить два одномерных массива в один двумерный массив, состоящий из двух столбцов - C++
Объединить два одномерных массива в один двумерный массив, состоящий из двух столбцов. Помогите написать код на С++.

Двумерный массив: номер первого из столбцов, содержащих хотя бы один нулевой элемент - C++
дана целочисленная прямоугольная матрица. Определить номер первого из столбцов ,содержащих хотя бы один нулевой элемент. Характеристикой...

Двумерный массив: определить количество столбцов, содержащих хотя бы один отрицательный элемент. - C++
Работа с двумерным динамическим массивом. Для целочисленного двумерного массива (размерность массива задаётся пользователем),...

Двумерный массив. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент - C++
(20) Работа с двумерными массивами. Дана целочисленная прямоугольная матрица. Определить: Номер первого из столбцов, содержащих...

8
HidForce
56 / 56 / 13
Регистрация: 17.11.2012
Сообщений: 1,602
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;
}
0
Max Dark
шКодер самоучка
1854 / 1654 / 603
Регистрация: 09.10.2013
Сообщений: 3,679
Записей в блоге: 6
Завершенные тесты: 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]<<' ';
}
1
vua72
416 / 416 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 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]=чему-то;
1
zss
Модератор
Эксперт С++
6686 / 6248 / 2083
Регистрация: 18.12.2011
Сообщений: 16,316
Завершенные тесты: 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;
}
1
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 минуты
Опоздал(
1
Wa1N3
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 6
23.11.2013, 22:54  [ТС] #7
Всем огромное спасибо за помощь!
Есть ещё теоретический вопрос. С точки зрения оптимизации лучше использовать один цикл, но при этом производить дополнительные вычисления(остаток от деления), или использовать 2 вложенных цикла? Можно без объяснений.
0
zss
Модератор
Эксперт С++
6686 / 6248 / 2083
Регистрация: 18.12.2011
Сообщений: 16,316
Завершенные тесты: 1
24.11.2013, 10:26 #8
Mendow,А отформатировать текст сложно было?
0
Somebody
2792 / 1603 / 148
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 3
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;
0
24.11.2013, 11:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2013, 11:23
Привет! Вот еще темы с ответами:

Найти ошибку! Двумерный массив, определить кол., столбцов где хоть один элемент <0 - C++
Все работет отлично но при вводе ,допустим, матрицы с кол., строк 4 и кол., столбцов 5. И минимальном -5 и максимальном 5 элемента массива....

Дано двумерный массив целых чисел. Найти номера строк, в которых есть только один непарный элемент - C++
Вся программа должна быть сделана с помощью функций

Дан двумерный массив А(4,4) в виде квадратной матрицы. Составьте программу, обнуляющую побочную диагональ матрицы, если в ней найдется хоть один отриц - C++
Дан двумерный массив А(4,4) в виде квадратной матрицы. Составьте программу, обнуляющую побочную диагональ матрицы, если в ней найдется хоть...

Как можно вложить двумерный массив в двумерный? - C++
Нужно написать программу перемножения двух матриц размерностью МxМ, элементы которых, матрицы размерностью КxК... Подскажите (желательно с...


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

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

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