我无法让这个工作。我需要构造一个名为ThreeBy3的类来管理一个3乘3的整数数组。该类需要具有显示其数组的方法,并确定该数组是否符合魔方的标准 从下面的文件中读取3 x 3个数组。对于每一个读取,创建一个ThreeBy3的实例,然后显示该数组,然后使用一行输出来指出该数组是否是魔术方块。不要在不再需要时删除该实例。
我在最后遇到动态指针的问题。谢谢
这是我的代码:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <istream>
using namespace std;
using std::cout;
using std::endl;
using std::istream;
{
class ThreeBy3
{
static const int SQ = 3;
static const int rows[][3][2];
static const int rowCount;
int square[SQ][SQ];
int sum;
public:
ThreeBy3(int ms[][3]);
bool isMagicSquare();
void display(std::ostream& os);
};
const int ThreeBy3::rows[][3][2] = {
{ { 0, 0 }, { 0, 1 }, { 0, 2 } },
{ { 1, 0 }, { 1, 1 }, { 1, 2 } },
{ { 2, 0 }, { 2, 1 }, { 2, 2 } },
{ { 0, 0 }, { 1, 0 }, { 2, 0 } },
{ { 0, 1 }, { 1, 1 }, { 2, 1 } },
{ { 0, 2 }, { 1, 2 }, { 2, 2 } },
{ { 0, 0 }, { 1, 1 }, { 2, 2 } },
{ { 0, 2 }, { 1, 1 }, { 2, 0 } },
};
const int ThreeBy3::rowCount = (sizeof rows) / (sizeof rows[0]);
bool ThreeBy3::isMagicSquare()
{
for (int i = 0; i < 8; i++)
{
int x = 0;
for (int j = 0; j < 3; j++)
x += square[rows[i][j][0]][rows[i][j][1]];
if (x != sum)
return false;
}
return true;
}
void ThreeBy3::display(std::ostream& os)
{
const int W = 2;
os << std::setprecision(1) << std::fixed;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
cout << square[i][j] << " ";
cout<< endl;
}
}
}
int main ()
{
static const int SQ = 3;
std::ifstream ifs;
std::string path = "path-to/msq2.txt";
int iv;
int ix, jx;
int ms[3][3] = { { 0 }, { 0 }, { 0 } };
int rcd = 0;
ThreeBy3 *msq;
ifs.open(path);
if (!ifs)
{
cout << "file not found:" << path << endl;
return -1;
}
while (!ifs.eof())
{
bool readThreeBy3(std::istream& strm, int ms[][3]);
{
int ix, jx, iv;
for (ix = 0; ix < 3; ++ix)
{
for (jx = 0; jx < 3; ++jx)
{
strm >> iv;
if (strm.eof())
return false;
ms[ix][jx] = iv;
}
}
return true;
}
++rcd;
if (msq->isMagicSquare())
{
cout << " is a magic square" << endl;
}
else
{
cout << " is NOT a magic square" << endl;
}
}
eof:
ifs.close();
return 0;
}
这是文件
2 7 6
9 5 1
4 3 8
2 9 4
7 1 3
6 5 8
4 3 8
9 5 1
2 7 6
4 9 2
3 7 5
8 1 6
6 1 8
7 5 3
2 9 4
6 7 2
1 5 9
8 3 4
8 1 6
3 5 7
4 9 2
8 3 4
1 6 9
5 7 2
答案 0 :(得分:0)
我改变了几件事:
在C ++中,你不能在另一个函数中定义一个本地函数,所以我把它移到了全局范围。但是没有理由拥有一个自由函数 - 如果它是一个在内部数组上运行的成员函数,那么我们根本不需要main中的数组。所以我把它变成了一个成员函数。
另一件事是你不需要指向ThreeBy3的指针,因为没有理由动态分配它 - 它永远不会比它分配的函数更长寿。所以我把它变成了一个局部变量。
此外,您的循环不应该基于文件末尾 - 许多其他内容可能导致它完成读取数据。所以我已经改变它以检查其他结束条件。
我删除了using namespace std;
,虽然在课堂上有用但不是很好的编程习惯。
这是我改变它的方式:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <istream>
using std::cout;
using std::endl;
using std::istream;
using std::ostream;
using std::ifstream;
using std::string;
class ThreeBy3
{
static const int SQ = 3;
static const int sum = 15;
static const int rows[][3][2];
static const int rowCount;
int square[SQ][SQ];
public:
bool isMagicSquare();
void display(ostream& os);
bool read(istream& os);
};
const int ThreeBy3::rows[][3][2] = {
{ { 0, 0 }, { 0, 1 }, { 0, 2 } },
{ { 1, 0 }, { 1, 1 }, { 1, 2 } },
{ { 2, 0 }, { 2, 1 }, { 2, 2 } },
{ { 0, 0 }, { 1, 0 }, { 2, 0 } },
{ { 0, 1 }, { 1, 1 }, { 2, 1 } },
{ { 0, 2 }, { 1, 2 }, { 2, 2 } },
{ { 0, 0 }, { 1, 1 }, { 2, 2 } },
{ { 0, 2 }, { 1, 1 }, { 2, 0 } },
};
const int ThreeBy3::rowCount = (sizeof rows) / (sizeof rows[0]);
bool ThreeBy3::isMagicSquare()
{
for (int i = 0; i < rowCount; i++)
{
int x = 0;
for (int j = 0; j < SQ; j++)
x += square[rows[i][j][0]][rows[i][j][1]];
if (x != sum)
return false;
}
return true;
}
void ThreeBy3::display(ostream& os)
{
os << std::setprecision(1) << std::fixed;
for (int i = 0; i < SQ; ++i)
{
os << "\n";
for (int j = 0; j < SQ; ++j)
os << square[i][j] << " ";
}
}
bool ThreeBy3::read(istream& is)
{
for (int ix = 0; ix < SQ; ++ix)
for (int jx = 0; jx < SQ; ++jx)
if (!(is >> square[ix][jx]))
return false;
return true;
}
int main ()
{
string path = "path-to/msq2.txt";
ifstream ifs;
ThreeBy3 msq;
ifs.open(path);
if (!ifs)
{
cout << "file not found:" << path << endl;
return -1;
}
while (msq.read(ifs))
{
msq.display(cout);
if (msq.isMagicSquare())
{
cout << "is a magic square" << endl;
}
else
{
cout << "is NOT a magic square" << endl;
}
}
ifs.close();
return 0;
}