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

Потерялся в двумерном массиве - C++

Восстановить пароль Регистрация
 
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
13.08.2016, 19:47     Потерялся в двумерном массиве #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    const int m=6, n=4;
    int a[m][n];
    int x = 5, y = 0;
    
    for (int i = 0; i<n ; i++){
        for (int j = 0; j<m ; j++){
            a[i][j] = y;
                if (j >= x){
                    a[i][j] = y+1;
                    }
                        cout<<"  "<<a[i][j]<<"  ";
            }
            y++;x--;
            cout<<endl;
        }
    return 0;
}
У меня так.
0 0 0 0 0 1
1 1 1 1 2 2
2 2 2 3 3 3
3 3 4 4 4 4

А должно быть так.

0 1 2 3
0 1 2 3
0 1 2 4
0 1 3 4
0 2 3 4
1 2 3 4

И почему если помнять int a[m][n] на int a[n][m] то ничего не меняется?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2016, 19:47     Потерялся в двумерном массиве
Посмотрите здесь:

C++ Указатели в двумерном массиве
C++ Ошибка в двумерном массиве
C++ В двумерном массиве подсчитать
Указатели в двумерном массиве C++
Строки в двумерном массиве C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MansMI
1046 / 843 / 205
Регистрация: 08.01.2012
Сообщений: 3,023
13.08.2016, 19:59     Потерялся в двумерном массиве #2
for (int i = 0; i<m ; i++){
for (int j = 0; j<n ; j++)
Doctor123
21 / 21 / 5
Регистрация: 03.12.2013
Сообщений: 101
13.08.2016, 21:18     Потерялся в двумерном массиве #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
28
29
30
31
32
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    int a[6][4];
    int x = 5, y = 0, i, j;
    
    for (i = 0; i < 4; i++)               
    {
        for (j = 0; j < 6 ; j++)
        {
            a[i][j] = y;
            if (j >= x)
            {
                a[i][j] = y+1;
            } 
        }
        y++;x--;
    }
//-------------------------------------------
    for (j = 0; j < 6; j++)               
    {
        for (i = 0; i < 4 ; i++)
        {
            cout<<"  "<<a[i][j]<<"  ";
        }
        cout<<endl;
    }
return 0;
}
Lexxxxy
5 / 5 / 4
Регистрация: 07.08.2016
Сообщений: 31
13.08.2016, 22:50     Потерялся в двумерном массиве #4
MansMI, Doctor123, присоединяюсь к вышеизложенному.
Причина в том, что вы объявили массив, так, что у вас "m" - строки, "n" - столбцы.
C++
1
2
3
4
int a[m][n];   // вот здесь "m" - строки, "n" - столбцы
for (int i = 0; i<n ; i++){   // а вот здесь "n" - строки
for (int j = 0; j<m ; j++){ // "m" - столбцы
//......
Хотя должно быть всё наоборот. И получается переполнение.

Данный фрагмент должен выглядеть так:
C++
1
2
3
int a[m][n];  
for (int i = 0; i<m ; i++){   // теперь "m" - строки
for (int j = 0; j<n ; j++){ // "n" - столбцы
Как и должно быть.

Добавлено через 3 минуты
Цитата Сообщение от Overloading Посмотреть сообщение
И почему если помнять int a[m][n] на int a[n][m] то ничего не меняется?
Причина этого всё та же.
У вас получается, что количество строк - 4("n"), а количество столбцов - 6("m"), как у вас и вышло при компиляции.
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
14.08.2016, 15:01  [ТС]     Потерялся в двумерном массиве #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
28
29
30
31
32
33
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    const int m=6, n=4;
    int a[m][n];
    int x = 5, y = 0;
    
    for (int i = 0; i<n ; i++)
    {
        for (int j = 0; j<m ; j++)
        {
            a[i][j] = y; 
                if (j >= x)
                {
                    a[i][j] = y+1;
                } 
        }
        y++;x--; 
    }
 
   for (int j = 0; j < m; j++)               
    {
        for (int i = 0; i < n ; i++)
        {
            cout<<"  "<<a[i][j]<<"  ";
        }
        cout<<endl;
    }
return 0;
}
Последний вопрос.Откуда берется еденица.

0 1 2 3
0 1 2 3
0 1 2 4
0 1 3 4
1 2 3 4
1 2 3 4
Doctor123
21 / 21 / 5
Регистрация: 03.12.2013
Сообщений: 101
14.08.2016, 15:20     Потерялся в двумерном массиве #6
Я испугался, что у меня глючит компилятор MSVC 6.0
До упора пытался найти ошибку в простейшем коде, но списал на глюк.
Думал у Вас такого не будет.
Попробую отыскать сегодня - это становится очень интересно.
Настоящий полтергейст.
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
14.08.2016, 15:32  [ТС]     Потерялся в двумерном массиве #7
Цитата Сообщение от Doctor123 Посмотреть сообщение
Я испугался, что у меня глючит компилятор MSVC 6.0
До упора пытался найти ошибку в простейшем коде, но списал на глюк.
Думал у Вас такого не будет.
Попробую отыскать сегодня - это становится очень интересно.
Настоящий полтергейст.
Вот и я не пойму, интересное дело если написать допустим x = 8 то результат не меняется.
Doctor123
21 / 21 / 5
Регистрация: 03.12.2013
Сообщений: 101
15.08.2016, 01:03     Потерялся в двумерном массиве #8
Если увеличить размерность массива, то ошибка пропадёт.

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
#include <iostream>
using namespace std;
 
 
 
int main()
{
    setlocale (LC_ALL, "Russian");
    
    int x = 5, y = 0, i = 0, j = 0;
    int Proverka = 1;
    int a[6][5];
 
    for (i = 0; i < 4; i++)           
    {
        for (j = 0; j < 6 ; j++)
        {
            a[i][j] = y;
 
            if(j >= x) a[i][j] = y+1;
        }
        y++;
        x--;
    }
 
    for (j = 0; j < 6; j++)              
    {
        for (i = 0; i < 4 ; i++)    cout<<"  "<<a[i][j]<<"  ";
        cout<<endl;
    }
return 0;
}
Происходит (каким-то образом) переполнение строк массива.
Может быть при увеличении счётчика цикла выше допустимого. Но как происходит запись в массив, ведь тело цикла не должно выполняться свыше положенного числа.
Такое врятли ещё в жизни встретится, но это желательно понять, что бы не сомневаться в том, что уже казалось "переваренным".
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
15.08.2016, 16:55  [ТС]     Потерялся в двумерном массиве #9
Понял, что ничего не понял
Doctor123
21 / 21 / 5
Регистрация: 03.12.2013
Сообщений: 101
15.08.2016, 17:12     Потерялся в двумерном массиве #10
Спасибо за интересный вопрос.
Я сам до конца не разобрался, как происходит переполнение строк (столбцов) массива.
Похоже на побочное влияние оператора цикла FOR

Если руки дойдут, попробую Ваш парадоксальный пример разглядеть в своём мониторе-отладчике "UniMons".
И выложу результаты здесь на всеобщее рассмотрение.
Но не обещаю, так как времени уже потратил немало.
_Ivana
2177 / 1382 / 124
Регистрация: 01.03.2013
Сообщений: 4,123
Записей в блоге: 2
15.08.2016, 17:14     Потерялся в двумерном массиве #11
Цитата Сообщение от Doctor123 Посмотреть сообщение
И выложу результаты здесь на всеобщее рассмотрение.
Обязательно, ждем продолжение сериала "Затерянные в двумерном массиве - 2", очень интересно развитие сюжета!
Lexxxxy
5 / 5 / 4
Регистрация: 07.08.2016
Сообщений: 31
15.08.2016, 17:31     Потерялся в двумерном массиве #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Overloading, меня больше удивляет тот факт, что вы так паритесь. Зачем? Вы хотите понять как работают двумерные массивы? Я объясню.
C++
1
2
3
4
5
6
7
 for (int i = 0; i<n ; i++)
    {
        for (int j = 0; j<m ; j++)
         {
         array[n][m] = ....   // вот так вы заполняете массив по элементам
          }
     }
Чтобы было понятно, то здесь N являются строками, затем M - являются столбцами. Отсчёт ведётся от индекса [0][0] и заполняется построково(т.е. элементы a[0][0] -> a[0][1] -> a[0][2] и так далее, затем идёт заполнение другой строчки: a[1][0] -> a[1][1] -> a[1][2] и так далее). Я думаю, что это несложно и понятно.

Какой смысл делать так:
C++
1
2
3
4
5
6
7
8
9
10
    const int m=6, n=4;
    int a[m][n];
    int x = 5, y = 0;
    
    for (int i = 0; i<n ; i++)
    {
        for (int j = 0; j<m ; j++)
        { ...........
.....................
.....................
Я не понимаю. Вы объявляете массив, на который выделено памяти ровно на 6 строк и 4 столбца. Но затем заполняете его на 4 строки и 6 столбцов! Меньше можно, да. Так как памяти выделено больше. Но больше - нельзя, ибо все остальные элементы имеющие, скажем, индекс начиная с a[4][0] и так далее - улетают вникуда. И что происходит потом и какие результаты он выдаёт вам в конце - Бог его знает. Вряд ли, как мне кажется, кто-то вам предскажет какие числа он выдаст вам потом. Это было первое.

Второе.
C++
1
2
3
4
5
6
7
8
for (int j = 0; j < m; j++)               
    {
        for (int i = 0; i < n ; i++)
        {
            cout<<"  "<<a[i][j]<<"  ";
        }
        cout<<endl;
    }
Теперь выводе массива на экран происходит непонятная дичь, позвольте так сказать. Вы выводе массив на экран с точностью наоборот, как вы его заполняли. Это глупо делать и никогда не выдаст вам верный результат.
Объясняю понятней.
C++
1
2
3
4
 for (int i = 0; i<n ; i++)
    {
        for (int j = 0; j<m ; j++)
        { ...........
Смотрим код выше. Вы заполнили его как i - строки, j - столбцы. (То, что у вас ошибка в переполнении - я высказал выше).
Но затем вы выводите его как:
C++
1
2
3
4
5
6
7
8
for (int j = 0; j < m; j++)           //Напоминаю!! Это были у вас СТОЛБЦЫ    
    {
        for (int i = 0; i < n ; i++)   //А это были у вас СТРОКИ
        {
            cout<<"  "<<a[i][j]<<"  ";
        }
        cout<<endl;
    }
То есть, вы всё перевернули. Как заполняете массив, так его и выводите! Если вы хотели поработать с массивами и понять, как они работают, прошу перечитать данные темы на различных сайтах и порешать задачи, но никак не экспериментировать вот так :/

Ну и наконец, правильный код должен был выглядеть вот так:
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
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    const int m=6, n=4;
    int a[m][n];
    int x = 5, y = 0;
    
    for (int i = 0; i<m ; i++)
    {
        for (int j = 0; j<n ; j++)
        {
            a[i][j] = y; 
                if (j >= x)
                {
                    a[i][j] = y+1;
                } 
        }
        y++;x--; 
    }
 
   for (int i = 0; i < m; i++)               
    {
        for (int j = 0; j < n ; j++)
        {
            cout<<"  "<<a[i][j]<<"  ";
        }
        cout<<endl;
    }
return 0;
}
А так, всё зависит от цели вашего кода. Можно манипулировать массивом как вы пожелаете. Главное, не переполнять его.
Doctor123
21 / 21 / 5
Регистрация: 03.12.2013
Сообщений: 101
15.08.2016, 17:42     Потерялся в двумерном массиве #13
Всё, я понял.
За всё это время я не заметил, что размерность (строки и столбцы) поменяны местами.
Стояло int a[6][4], а нужно написать так int a[4][6]

Вот теперь нет никаких переполнений и глюков:

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
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    
    int x = 5, y = 0, i = 0, j = 0;
    int Proverka = 1;
    int a[4][6];
 
    for (i = 0; i < 4; ++i)           
    {
        for (j = 0; j < 6 ; ++j)
        {
            a[i][j] = y;
 
            if(j >= x) a[i][j] = y+1;
        }
        ++y;
        x--;
    }
 
    for (j = 0; j < 6; j++)              
    {
        for (i = 0; i < 4 ; i++)    cout<<"  "<<a[i][j]<<"  ";
        cout<<endl;
    }
return 0;
}
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
15.08.2016, 18:00  [ТС]     Потерялся в двумерном массиве #14
Вот исправил, перепутал местами m и n, теперь все работет правильно.
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
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    const int m=6, n=4;
    int a[m][n];
    int x = 5, y = 0;
    
    for (int j = 0; j<n ; j++)
    {
        for (int i = 0; i<m ; i++)
        {
            a[i][j] = y; 
                if (i >= x)
                {
                    a[i][j] = y+1;
                } 
        }
        y++;x--; 
    }
 
   for (int i = 0; i < m; i++)               
    {
        for (int j = 0; j < n ; j++)
        {
            cout<<"  "<<a[i][j]<<"  ";
        }
        cout<<endl;
    }
return 0;
}
Lexxxxy
5 / 5 / 4
Регистрация: 07.08.2016
Сообщений: 31
15.08.2016, 18:05     Потерялся в двумерном массиве #15
_Ivana,
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2016, 18:08     Потерялся в двумерном массиве
Еще ссылки по теме:

C++ Звёздочки в двумерном массиве
C++ Функции в двумерном массиве
C++ Динамика в двумерном массиве

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

Или воспользуйтесь поиском по форуму:
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
15.08.2016, 18:08  [ТС]     Потерялся в двумерном массиве #16
Цитата Сообщение от Doctor123 Посмотреть сообщение
int a[4][6];
Ага 4 строки и 6 столбцов
Yandex
Объявления
15.08.2016, 18:08     Потерялся в двумерном массиве
Ответ Создать тему
Опции темы

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