我是编程的新手,所以我想编写一个代码,让我输入一个二维数组(或我的情况下的矩阵)并在之后打印。
#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);
}
但是我收到错误,例如&#34;无效转换来自&#39; int *&#39; to&#39; int&#39;&#34;和#34;数组下标&#34;的无效类型int [int]。您能否查看我的代码并指出我的缺陷?
由于
答案 0 :(得分:6)
您将y
声明为int*
,它只是一维的。您需要将y
声明为int**
才能使其成为二维的。
您的代码无法编译的原因是因为int* y
指向单个内存块(这是一个整数数组,换句话说,是一堆{{1} }峰)。 int
是此数组中的y[w]
之一,因此int
无法编译,因为您尝试将y[w] = new int[n]
分配给int*
。
将int
更改为y
表示int**
可以指向y
的数组。由于每个int*
都可以指向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);
}
}
,因为它可以通过方便地增长来处理内存,因为你想要添加更多元素并在被破坏时释放内存。
答案 1 :(得分: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;
答案 2 :(得分:0)
int * y=new int [n];
是指向动态分配的int
值数组的指针;
y[w] = new int [n];
尝试将指针指向数组的元素。
作为一项学习练习,搞乱原始数组是一个好主意。一旦你知道如何使用它们,你就会知道如何使用它们(非常多)并使用自动存储类型,如std::vector
。
答案 3 :(得分: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
答案 4 :(得分:0)
首先,阅读其他答案,然后重读一本好的C ++书中的指针章节。现在,除非您需要极速,否则请使用vector
vector
double
。使用C ++ 11(较新的C ++标准),它非常好用且易读,所以我先发布它:
#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
个零。您也可以使用y[1][2]
来获取和设置值。如果你使用y.at(1).at(2)代替你进行适当的检查,这样你就可以在读取或写出界限时得到异常。