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

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

Восстановить пароль Регистрация
 
GoreOtUma
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 7
29.12.2010, 18:58     Доработать код для магического квадрата #1
Вот задание дали для допуска на экзамен.
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     Доработать код для магического квадрата
Посмотрите здесь:

C++ Построение магического квадрата
C++ Помогите доработать код.
C++ Генерация магического квадрата
C++ Шифровать методом Магического квадрата (размер квадрата 9х9) С++
C++ Доработать код
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 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
программист С++
 Аватар для sandye51
677 / 579 / 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++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
29.12.2010, 23:13     Доработать код для магического квадрата #5
sandye51, не учтено:
Цитата Сообщение от GoreOtUma Посмотреть сообщение
состоящая из чисел 1, 2,….n2
Минич
 Аватар для Минич
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     Доработать код для магического квадрата
Ответ Создать тему
Опции темы

Текущее время: 09:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru