确定第一个和最后一个零元素之间的元素数量,即堆数组中第一个零和最后一个零之间的元素数。以下代码运行没有错误,但结果不正确。
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
using namespace std;
int main()
{
int r,c, i, j, count=0;
cout<<"\n Input number of rows: "; cin>>r;
cout<<" Input number of columns: "; cin>>c;
srand(time(NULL));
int **m = new int* [r];
for (int i=0; i<r; i++) {
m[i] = new int[c]; }
for (i=0; i<r; i++) {
m[i] = new int[c];
for (j=0; j<c; j++) {
m[i][j] = rand()%200-100; cout<<m[i][j]<<"\t"; }
cout<<endl; }
cout<<endl;
for (i=0; i<r; i++) {
for (j=0; j<c; j++) {
if (m[i][j]==0)
break;
else
count++;
if (j!=c)
break; } }
if (i!=r && j!=c) {
for (i=r-1; i>=0; i--) {
for (j=c-1; j>=0; j--) {
if (m[i][j]==0)
break;
else
count++;
if (j!=c)
break; } } }
cout<<"\n Total of elements between the first and last zero element: " <<r*c-count<<endl;
delete []m;
_getch();
}
作为第一个建议,我建议您不要使用
conio.h
. 它是一个非标准库,在实际开发中的效用值得怀疑。另一方面,当你这样做时,
delete []m;
你必须意识到你没有删除除 之外m
的任何东西,大小储备c
被搁置一旁。一般规则是,对于每一个new
你必须在你的代码中包含一个delete
和的,都有两个new
和一个唯一的delete
。在我看来(这完全是个人意见),您将代码制成表格的方式使其很难阅读。例如,右大括号在行尾分组,这迫使您必须计算有多少条指令才能知道下一条要执行的指令……在同一行中连接几条指令毫无意义的事实它也无助于使代码可读。
至于变量,您不需要在整个程序中重用它们。您可以在循环内创建变量。这样做的好处是减少了变量的范围并提高了程序的可读性(如果变量不再存在,它就不再是问题了)。
这些建议只是建议,它们不是强制性的,但它们从不伤害,它们可以帮助您在将来减少错误。
一个让我特别烦恼的细节是计算数组中两个元素的距离。你说array,所以恐怕你不必创建一个数组,而是一个元素向量。如果我的猜想属实,算法将大大简化。另一方面,如果事实证明您必须创建一个矩阵,我不清楚为什么您理解两个元素之间的距离涉及将矩阵线性化,就好像它是一个向量一样。
好的,让我们回顾一下您的搜索算法的第一个循环:
请注意,
break
它只留下一个循环,并且您有两个嵌套循环。到达后break
,执行将退出循环j
并继续执行循环i
,最终再次进入循环j
。在第二个循环中,发生了完全相同的事情。如果想法是在向量中搜索两个位置(并且您将数组视为向量),我宁愿直接处理向量。
最后,对第一个和最后一个特征元素 X 的搜索可以封装在一个函数中,避免重复代码。要完成这部分,有几个选项,尽管最简单的可能是一个函数,它返回给定起始位置的值的下一个位置,如果没有更多值,则返回 -1。因此,您要求第一个值,然后在循环中要求第二个值,直到函数返回 -1,它上次给您的值(并且您必须记住)是最后一个“0”的位置在列表中。带有签名的东西,例如:
一切顺利。
正如 eferion 提到的,搜索算法中存在错误
您可以使用此代码在二维数组中查找两个零
如果找到 0,则必须查看它是否对应于第一个或第二个,以酌情分配变量 i1 和 j1 或 i2 和 j2,但是如果是第一种情况,则必须继续寻找第二个. 如果找到第二个 0,我们可以
for
使用 agoto
和 a退出label
最后,为了计算两个零之间有多少元素,我们进行了简单的数学变换。
如果我们将二维数组转换为一维数组,则数组中的新位置由以下表达式给出
在您的情况下,它将是:
然后我们只需要一个简单的减法来计算这两个位置之间的距离,这比它们之间的位置数多一个。
我留给你完整的代码: