2

我是编程新手,所以我想编写一个代码,让我输入一个二维数组(或者在我的情况下是一个矩阵)并在之后打印它。

#include <iostream>
using namespace std;

void printArray( const int *array, int count ) 
    { 
       for ( int i = 0; i < count; i++ ) 
          cout << array[ i ] << " "; 

       cout << endl; 
    }

int main () {
int n;
cout<<"Please enter the length of your matrix : "<<endl;
cin>>n;
int * y=new int [n];
for (int w = 0; w <= n-1; w++ ) {

    y[w] = new int [n];
    cout<<"Insert the elements ";

            for (int z = 0; z <= n-1; z++)
            {
                cin >>y [w][z];
            }   
}

printArray(y, n);

}

但是,我收到诸如“从'int *'到'int'的无效转换”和“数组下标的无效类型int [int]”之类的错误。你能检查我的代码并指出我的缺陷吗?

谢谢

4

5 回答 5

6

您声明yint*仅是一维的。您需要声明它yint**二维的。

您的代码无法编译的原因是因为int* y指向单个内存块(即整数数组,换句话说,是一堆ints.)。y[w]int该数组中的其中一个,因此y[w] = new int[n]无法编译,因为您试图将 an 分配int*给 an int

更改y为可以指向 s 数组的int**方法。由于每个都可以指向 的数组,因此您将拥有一个二维数组。yint*int*int

10x10 矩阵的示例代码int**

int** iShouldUseStdVector = new int*[10]; // allocate 10 int* <--
for (int i = 0; i < 10; i++)
{
    iShouldUseStdVector[i] = new int[10]; // allocate 10 int <--
    for (int k = 0; k < 10; k++)
    {
        iShouldUseStdVector[i][k] = k;
    }
}

10x10 矩阵的示例代码std::vector

std::vector<std::vector<int>> thisIsEasy;
for (int i = 0; i < 10; i++)
{
    thisIsEasy.push_back(std::vector<int>());
    for (int k = 0; k < 10; k++)
    {
        thisIsEasy[i].push_back(k);
    }
}

我建议std::vector<std::vector<int>> y;改用它,因为它可以方便地为您处理内存,因为您想添加更多元素并在内存被破坏时释放内存。

于 2012-07-30T16:45:44.470 回答
1

int * y=new int [n];

那是一个长度数组n。你需要的是:

int **y = new int*[n];
for (int i=0; i<n; i++)
    y[i] = new int[n];

....

//delete[] y[i] in a loop
delete[] y;

既然您使用的是 C++,为什么不:

#include <vector>

...
std::vector<std::vector<int> > matrix;
于 2012-07-30T16:46:49.517 回答
0

1)您要声明y为指向以下数组的指针int

int ** y = new int* [n];

2)在printArray你处理一个矩阵,而不是一个数组。要访问矩阵的成员,请使用两个嵌套for循环,如下所示:

for (int i = 0; i < nLines; i++) {
    for (int j = 0; i < nColumns; j++) {
        std::cout << matrix[i][j] << std::endl;
    }
}

3)您需要传递一个指向数组的int指针,而不是指向int方法的指针printArray

void printArray( const int **array, int count ) 

在此处找到具有上述修复程序的工作代码:http: //ideone.com/2h9dR

于 2012-07-30T16:50:58.657 回答
0

首先,阅读其他答案,然后再阅读一本好的 C++ 书籍中的指针章节。现在,除非您需要极高的速度,否则请使用vector. 使用 C++11(较新的 C++ 标准),它非常好读,所以我先发布:vectordouble

#include <iostream>
#include <vector>

void printArray( std::vector< std::vector<double> > & v ) {
   for ( const auto & row : v ){
      for ( const auto & value : row ){
        std::cout << value << " ";
      }
      std::cout << std::endl;
   }
}

int main () {
   int n;
   std::cout<<"Please enter the length of your matrix : "<<std::endl;
   std::cin>>n;
   std::vector<std::vector<double>> y(n,std::vector<double>(n,0));
   for ( auto & row : y ){
      std::cout<<"Insert the elements of row :";
      for ( auto & value : row ){
        std::cin >> value;
      }   
   }
   printArray(y);   
}

对于较旧的 C++,它是这样的:

void printArray( std::vector< std::vector<double> > & v ) {
   for ( std::vector<std::vector<double> >::const_iterator it = v.begin(); it != v.end();it++){
      for ( std::vector<double>::const_iterator it2 = it->begin(); it2!= it->end();it2++) {
     std::cout << (*it2) << " ";
      }
      std::cout << std::endl;
   }
}

int main () {
   int n;
   std::cout<<"Please enter the length of your matrix : "<<std::endl;
   std::cin>>n;
   std::vector<std::vector<double> > y(n,std::vector<double>(n,0));
   for ( std::vector<std::vector<double> >::iterator it = y.begin(); it!= y.end();it++){
      std::cout<<"Insert the elements of row :";
      for ( std::vector<double>::iterator it2 = it->begin(); it2!= it->end();it2++) {
     std::cin >> (*it2);
      }   
   }
   printArray(y);   
}

请注意,这y(n,std::vector<double>(n,0))意味着制作n向量,每个向量都有n零。您还可以使用 usey[1][2]来获取和设置值。如果您使用 y.at(1).at(2) 代替,您会得到适当的检查,以便在读取或写入越界时获得异常。

于 2012-07-30T17:25:39.840 回答
0

int * y=new int [n];是指向动态分配的int值数组的指针;

y[w] = new int [n];尝试将指针分配给数组的元素。

作为一项学习练习,使用原始数组是一个好主意。一旦你知道如何使用它们,你就会知道足以停止使用它们(非常)并使用自动存储类型,如std::vector.

于 2012-07-30T16:45:33.487 回答