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

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

Войти
Регистрация
Восстановить пароль
 
GoreOtUma
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 7
#1

Доработать код для магического квадрата - C++

29.12.2010, 18:58. Просмотров 1003. Ответов 5
Метки нет (Все метки)

Вот задание дали для допуска на экзамен.
3. Магическим квадратом порядка n называется квадратная таблица размером n x n, состоящая из чисел 1, 2,….n2 так, что сумма по каждому столбцу, каждой строке и каждой из двух главных диагоналей равны между собой. Проверьте, является ли заданная в текстовом файле матрица магическим квадратом.

Напечатал что-то, вроде работает, но преподаватель сказал еще доработать.
Я не понимаю как.=)
помогите, уважаемые форумчане.=)
Вот код, что написал с помощью одногрупника.
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
#include "stdafx.h"
 
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main()
{   const int z=3;
    int q,A[z][z], i,j,e[z],r=1, stolb=0, strok,stro[z], stol[z], diag1=0, diag2=0, t, o,k; // diag1- побочная диагональ
    fstream(fin);
    fin.open("text.txt", ios::in);
    for (i=0; i<z; i++)
        {for(j=0; j<z; j++)
            {fin>>A[i][j];}}
    fin.close();
    for (i=0;i<z; i++)
    {for (j=0; j<z; j++)
        {for (o=0;o<z;o++)
            {for (k=0;k<z;k++)
            {if (i==o&j==k)o++&k++;
                if(A[i][j]==A[o][k])
                {for (;;)                   
                cout<<"element povtoriaiytsia"<<'\n';                                       
                }}}}}
for (i=0;i<z; i++)
    {for (j=0; j<z; j++)
{if (A[i][j]<0)
{for (;;)                   
cout<<"element v "<<j+1<<" solbce i "<<i+1<<" stroke ravniy "<<A[i][j]<<" ne v ramkax ot 0 do "<<z*z<<'\n';}
if (A[i][j]>z*z)
{for (;;)                   
cout<<"element v "<<j+1<<" solbce i "<<i+1<<" stroke ravniy "<<A[i][j]<<" ne v ramkax ot 0 do "<<z*z<<'\n';}}}
    for (i=0; i<z; i++)
        {stolb=0;
        strok=0;
            for(j=0; j<z; j++)
            {stolb=stolb+A[j][i];
            strok=strok+A[i][j];}
            stol[i]=stolb;
            stro[i]=strok;} 
    for (i=0;i<z; i++)
    {diag1=diag1+A[i][i];}
    for (i=z-1; i>=0; i--)
    {diag2=diag2+A[i][i];}
    for (i=0; i<z; i++) 
    {if (stol[i]==stro[i] & diag1==diag2 & stro[i]==diag1) e[i]=1;
    else e[i]=0;
        r=r*e[i];}  
    if (r==0)cout<<"ne magicheskiy";
    else cout<<"magicheskiy";
    cin>>q;}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2010, 18:58     Доработать код для магического квадрата
Посмотрите здесь:

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

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

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

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

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

Доработать код - C++
Нужно что-бы программа не заменяла многократные пробелы однократным , а просто удаляла их. (Должно быть в виде функции) #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
29.12.2010, 19:25     Доработать код для магического квадрата #2
Цитата Сообщение от GoreOtUma Посмотреть сообщение
двух главных диагоналей
бывает только одна главная)
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
#include <iostream>
#include <algorithm>
#include <conio.h>
#include <stdio.h>
#include <numeric>
 
using namespace std;
 
void Fail(void)
{
        cout << "Введенная матрица не является магическим квадратом" << endl;
        _getch();
        exit(EXIT_FAILURE);
}
 
int main()
{
        setlocale(LC_ALL, "Russian");
        size_t m;
 
        cout << "Введите порядок матрицы " << endl;
        cin >> m;
 
        int **matrix = (int**) realloc(NULL, sizeof(int*) * m);
        for (size_t i = 0; i < m; ++i)
                matrix[i] = (int*) realloc(NULL, sizeof(int) * m);
 
        // вводим матрицу;
        cout << "Введите элементы матрицы последовательно " << endl;
        for (size_t i = 0; i < m; ++i)
                for(int j = 0; j < m; ++j)
                        cin >> matrix[i][j];
 
        int PartSum = accumulate(matrix[0], matrix[0] + m, 0);
        // проверяем является ли матрицы магическим квадратом;
        // 1. равенство по строкам;
        for(size_t i = 1; i < m; ++i)
                if (PartSum != accumulate(matrix[i], matrix[i] + m, 0))
                        Fail();
 
        // 2. Равенство по стобцам;
        for(size_t i = 1; i < m; ++i)
                if (PartSum != accumulate(*(matrix + i),*(matrix + i) + m, 0))
                        Fail();
 
        // 3. Проверка по диагонали;
        int Sum1 = 0, Sum2  = 0;
        for (size_t i = 0; i < m; ++i)
                Sum1 += matrix[i][i], Sum2 += matrix[i][m - i - 1];
        if (PartSum != Sum1 || PartSum != Sum2)
                Fail();
 
        cout << "Введенная матрицы является магическим квадратом" << endl;
        _getch();
        for (size_t i = 0; i < m; ++i)
                matrix[i] = (int*) realloc(matrix[i], NULL);
        matrix = (int**) realloc(matrix, NULL);
 
        return 0;
}
GoreOtUma
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 7
29.12.2010, 20:27  [ТС]     Доработать код для магического квадрата #3
спасибо, но нужно же, чтобы он из текстового файла матрицу открывал.=)
как вот это сделать в вашем коде?
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
29.12.2010, 23:00     Доработать код для магического квадрата #4
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
#include <iostream>
#include <algorithm>
#include <conio.h>
#include <stdio.h>
#include <numeric>
#include <fstream>
#include <iterator>
 
using namespace std;
 
void Fail(void)
{
    cout << "Введенная матрица не является магическим квадратом" << endl;
    _getch();
    exit(EXIT_FAILURE);
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    size_t m;
    ifstream file("test.txt");
    if(file.fail())
    {
        cout << "Не удалось открыть файл\n";
        exit(EXIT_FAILURE);
    }
    file >> m;
 
    int **matrix = (int**) realloc(NULL, sizeof(int*) * m);
    for (size_t i = 0; i < m; ++i)
        matrix[i] = (int*) realloc(NULL, sizeof(int) * m);
 
    // вводим матрицу;
    cout << "Введите элементы матрицы последовательно " << endl;
    for (size_t i = 0; i < m; ++i)
    {
        for(int j = 0; j < m; ++j)
            file >> matrix[i][j];
        copy(matrix[i], matrix[i] + m, ostream_iterator<int>(cout, "  "));
        cout << endl;
    }
 
    int PartSum = accumulate(matrix[0], matrix[0] + m, 0);
    // проверяем является ли матрицы магическим квадратом;
    // 1. равенство по строкам;
    for(size_t i = 1; i < m; ++i)
        if (PartSum != accumulate(matrix[i], matrix[i] + m, 0))
            Fail();
 
    // 2. Равенство по стобцам;
    for(size_t i = 1; i < m; ++i)
        if (PartSum != accumulate(*(matrix + i),*(matrix + i) + m, 0))
            Fail();
 
    // 3. Проверка по диагонали;
    int Sum1 = 0, Sum2  = 0;
    for (size_t i = 0; i < m; ++i)
        Sum1 += matrix[i][i], Sum2 += matrix[i][m - i - 1];
    if (PartSum != Sum1 || PartSum != Sum2)
        Fail();
 
    cout << "Введенная матрицы является магическим квадратом" << endl;
    _getch();
    for (size_t i = 0; i < m; ++i)
        matrix[i] = (int*) realloc(matrix[i], NULL);
    matrix = (int**) realloc(matrix, NULL);
 
    return 0;
}
в файле, сначало считывает размер, потом сама матрица
типо
4
1 2 3 4
4 2 3 4
1 1 1 1
3 4 4 4
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
29.12.2010, 23:13     Доработать код для магического квадрата #5
sandye51, не учтено:
Цитата Сообщение от GoreOtUma Посмотреть сообщение
состоящая из чисел 1, 2,….n2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2010, 02:24     Доработать код для магического квадрата
Еще ссылки по теме:

Доработать код ежедневника - C++
В общем есть работа : ежедневник и следующая часть кода: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include...

Помогите доработать код. - C++
Задача состоит в следующем: надо создать массив и вставить вместо двух случайных элементов &quot;нули&quot;. После посчитать сумму элементов между...

Нужно немного доработать код - C++
#include &lt;iostream&gt; using namespace std; int main() { int n ; cin &gt;&gt; n; int M = (n-1) + (n-2); ...

Доработать код данной программы - C++
Дан код: #include &lt;iostream&gt; using namespace std; static const int N = 1000; int main() { int i, a; for (i = 2; i &lt; N; i++)...

Доработать код записной книжки - C++
Помагите плыз доработать записную книжку вот код: #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
Минич
66 / 66 / 3
Регистрация: 26.11.2010
Сообщений: 123
30.12.2010, 02:24     Доработать код для магического квадрата #6
Магический квадрат: http://ru.wikipedia.org/wiki/%D0%9C%...80%D0%B0%D1%82
Вот моя версия:
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
#include <fstream>
#include <iostream>
#include <string>
#include <math.h>
#include <iomanip>
using namespace std;
void main()
{
    setlocale(LC_ALL, "Russian");
    ifstream infile("test.txt");
    int n = 0;
    string tempStr;
    // определение количество элементов массива
    while (!infile.eof()) {
        infile >> tempStr;
        n++;
    }
    n = static_cast<int>(sqrt(static_cast<double>(n)));
    infile.close();
 
    // выделение памяти под двумерный динамический массив
    int **pArr = new int*[n];
    for (int i = 0; i < n; i++) {
        pArr[i] = new int[n];
    }
    // заполнение массива из файла
    int i = 0;  
    ifstream file("test.txt");
    while (!file.eof()) {
        file >> pArr[i/n][i%n];
        i++;
    }
    file.close();
 
    // проверка на единственность значения в массиве
    for (int i = 0; i < n*n; i++)
        for (int j = i + 1; j < n*n; j++)
            if (pArr[i/n][i%n] == pArr[j/n][j%n]) {
                cout << "Не магический квадрат!" << endl;
                cin.get();
                return;
            }
    int sum = 0;
    for (int i = 0; i < n; i++) sum += pArr[i][0];
    int tempSum;
    // проверка строк
    for (int i = 0; i < n; i++) {
        tempSum = 0;
        for (int j = 0; j < n; j++)
            tempSum += pArr[i][j];
        if (tempSum != sum) {
            cout << "Не магический квадрат!" << endl;
            cin.get();
            return;
        }
    }
    // проверка столбцов
    for (int i = 0; i < n; i++) {
        tempSum = 0;
        for (int j = 0; j < n; j++)
            tempSum += pArr[j][i];
        if (tempSum != sum) {
            cout << "Не магический квадрат!" << endl;
            cin.get();
            return;
        }
    }
    // проверка диагоналей
    tempSum = 0;
    for (int i = 0; i < n; i++)
        tempSum += pArr[i][i];
    if (tempSum != sum) {
        cout << "Не магический квадрат!" << endl;
        cin.get();
        return;
    }
    tempSum = 0;
    for (int i = 0; i < n; i++)
        tempSum += pArr[i][n-i-1];
    if (tempSum != sum) {
        cout << "Не магический квадрат!" << endl;
        cin.get();
        return;
    }
 
    // вывод массива на экран   
    cout << "Матрица является магическим квадратом:" << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << setw(5) << pArr[i][j];
        cout << endl;
    }
        
    for (int i = 0; i < n; i++)
        delete[] pArr[i];
    delete[] pArr;  
    cin.get();
}
test.txt содержит:
C++
1
2
3
4
7 12 1 14
2 13 8 11
16 3 10 5
9 6 15 4
Yandex
Объявления
30.12.2010, 02:24     Доработать код для магического квадрата
Ответ Создать тему
Опции темы

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