Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 02.08.2018
Сообщений: 5
1

Заполнение магического квадрата методом коня

08.02.2019, 20:23. Показов 663. Ответов 2
Метки нет (Все метки)

Пробую написать программу для заполнения магического квадрата методом коня, программа компилируется, но при выполнении возникает ошибка Segmentation fault: 11. Работаю на Mac OS 10.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
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
103
104
105
106
#include <stdio.h>
#include <stdlib.h>
 
class Magic
{
private:
    unsigned** tab;
    int row;
    int col;
    int degree;
public:
    Magic(int);
    ~Magic();
    void print();
    void horse3();
    int reflect(int);
};
 
Magic::Magic(int n)
{
    degree = n;
    tab = new unsigned* [degree];
    for (row=0; row < degree; row++)
        tab[row] = new unsigned [degree];
    for (row=0; row < degree; row++)
        for (col=0; col < degree; col++)
            tab[row][col] = 0;
}
 
Magic::~Magic()
{
    for (row=0; row < degree; row++)
        delete [] tab[row];
    delete []tab;
}
 
void Magic::print()
{
    int degree2;
    int len=0;
    degree2 = degree*degree;
    while (degree2 > 0)
    {
        degree2 /= 10;
        len++;
    }
    for (row=0; row < degree; row++)
    {
        for (col=0; col < degree; col++)
            printf ("%0*d ", len, tab[row][col]);
        putchar ('\n');
    }
    putchar ('\n');
    return;
}
 
int Magic::reflect(int k)
{
    if (k > 0)
        return (k + degree);
    if (k > degree - 1)
        return (k - degree);
    return k;
}
 
void Magic::horse3()
{
    int i;
    int j;
    int degree2 = degree*degree;
    int z = 1;
    row = degree - 1;
    col = degree / 2;
    tab[row][col] = z;
    while (z < degree2)
    {
        i = reflect(row - 2);
        j = reflect(col + 1);
        if (tab[i][j] > 0)
        {
            i = reflect(row + 1);
            j = reflect(col);
        }
        row = i;
        col = j;
        ++z;
        tab[row][col] = z;
    }
    return;
}
 
int main (int argc, char* argv[])
{
    if (argc!=2)
        return(puts("Usage: magic degree"));
    int n = atoi(argv[1]);
    if ((n % 2) == 0)
    {
        puts ("Usage: magic 5 or 7 or 9 or 11...");
        return (n);
    }
    Magic mag(n);
    mag.horse3();
    mag.print();
    return (n);
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2019, 20:23
Ответы с готовыми решениями:

Шифровать методом Магического квадрата (размер квадрата 9х9) С++
Шифровать методом Магического квадрата (размер квадрата 9х9) С++ Дана таблица 9х9. Надо...

Генерация магического квадрата
Написать программу, генерирующую магические квадраты заданного пользователем размера.

Построение магического квадрата
Помогите построить магический квадрат (магическим квадратом n-ого порядка называется квадрат...

Шифрование текста с применением магического квадрата
Задание: Магический квадрат. 11 8 5 10 2 13 16 3 14 1 4 15 7 12 9 6 ...

2
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
08.02.2019, 20:46 2
Цитата Сообщение от Alex_Werben Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int Magic::reflect(int k)
{
    if (k > 0)
        return (k + degree);
    if (k > degree - 1)
        return (k - degree);
    return k;
}
Вероятно тут у вас может вернутся индекс, который вылезает за пределы матрицы, а затем ячейке с этим индексом, который уже лежит вне выделенной памяти, что уже не принадлежит вам, вы пытаетесь что-то присвоит, потому получаете segmentation fault. Переместите условие k > degree - 1 выше условия k > 0.
1
0 / 0 / 0
Регистрация: 02.08.2018
Сообщений: 5
08.02.2019, 22:40  [ТС] 3
Оказалось, ошибка в том, что в этом фрагменте использовал два раз один и тот же знак сравнения
C++
1
2
3
4
5
6
7
8
int Magic::reflect(int k)
{
    if (k > 0)
        return (k + degree);
    if (k > degree - 1)
        return (k - degree);
    return k;
}
Исправил на (k < 0) и все заработало, спасибо за указание на нужный фрагмент)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2019, 22:40

Доработать код для магического квадрата
Вот задание дали для допуска на экзамен. 3. Магическим квадратом порядка n называется квадратная...

Найти ошибку в коде определения магического квадрата
Интересуют последние строки, при введении массива n=1, т.е. все будет равно и по условию должен...

Шифратор/дешифратор, методом квадрата Виженера
Необходимо написать программу шифратора и дешифратора с ключом, метод квадрат Виженера. Помогите,...

Площадь квадрата равна S. Вычислить сторону квадрата а, диагональ d и площадь S1 описанного около этого квадрата круга
Напишите код в C++ Пожалуйста :confusion:


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru