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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.91
Nevado4ka
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
#1

Вывод массива по спирали. Ошибка исполнения. - C++

19.11.2011, 20:38. Просмотров 3046. Ответов 20
Метки нет (Все метки)

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

Ошибка исполнения при заполнении массива - C++
Программа работы с квадратными матрицами. Используются динамические массивы. Задание из вуза. Использование функций запрещено по...

Ошибка этапа исполнения - C++
Доброго времени суток! Хочу разобраться с ошибкой, буду благодарна за помощь) Вот код функции: void addCard ( sDeck* oldDeck,...

Ошибка во время исполнения - C++
Здравствуйте, вылазит ошибка: Debug Assertion Failed! Expression: string subscript out of range while(getline(ffc, bffc)) { int...

Ошибка во время исполнения - C++
При попытке запустить программу Visual Studio пишет: Unhandled exception at 0x011027ce in GLTore.exe: 0xC0000005: Access violation...

MPI, ошибка исполнения - C++
int size, rank; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Status...

Ошибка исполнения Stack overflow - C++
Решил написать что-то вроде стратегии в консоле, но в итоге застрял в самом начале ( не могу найти нормальный способ сравнивать строки, уже...

20
Nevado4ka
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 17:32  [ТС] #2
ума не приложу, что не так... пишет либо "Необработанное исключение в "0x0112464b" в "zme0.exe": 0xC0000005: Нарушение прав доступа при чтении "0xabababbb". либо пишет вместо нужных цифр какие-то отрицательные большие числа одинаковые(((( вижуал студио 2010. а дев С++ не компилирует просто без всяких слов.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
 
int main()
{   
    int n = 4;
    int m = 5;
    int k=1;
    int ** A = new int * [n];
        for (int i = 0; i < n; i++)
        {
           A [i] = new int [m];
        }
                
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++)
        {
            A [i][j] = k;
            k++;
            if ( A [i] [j] < 10) { cout << " ";}
            cout << A [i][j] << " ";
        }
        cout << endl;
    }
    cout << endl <<endl;
    
    int i=0;
    int P = 5;
    int N = 4;
    int L = 0;
    int V = 0;
    //int l = n*m;
    int B [100];
 
 
while ((L < P) && (V < N)) {
    for (i = 0;  i < P; i++){
        cout << A[P - i][N];     
        N = N - 1;
            for (i = 0; i < V; i++){
                B[i] = A[L][N - i]; 
                V = V - 1; 
                    for (i = 0; i < P; i++){
                        B[i] = A[L + i][V];
                        L = L + 1; 
                            for (i = 0; i < V; i++){
                                B[i] = A[P][V + i]; 
                                V = V + 1; 
                            }
                    }
            }
    }
                    
            
    
}           
            
for ( i =0; i < l; i++){
    cout << B [i] << " ";
}
cout << endl;
 Комментарий модератора 
Создавайте темы с осмысленными и понятными названиями - это серьезно повышает шансы, что на ваш вопрос ответят.
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.11.2011, 17:40 #3
Вы лучше скажите задание, ибо тут, пардон, черт ногу сломит.
Цитата Сообщение от Nevado4ka Посмотреть сообщение
cout << A[P - i][N];
Как минимум тут выход за границы массива.
0
-=ЮрА=-
Заблокирован
Автор FAQ
30.11.2011, 17:41 #4
Nevado4ka, какую задачу должен решать данный алгоритм?Думаю всё можно на много изящней написать, хочу понять что писать
0
Nevado4ka
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 17:58  [ТС] #5
Нужно обойти массив как бы змейкой, то есть вывести сначала нижнюю строку справа налево, потом левую крайнюю снизу вверх, затем верхнюю слева направо и потом крайнюю правую сверху вниз, после первого круга надо перейти на один элемент по диагонали и точно так же вывести элементы второго круга.

Добавлено через 1 минуту
http://www.cyberforum.ru/cpp-beginners/thread387322.html
вот тут описано задание
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.11.2011, 20:43 #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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
 
template <class T> void snakePrint(const T &arr, const int ROWS, const int COLS)
{
    int s = ROWS * COLS;                
    for(int sh = 0, count = 0; count < s; ++sh)
    {
        for(int i = ROWS - 1 - sh, j = COLS - 1 - sh; (i >= 0) && (j >= sh) && (count < s); --j)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
        
        for(int i = ROWS - 2 - sh, j = sh; (i >= sh) && (count < s); --i)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
 
        for(int i = sh, j = sh + 1; (sh != ROWS - 1) && (j < COLS - sh) && (count < s); ++j)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
               
        for(int i = sh + 1, j = COLS - 1 - sh; (i < ROWS - sh - 1) && (j > 0) && (count < s); ++i)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
    } 
}
 
int main()
{
    const int ROWS = 4;
    const int COLS = 4;
    int arr[ROWS][COLS] = { { 4, 5,  6,  100 },
                            { 3, 7,  8,  200 },
                            { 2, 9,  10, 300 },
                            { 1, 11, 12, 400 } };
                            
    int arr1[4][1] = { { 4 },
                       { 3 },
                       { 2 },
                       { 1 } };
                       
    int arr2[4][2] = { { 4, 5  },
                       { 3, 7  },
                       { 2, 9  },
                       { 1, 11 } };
                            
    int arr3[1][4] = { { 1, 2, 3, 4 } };
    
    int arr4[2][4] = { { 1, 2, 3, 4 },
                       { 5, 6, 7, 8 } };
    
    int arr5[3][4] = { { 1, 2,  3,  4 },
                       { 5, 6,  7,  8 },
                       { 9, 10, 11, 12 } };
                       
    snakePrint(arr, ROWS, COLS);
    std::cout << std::endl;
    snakePrint(arr1, 4, 1);
    std::cout << std::endl;
    snakePrint(arr2, 4, 2);
    std::cout << std::endl;
    snakePrint(arr3, 1, 4);
    std::cout << std::endl;
    snakePrint(arr4, 2, 4);
    std::cout << std::endl;
    snakePrint(arr5, 3, 4);
    return 0;
}
Поправил.
0
Nevado4ka
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 21:10  [ТС] #7
Попробовала я, но что-то он какие-то странные цифры мне выдает...
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.11.2011, 21:14 #8
Цитата Сообщение от Nevado4ka Посмотреть сообщение
Попробовала я, но что-то он какие-то странные цифры мне выдает...
Уточните, пожалуйста.
0
Nevado4ka
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 21:22  [ТС] #9
Вот что выдает
0
Миниатюры
Вывод массива по спирали. Ошибка исполнения.  
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.11.2011, 21:33 #10
Я несколько раз правил, после последней поправки должно выводится 6 строчек.
Гляньте на массивы в int main(). Строчки - вывод змейкой каждого массива.
0
Nevado4ka
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 21:41  [ТС] #11
мне просто нужно чтобы выглядело это вот так http://www.cyberforum.ru/cpp-beginners/thread387322.html то есть сначала сам массив, а потом в одну строку значения элементов
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.11.2011, 21:48 #12
Все, я вас понял, держите
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <iomanip>
 
template <class T> void snakePrint(const T &arr, const int ROWS, const int COLS)
{
    int s = ROWS * COLS;                
    for(int sh = 0, count = 0; count < s; ++sh)
    {
        for(int i = ROWS - 1 - sh, j = COLS - 1 - sh; (i >= 0) && (j >= sh) && (count < s); --j)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
        
        for(int i = ROWS - 2 - sh, j = sh; (i >= sh) && (count < s); --i)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
 
        for(int i = sh, j = sh + 1; (sh != ROWS - 1) && (j < COLS - sh) && (count < s); ++j)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
               
        for(int i = sh + 1, j = COLS - 1 - sh; (i < ROWS - sh - 1) && (j > 0) && (count < s); ++i)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
    } 
}
 
int main()
{
    const int ROWS = 5;
    const int COLS = 5;
    int arr[ROWS][COLS];
    for(int i = 0; i < ROWS; ++i)
    {
        for(int j = 0; j < COLS; ++j)
        {
            arr[i][j] = i * ROWS + j + 1;
            std::cout << std::setw(5) << arr[i][j];
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
    snakePrint(arr, ROWS, COLS);
    std::cout << std::endl;
    return 0;
}
output
Код
soon@bt:~/Desktop$ g++ main.cpp -o main
soon@bt:~/Desktop$ ./main
    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

25 24 23 22 21 16 11 6 1 2 3 4 5 10 15 20 19 18 17 12 7 8 9 14 13 
soon@bt:~/Desktop$
0
Nevado4ka
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 22:04  [ТС] #13
В общем насколько я поняла, тут как-то сложно...вот мой код, переделанный, работающий так, как нужно. единственное боюсь функцию объяснить не смогу((
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
template <class T> void snakePrint(const T &arr, const int ROWS, const int COLS)
{
    int s = ROWS * COLS;                
    for(int sh = 0, count = 0; count < s; ++sh)
    {
        for(int i = ROWS - 1 - sh, j = COLS - 1 - sh; (i >= 0) && (j >= sh) && (count < s); --j)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
        
        for(int i = ROWS - 2 - sh, j = sh; (i >= sh) && (count < s); --i)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
 
        for(int i = sh, j = sh + 1; (sh != ROWS - 1) && (j < COLS - sh) && (count < s); ++j)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
               
        for(int i = sh + 1, j = COLS - 1 - sh; (i < ROWS - sh - 1) && (j > 0) && (count < s); ++i)
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
    } 
}
 
int main()
{
    int n = 4;
    int m = 5;
    cout << " Vvedite N ";
    cin >> n;
    cout << " Vvedite M ";
    cin >> m;
    int k=1;
    int ** A = new int * [n];
        for (int i = 0; i < n; i++)
        {
           A [i] = new int [m];
        }
                
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++)
        {
            A [i][j] = k;
            k++;
            if ( A [i] [j] < 10) { cout << " ";}
            cout << A [i][j] << " ";
        }
        cout << endl;
    }
    cout << endl <<endl;
    
    
    /* const int ROWS = 4;
    const int COLS = 4;
    int arr[ROWS][COLS] = { {  1,  2,  3,  4 },
                            {  5,  6,  7,  8 },
                            {  9, 10, 11, 12 },
                            { 13, 14, 15, 16 } };
                            */
    /*int arr1[4][1] = { { 4 },
                       { 3 },
                       { 2 },
                       { 1 } };
                       
    int arr2[4][2] = { { 4, 5  },
                       { 3, 6  },
                       { 2, 7  },
                       { 1, 8 } };
                            
    int arr3[1][4] = { { 1, 2, 3, 4 } };
    
    int arr4[2][4] = { { 1, 2, 3, 4 },
                       { 5, 6, 7, 8 } };
    
    int arr5[3][4] = { { 1, 2,  3,  4 },
                       { 5, 6,  7,  8 },
                       { 9, 10, 11, 12 } };*/
                       
   
    snakePrint(A, n, m);
    /*std::cout << std::endl;
    snakePrint(arr1, 4, 1);
    std::cout << std::endl;
    snakePrint(arr2, 4, 2);
    std::cout << std::endl;
    snakePrint(arr3, 1, 4);
    std::cout << std::endl;
    snakePrint(arr4, 2, 4);
    std::cout << std::endl;
    snakePrint(arr5, 3, 4);*/
  
    getch(); 
    return 0;
 
}
0
bohdan159
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 3
30.11.2011, 22:06 #14
От-так попробуй.

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
 
int main()
{       
    int n = 4;
    int m = 5;
    int k=1;
    int ** A = new int * [n];
        for (int i = 0; i < n; i++)
                {
           A [i] = new int [m];
        }
                
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++)
                {
            A [i][j] = k;
            k++;
            if ( A [i] [j] < 10) { cout << " ";}
            cout << A [i][j] << " ";
        }
        cout << endl;
    }
    cout << endl <<endl;
        
        int i=0;
        int P = 5;
        int N = 4;
        int L = 0;
        int V = 0;
        //int l = n*m;
        int B [100];
 
 
while ((L < P) && (V < N)) {
        for (i = 0;  i < P; i++){
                cout << A[P - i][N];     
                N = N - 1;
                        for (i = 0; i < V; i++){
                                B[i] = A[L][N - i]; 
                                V = V - 1; 
                                        for (i = 0; i < P; i++){
                                                B[i] = A[L + i][V];
                                                L = L + 1; 
                                                        for (i = 0; i < V; i++){
                                                                B[i] = A[P][V + i]; 
                                                                V = V + 1; 
                                                        }
                                        }
                        }
        }
                                        
                        
        
}                       
                        
for ( i =0; i < l; i++){
        cout << B [i] << " ";
cout << endl;
}
}
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.11.2011, 22:13 #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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <iomanip>
 
template <class T> void snakePrint(const T &arr, const int ROWS, const int COLS) //Можете записать как void snakePrint(const int & arr...
{
    int s = ROWS * COLS; //Кол-во элементов                
    for(int sh = 0, count = 0; count < s; ++sh) //sh - сдвиг
    {
        for(int i = ROWS - 1 - sh, j = COLS - 1 - sh; (i >= 0) && (j >= sh) && (count < s); --j) //Выводим нижнюю строку
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
        
        for(int i = ROWS - 2 - sh, j = sh; (i >= sh) && (count < s); --i) //Выводим левый столбец
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
 
        for(int i = sh, j = sh + 1; (sh != ROWS - 1) && (j < COLS - sh) && (count < s); ++j) //Выводим верхнюю строку
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
               
        for(int i = sh + 1, j = COLS - 1 - sh; (i < ROWS - sh - 1) && (j > 0) && (count < s); ++i) //Выводим правый столбец
        {
            std::cout << arr[i][j] << ' ';
            ++count;
        }
    } 
}
 
int main()
{
    const int ROWS = 5;
    const int COLS = 5;
    int arr[ROWS][COLS];
    for(int i = 0; i < ROWS; ++i)
    {
        for(int j = 0; j < COLS; ++j)
        {
            arr[i][j] = i * ROWS + j + 1;
            std::cout << std::setw(5) << arr[i][j];
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
    snakePrint(arr, ROWS, COLS);
    std::cout << std::endl;
    return 0;
}
Добавлено через 4 минуты
Цитата Сообщение от bohdan159 Посмотреть сообщение
От-так попробуй.
Тот код неверен.
C++
1
2
for (i = 0; i < P; i++){
    cout << A[P - i][N];
На первой итерации выведется элемент A[P][N], при N = 4, P = 5, т.е. A[5][4], хотя массив 4*5, следовательно будет выход за границу массива.
1
30.11.2011, 22:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2011, 22:13
Привет! Вот еще темы с ответами:

Ошибка исполнения при записи в vector - C++
Вылетает при воде первой строки. Не пойму почему? #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;sstream&gt; #include &lt;fstream&gt; ...

Ошибка этапа исполнения в классе Матрица - C++
Всем привет снова!) Теперь я написала код по задаче, которая гласит: &quot;у вас есть два класса -один одномерный массив, другой матрица. Вы...

Ошибка во время исполнения runtime-error - C++
Добрый день. Программа компилируется на RAD Studio XE3. Нормально работает и показывает правильный результат. При отправке в проверочный...

Ошибка этапа исполнения - переполнение стека - C++
Помогите пожалуйста C++ написала программу она правильно работает, но при каждом запуске она выкидывает окно переполнение стека...


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

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

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