我试图编写一个在c ++中移位行的函数
例如
1 2 3
4 5 6
7 8 9
我想把它换一,所以结果是
7 8 9
1 2 3
4 5 6
参数是
void Matrix:: rowShift(const int shiftSize){}
这是班级
class Matrix {
private:
std::string type;
int row, col;
double **array;
void rowShift(const int shiftSize);
这是构造函数
Matrix::Matrix(int rows, int cols, std::string matType) {
type = matType;
row = rows;
col = cols;
array= new double*[row];
for (int i = 0; i < row; ++i)
array[i] = new double[col];
for (int i = 0; i < rows; i++)
for (int j = 0; j<cols; j++)
array[i][j] = 0;
}
我想看到的任何想法,我有一个问题,我不习惯语法
答案 0 :(得分:0)
我是C ++的新手,我不习惯语法
首先,如果您不熟悉该语言,在开始编写代码之前,您应该花些时间阅读基础知识。有很多好书可以帮助你入门。我会推荐一些类似于C ++编程的介绍,由该语言的创建者编写。
我正在尝试编写一个在C ++中移位行的函数
所以你有一个二维数组(矩阵),你希望将所有行向下移动,旧的底行成为新的顶行。这似乎可能是你的家庭作业转让。这是你的作业吗?如果是,请在将来标记为对自己和他人诚实。我希望你现在停止阅读你对我的问题的答案,去拿那本书并阅读它的封面。一旦这样做回来检查我的答案。
既然您熟悉C ++,我还假设您熟悉标准模板库和容器对象,例如std::vector
。
这是构造函数
现在您已熟悉C ++,您知道可以使用构造函数参数的成员初始化列表。这意味着您不必在构造函数的主体中初始化它们!我将省略您的std::string matType
变量,因为它不会在您提供的代码中的任何位置使用。我建议使用嵌套的std::vector
来保存矩阵数据而不是C样式数组。 std::vector
课程将为您完成所有内存管理(new double[col]
没有必要)。在这里,我们将类私有成员变量mMatrix
定义为std::vector
行和列std::vector< std::vector<double> > mMatrix;
Matrix( const size_t rows,
const size_t cols ) :
mRows(rows),
mCols(cols),
mMatrix(rows, std::vector<double>(cols)) {
init();
}
Matrix::init()
函数将使用从1
增加到n
的默认值填充矩阵。我们使用您在std::iterator
上阅读的概念来执行此操作。
void init()
{
std::vector< std::vector<double> >::iterator row;
std::vector<double>::iterator col;
double seedVal(1.0);
for (row = mMatrix.begin(); row != mMatrix.end(); ++row)
{
for (col = row->begin(); col != row->end(); ++col)
{
*col = seedVal;
seedVal++;
}
}
}
现在我假设您要打印矩阵的值以验证降档操作是否有效。您可以使用嵌套for循环打印矩阵,这与我们之前初始化值的方式非常相似。这次我们可以使用::const_iterator
,因为当我们打印时,我们保证不会修改内容。我们还使用来自#include <iomanip>
的{{1}}格式标记,例如std::setfill(' ')
和std::setw(6)
,以使间距和格式看起来更漂亮。
void print()
{
std::vector< std::vector<double> >::const_iterator row;
std::vector<double>::const_iterator col;
for (row = mMatrix.begin(); row != mMatrix.end(); ++row)
{
for (col = row->begin(); col != row->end(); ++col)
{
std::cout << std::setfill(' ') << std::setw(6) << *col;
}
std::cout << std::endl;
}
}
现在让我们谈谈你在这里的真正原因。降低整个矩阵的方法(我认为它应该是Matrix
类的公共方法,以便任何人都可以访问它)。首先,无论何时移动数组(向量)的内容,都必须在移位的相反方向上循环。在我们的例子中,我们应该在每一行上反转外环的方向。我们也不想覆盖行的内容而不保存之前的内容。我们可以通过一个临时变量实现这一点,你猜对了,我们在移动新值时暂时保留旧值。这是一种方法,只要我们至少有一行可以使用矩阵的所有元素。
void shiftDown()
{
if (mRows > 0)
{
for (size_t i = mRows - 1; i-- > 0; )
{
for (size_t j = 0; j < mCols; ++j)
{
double temp = mMatrix[i+1][j];
mMatrix[i+1][j] = mMatrix[i][j];
mMatrix[i][j] = temp;
}
}
}
}
现在你有一个自包含的Matrix
类,它有一个方法可以将每一行向下移动并环绕顶行。对于奖励积分,您可以使用此嵌套循环的变体来实现shiftUp()
,shiftLeft()
和shiftRight()
等方法。