txt中的C++魔术方块:只读取第一个方块
C++ Magic Square from txt: Only reads first square
这与我问的另一个问题有关,但现在我已经深入了一点。我正在尝试创建一个基于文本文件输入的魔术方块程序。该程序将读取第一个方块,但随后打印出其余方块的胡言乱语。如果有一个单独的数字,它应该为后面的平方设置参数。下面是文本文件中的一个示例:
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;
}
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在opencv中查找方块:访问违规读取位置
- txt中的C++魔术方块:只读取第一个方块
- 使用valgrind读取大小为1的俄罗斯方块无效