Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
1

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

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

Author24 — интернет-сервис помощи студентам
Дан квадратный массив задаваемой размерности, нужно вывести в ряд его элементы змейкой начиная с элемента последней строки последнего столбца и заканчивая элементом посередине массива, идти нужно оббегая массив
Вывод массива по спирали. Ошибка исполнения.

 Комментарий модератора 
Картинки загружайте на форум, во избежание их удаления или потери на сторонних ресурсах.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2011, 20:38
Ответы с готовыми решениями:

вывод массива по спирали
Задание: вывести двухмерный массив(25х30) по спирали с левого нижнего угла вправо. Помогите плиз

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

Вывод массива от центра по спирали в строку
Как вывести массив от центра по спирали в одну строку?Нужно срочно!!Помогите кто может!!!

Ошибка времени исполнения: Индекс находился вне границ массива
uses graphabc; var pic : array of picture; i,j : integer; pole : array of integer; begin...

20
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
2554 / 1319 / 178
Регистрация: 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
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 17:58  [ТС] 5
Нужно обойти массив как бы змейкой, то есть вывести сначала нижнюю строку справа налево, потом левую крайнюю снизу вверх, затем верхнюю слева направо и потом крайнюю правую сверху вниз, после первого круга надо перейти на один элемент по диагонали и точно так же вывести элементы второго круга.

Добавлено через 1 минуту
https://www.cyberforum.ru/cpp-... 87322.html
вот тут описано задание
0
2554 / 1319 / 178
Регистрация: 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
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 21:10  [ТС] 7
Попробовала я, но что-то он какие-то странные цифры мне выдает...
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.11.2011, 21:14 8
Цитата Сообщение от Nevado4ka Посмотреть сообщение
Попробовала я, но что-то он какие-то странные цифры мне выдает...
Уточните, пожалуйста.
0
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 21:22  [ТС] 9
Вот что выдает
Миниатюры
Вывод массива по спирали. Ошибка исполнения.  
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.11.2011, 21:33 10
Я несколько раз правил, после последней поправки должно выводится 6 строчек.
Гляньте на массивы в int main(). Строчки - вывод змейкой каждого массива.
0
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 21:41  [ТС] 11
мне просто нужно чтобы выглядело это вот так https://www.cyberforum.ru/cpp-... 87322.html то есть сначала сам массив, а потом в одну строку значения элементов
0
2554 / 1319 / 178
Регистрация: 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
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
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
2554 / 1319 / 178
Регистрация: 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
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
30.11.2011, 22:20  [ТС] 16
за комментарии спасибо и за функцию вообще огромнейшее)))
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.11.2011, 22:35 17
Цитата Сообщение от Nevado4ka Посмотреть сообщение
функцию вообще огромнейшее
Поаккуратнее с ней, возможно, она не до конца протестирована. Если будут косяки в работе напишите сюда или в ЛС - поправлю.
0
0 / 0 / 0
Регистрация: 18.11.2011
Сообщений: 45
01.12.2011, 10:30  [ТС] 18
хорошо, но пока в измененной версии все нормально работает, тьфу тьфу тьфу))
0
1 / 1 / 2
Регистрация: 27.11.2011
Сообщений: 9
01.12.2011, 20:57 19
Когда - то писал что то по типо вашей, так что вот мой вариант

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
#include<fstream.h>
int main()
{
    int j,n,m,x,y,i,s,q;
    int k[200][200];
    ifstream fin("1.dat");
    ofstream fout("1.sol");
    fin>>n>>m;
    fin.close();
    i=1;y=0;s=m*n;
    while(i<=s)
    {y++;
     for(q=y-1;q<=m-y;q++)
      {
        if(i<=s)
        {
           k[y-1][q]=i;
           i++;
         }
      }
      for(q=y;q<=n-y;q++)
      {
         if(i<=s)
         {
           k[q][m-y]=i;
           i++;
         }
      }
      for(q=m-y-1;q>=y-1;q--)
      {
        if(i<=s)
        {
          k[n-y][q]=i;
          i++;
        }
      }
      for(q=n-y-1;q>=y;q--)
      {
        if(i<=s)
        {
          k[q][y-1]=i;
          i++;
        }
      }
     }
     for(i=0;i<n;i++)
     {if(i>0)fout<<"\n";
       for(j=0;j<m;j++)
      { if(k[i][j]<10)fout<<"   "<<k[i][j]<<" ";
        if(k[i][j]>=10&&k[i][j]<=99)fout<<"  "<<k[i][j]<<" ";
        if(k[i][j]>=100&&k[i][j]<=999)fout<<" "<<k[i][j]<<" ";
        if(k[i][j]>=1000&&k[i][j]<=9999)fout<<k[i][j]<<" ";
       
       
       }
       
     }
    
}
0
soon
01.12.2011, 21:45     Вывод массива по спирали. Ошибка исполнения.
  #20

Не по теме:

C++
1
2
3
4
{ if(k[i][j]<10)fout<<"   "<<k[i][j]<<" ";
if(k[i][j]>=10&&k[i][j]<=99)fout<<"  "<<k[i][j]<<" ";
if(k[i][j]>=100&&k[i][j]<=999)fout<<" "<<k[i][j]<<" ";
if(k[i][j]>=1000&&k[i][j]<=9999)fout<<k[i][j]<<" ";
Для этого есть setw(int) в iomanip ;)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2011, 21:45

Ошибка исполнения
Вводиться и выводиться без ошибок, но иногда выводит ошибку исполнения. Пожалуйста, подскажите где...

Ошибка исполнения
При вводе &quot;ARozA upalaNalapu AzoRA&quot; выводит &quot;Yes&quot; без ошибки, а при вводе &quot;A RozA upala Na lapu...

Ошибка исполнения
#include &quot;conio.h&quot; // Для функции getch() #include &lt;string.h&gt; struct screen_point{ // ...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru