2016-08-12 111 views
0

我正在编写一个代码来创建一个值,并创建一个大小为1s的金字塔的矩阵,因此顶部是x-1元素。例如,如果输入是五,则输出将是:C++中的矩阵输出不正确

0 0 0 0 1 0 0 0 0 
0 0 0 1 0 1 0 0 0 
0 0 1 0 0 0 1 0 0 
0 1 0 0 0 0 0 1 0 
1 0 0 0 0 0 0 0 1 

问题是代码生成的值,不应该是一个,或它是不输出矩阵的正确方法。我试图在代码中添加一个cout,它将一些值定义为1,这些值都是正确的,所以我相信问题出在输出中。例如,x的输入会给

0 0 0 0 1 0 0 0 1 
0 0 0 1 0 1 0 1 0 
1 0 1 0 0 0 1 0 0 
0 1 0 0 0 1 0 1 0 
1 0 1 0 0 0 0 0 1 

的代码如下:

#include <iostream> 
using namespace std; 

int main() { 
     cout << "Matrix size:"; 
     int x; 
     cin >> x; 
     int arr1[2*x][x]; 
     for (int initialX=0; initialX<x; initialX++){ 
       for (int initialY=0; initialY<=((2*x)-2); initialY++){ 
         arr1[initialX][initialY]=0; 
       } 
     } 
     for (int set=0; set<x; set++){ 
       arr1[set][x-1-set]=1; 
       arr1[set][x-1+set]=1; 
     } 
     for (int outX=0; outX<x; outX++){ 
       for (int outY=0; outY<(2*x-1); outY++){ 
         cout << arr1[outX][outY] << " "; 
       } 
       cout << endl; 
     } 
     return 0; 
} 

这与矩阵工作在C我第一次++,因此关于矩阵任何帮助表示赞赏。另外,如果它非常重要,我正在使用C++ 11。先谢谢你。

+5

VLAs是非标准的C++,即使它们在您的编译器中工作,您也应该避免使用它们。 – ArchbishopOfBanterbury

+0

欢迎来到Stack Overflow!这听起来像你可能需要学习如何使用调试器来遍历代码。使用一个好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏离的位置。如果你打算做任何编程,这是一个重要的工具。进一步阅读:[如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

+1

请看看这个为什么你[不应该使用可变长度数组](http://ideone.com/1mcWo6)。使用'std :: vector'和'at()'清楚地说明了问题所在。使用VLA的人员的帖子数量很多,并且出现了分段错误或输出错误的问题,如果VLA的使用已停止,并且使用了“矢量”(与另外的vector :: at ()'call)。 – PaulMcKenzie

回答

1

需要切换阵列尺寸。取而代之的

int arr1[2*x][x]; 

使用

int arr1[x][2*x]; 

因为这个错误,你正在访问数组越界,这会导致不确定的行为。

由于VLA不是标准C++,我强烈推荐使用std::vector

std::vector<std::vector<int>> arr1(x, std::vector<int>(2*x)); 

这也将所有元素初始化为0,并避免了需要编写显式代码数组元素初始化为0

0

我想你可能已经交换了你的设置的索引值。另外,我不建议使用set作为变量名称。试试这个:

for (int i=0; i<x; i++){ 
    arr1[x-1-i][x]=1; 
    arr1[x-1+i][x]=1; 
} 

如果有疑问,试着用小的值来代码,比如x = 2。

0
#include <iostream> 
using namespace std; 

int** CreateMatrix(int size); 

int main() 
{ 
    cout << "Matrix size:"; 
    int x; 
    cin >> x; 

    int** intArray = CreateMatrix(x); 

    int max = (x * 2) - 1; 

    for (int row = 0; row < x; row++) 
    { 
     for (int col = 0; col < max; col++) 
     { 
      cout << intArray[row][col] << " "; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

int** CreateMatrix(int size) 
{ 
    int max = (size * 2) -1; 
    int** intArray = new int*[size]; 
    for (int index = 0; index < size; index++) 
     intArray[index] = new int[max]; 

    int middle = size - 1; 
    int low = middle; 
    int high = middle; 

    for (int row = 0; row < size; row++) 
    { 
     for (int col = 0; col < max; col++) 
     { 
      intArray[row][col] = (col == low || col == high) ? 1 : 0; 
     } 
     low--; 
     high++; 
    } 
    return intArray; 
} 
+0

此代码存在内存泄漏,并演示了为什么应该使用'std :: vector'代替C++中动态分配的C风格数组的主要示例。 – ArchbishopOfBanterbury

+0

删除很简单。问题更多的是关于如何正确创建矩阵。(int row = 0; row