Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
#1

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

13.08.2016, 19:47. Просмотров 355. Ответов 15
Метки нет (Все метки)

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] то ничего не меняется?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2016, 19:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Потерялся в двумерном массиве (C++):

Указатели в двумерном массиве
Помогите пожайлуста!!! Как занулить главную диогональ, скока не пробовал, ни...

Динамика в двумерном массиве
Всем привет. Подскажите, пожалуйста, реально ли реализовать такое. Есть...

В двумерном массиве подсчитать
Для каждой строки в двумерном массиве подсчитать количество положительных...

Функции в двумерном массиве
Ввести двумерные массивы X1,X2. В этих массивах найти минимальные элементы....

Ошибка в двумерном массиве
Делаю игру крестики нолики с использование двумерного массива, и возникла...

Указатели в двумерном массиве
Например есть массив int** mas=new int*; for(int i=0; i&lt;=str;i++) ...

15
MansMI
1447 / 1156 / 549
Регистрация: 08.01.2012
Сообщений: 4,509
13.08.2016, 19:59 #2
for (int i = 0; i<m ; i++){
for (int j = 0; j<n ; j++)
0
Doctor123
22 / 22 / 8
Регистрация: 03.12.2013
Сообщений: 127
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;
}
1
Lexxxxy
5 / 5 / 7
Регистрация: 07.08.2016
Сообщений: 34
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"), как у вас и вышло при компиляции.
1
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
0
Doctor123
22 / 22 / 8
Регистрация: 03.12.2013
Сообщений: 127
14.08.2016, 15:20 #6
Я испугался, что у меня глючит компилятор MSVC 6.0
До упора пытался найти ошибку в простейшем коде, но списал на глюк.
Думал у Вас такого не будет.
Попробую отыскать сегодня - это становится очень интересно.
Настоящий полтергейст.
0
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
14.08.2016, 15:32  [ТС] #7
Цитата Сообщение от Doctor123 Посмотреть сообщение
Я испугался, что у меня глючит компилятор MSVC 6.0
До упора пытался найти ошибку в простейшем коде, но списал на глюк.
Думал у Вас такого не будет.
Попробую отыскать сегодня - это становится очень интересно.
Настоящий полтергейст.
Вот и я не пойму, интересное дело если написать допустим x = 8 то результат не меняется.
0
Doctor123
22 / 22 / 8
Регистрация: 03.12.2013
Сообщений: 127
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;
}
Происходит (каким-то образом) переполнение строк массива.
Может быть при увеличении счётчика цикла выше допустимого. Но как происходит запись в массив, ведь тело цикла не должно выполняться свыше положенного числа.
Такое врятли ещё в жизни встретится, но это желательно понять, что бы не сомневаться в том, что уже казалось "переваренным".
1
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
15.08.2016, 16:55  [ТС] #9
Понял, что ничего не понял
1
Doctor123
22 / 22 / 8
Регистрация: 03.12.2013
Сообщений: 127
15.08.2016, 17:12 #10
Спасибо за интересный вопрос.
Я сам до конца не разобрался, как происходит переполнение строк (столбцов) массива.
Похоже на побочное влияние оператора цикла FOR

Если руки дойдут, попробую Ваш парадоксальный пример разглядеть в своём мониторе-отладчике "UniMons".
И выложу результаты здесь на всеобщее рассмотрение.
Но не обещаю, так как времени уже потратил немало.
0
_Ivana
3232 / 1860 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
15.08.2016, 17:14 #11
Цитата Сообщение от Doctor123 Посмотреть сообщение
И выложу результаты здесь на всеобщее рассмотрение.
Обязательно, ждем продолжение сериала "Затерянные в двумерном массиве - 2", очень интересно развитие сюжета!
0
Lexxxxy
5 / 5 / 7
Регистрация: 07.08.2016
Сообщений: 34
15.08.2016, 17:31 #12
Лучший ответ Сообщение было отмечено Overloading как решение

Решение

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;
}
А так, всё зависит от цели вашего кода. Можно манипулировать массивом как вы пожелаете. Главное, не переполнять его.
1
Doctor123
22 / 22 / 8
Регистрация: 03.12.2013
Сообщений: 127
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;
}
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;
}
0
Lexxxxy
5 / 5 / 7
Регистрация: 07.08.2016
Сообщений: 34
15.08.2016, 18:05 #15
_Ivana,
0
Overloading
6 / 6 / 1
Регистрация: 05.06.2016
Сообщений: 61
15.08.2016, 18:08  [ТС] #16
Цитата Сообщение от Doctor123 Посмотреть сообщение
int a[4][6];
Ага 4 строки и 6 столбцов
0
15.08.2016, 18:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2016, 18:08
Привет! Вот еще темы с решениями:

Звёздочки в двумерном массиве
Дано нечетное число n, не превосходящее 15. Создайте двумерный массив из n×n...

Строки в двумерном массиве
Здравствуйте! Хочу прояснить некоторые моменты по работе с двумерным массивом....

Палиндром в двумерном массиве
Задача звучит так :С клавиатуры вводится размерность целочисленной матрицы,...

Локальные максимумы в двумерном массиве
Здравствуйте, нуждаюсь в помощи Необходимо найти в двумерном массиве(любого...


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

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

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