二维阵列魔方

时间:2017-05-02 00:01:28

标签: c++ arrays

我无法让这个工作。我需要构造一个名为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

1 个答案:

答案 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;
}