txt中的C++魔术方块:只读取第一个方块

C++ Magic Square from txt: Only reads first square

本文关键字:方块 读取 第一个 txt C++ 魔术 中的      更新时间:2023-10-16

这与我问的另一个问题有关,但现在我已经深入了一点。我正在尝试创建一个基于文本文件输入的魔术方块程序。该程序将读取第一个方块,但随后打印出其余方块的胡言乱语。如果有一个单独的数字,它应该为后面的平方设置参数。下面是文本文件中的一个示例:

3      <- this indicates the rows&columns
4 9 2  <- row 1
3 5 7  <- row 2
8 1 6  <- row 3
5      <- start of next square. rows&columns
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
7
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20

这是我目前为止的节目。我正在努力遵循分配说明,这就是为什么我有2d数组和函数设置方式,我做

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
const int SIZE = 20;
void readSquare(int, int[][SIZE]);
void printSquare(int, int[][SIZE]);
bool checkMagic(int, int[][SIZE]);
int sumRow(int, int, int[][SIZE]);
int sumColumn(int, int, int[][SIZE]);
int sumDiagonal1(int, int[][SIZE]);
int sumDiagonal2(int, int[][SIZE]);
int main()
{
    int n;
    int square[SIZE][SIZE];
    ifstream inputFile;
    inputFile.open("Prog2Input.txt");
    while (inputFile >> n)
    {
        readSquare(n, square);
        printSquare(n, square);
        if (checkMagic(n, square))
        {
            cout << "Magic Square" << endl;
        }
        else
        {
            cout << "NOT Magic Square" << endl;
        }
        system("pause");
    }
    system("pause");
    return 0;
}
void readSquare(int n, int square[][SIZE]) {
    ifstream inf("Prog2Input.txt");
    int x;
    for (int i = 0; i<n; i++) {
        for (int j = 0; j<n; j++) {
            inf >> x;
            square[i][j] = x;
        }
    }
}
void printSquare(int n, int square[][SIZE]) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << square[i][j] << " ";
        }
        cout << endl;
    }
}
bool checkMagic(int n, int square[][SIZE]) {
    int total = ((1 + n*n) / 2)*n;
    for (int i = 0; i < n; i++) {
        if (sumRow(i, n, square) != total) {
            return false;
        }
    }
    for (int i = 0; i<n; i++) {
        if (sumColumn(i, n, square) != total) {
            return false;
        }
    }
    if (sumDiagonal1(n, square) != total) {
        return false;
    }
    if (sumDiagonal2(n, square) != total) {
        return false;
    }
    return true;
}
int sumRow(int row, int n, int square[][SIZE]) {
    int sum = 0;
    for (int i = 0; i<n; i++) {
        sum += square[row][i];
    }
    return sum;
}
int sumColumn(int col, int n, int square[][SIZE]) {
    int sum = 0;
    for (int i = 0; i<n; i++) {
        sum += square[i][col];
    }
    return sum;
}
int sumDiagonal1(int n, int square[][SIZE]) {
    int sum = 0;
    for (int i = 0; i<n; i++) {
        sum += square[i][i];
    }
    return sum;
}
int sumDiagonal2(int n, int square[][SIZE]) {
    int sum = 0;
    for (int i = 0; i<n; i++) {
        sum += square[i][(n - i) - 1];
    }
    return sum;
}

所有,我感谢您帮助解决这个问题。我将你的评论与我的教授们结合起来,编写了以下代码。这将处理由初始大小整数指定的未知数量的幻方矩阵。首先是示例文本文件:

3      <- this indicates the rows&columns
4 9 2  <- row 1
3 5 7  <- row 2
8 1 6  <- row 3
5      <- start of next square. rows&columns
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
7
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20

现在是代码的最终产品:

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
const int SIZE = 20;
ifstream inf;
void readSquare(int, int[][SIZE]);
void printSquare(int, int[][SIZE]);
bool checkMagic(int, int[][SIZE]);
int sumRow(int, int, int[][SIZE]);
int sumColumn(int, int, int[][SIZE]);
int sumDiagonal1(int, int[][SIZE]);
int sumDiagonal2(int, int[][SIZE]);
int main()
{
    int n;
    int square[SIZE][SIZE];
    inf.open("Prog2Input.txt");
    while (inf >> n)
    {
        cout << "Matrix Size: " << n << endl;
        readSquare(n, square);
        printSquare(n, square);
        if (checkMagic(n, square))
        {
            cout << "Magic Square" << endl;
        }
        else
        {
            cout << "NOT Magic Square" << endl;
        }
        cout << endl;
    }
    system("pause");
    return 0;
}
void readSquare(int n, int square[][SIZE]) {
    int x;
    for (int i = 0; i<n; i++) {
        for (int j = 0; j<n; j++) {
            inf >> x;
            square[i][j] = x;
        }
    }
}
void printSquare(int n, int square[][SIZE]) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << square[i][j] << " ";
        }
        cout << endl;
    }
}
bool checkMagic(int n, int square[][SIZE]) {
    int total = ((1 + n*n) / 2)*n;
    for (int i = 0; i < n; i++) {
        if (sumRow(i, n, square) != total) {
            return false;
        }
    }
    for (int i = 0; i<n; i++) {
        if (sumColumn(i, n, square) != total) {
            return false;
        }
    }
    if (sumDiagonal1(n, square) != total) {
        return false;
    }
    if (sumDiagonal2(n, square) != total) {
        return false;
    }
    return true;
}
int sumRow(int row, int n, int square[][SIZE]) {
    int sum = 0;
    for (int i = 0; i<n; i++) {
        sum += square[row][i];
    }
    return sum;
}
int sumColumn(int col, int n, int square[][SIZE]) {
    int sum = 0;
    for (int i = 0; i<n; i++) {
        sum += square[i][col];
    }
    return sum;
}
int sumDiagonal1(int n, int square[][SIZE]) {
    int sum = 0;
    for (int i = 0; i<n; i++) {
        sum += square[i][i];
    }
    return sum;
}
int sumDiagonal2(int n, int square[][SIZE]) {
    int sum = 0;
    for (int i = 0; i<n; i++) {
        sum += square[i][(n - i) - 1];
    }
    return sum;
}