arrays - 为什么我的代码适用于数组的某些行而不适用于其他行?
问题描述
因此,对于我的大学实践工作(这些天教授没有回答),我必须用 C 语言编写一个程序,从用户那里接收一个二维数组,然后在其中搜索 3 个或更多零的序列。前任:
1 1 1 1 0
1 1 1 1 1
1 0 0 0 0
0 1 1 1 0
0 0 0 1 1
应该输出:
no sequence in: 1
no sequence in: 2
Sequence found in: 3 row
no sequence in: 4
Sequence found in: 5 row
我写了这些简单的循环,但我得到了一些奇怪的输出,这些输出并没有让我修复,我的代码是:
int main() {
int array[ROW][COLUMN];
printf("please enter a 5x5 matrix: \n");
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COLUMN; ++j) {
scanf("%d", &array[i][j]);
}
}
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COLUMN; ++j) {
printf("%d ", array[i][j]);
}
printf("\n");
}
int zero_c = 0;
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COLUMN; ++j) {
if (array[i][j] == 0) {
zero_c = 1;
if (array[i][j+1] == 0) {
zero_c = 1;
if (array[i][j + 2] == 0) {
zero_c = 1;
}
}
}else {
zero_c = 0;
}
}
if (zero_c==1) {
printf("Sequence found at: %d row\n ", i + 1);
zero_c = 0;
} else {
printf("no sequence in: %d\n", i + 1);
}
}
return 0;
}
哪个输出:(对于上面显示的相同数组)
Sequence found at: 1 row //(it seems like it always finds a sequence on the first row)
no sequence in: 2
Sequence found at: 3 row
Sequence found at: 4 row
no sequence in: 5
关于为什么会发生这种情况的任何想法?
解决方案
代码有两个问题:
它将索引超出行尾,导致错误匹配(以及可能的未定义行为)。
一旦它在一行中找到一个包含 3 个零的序列,它就不会停止在该行中查找,因此如果该行在零后包含一个 1,它就会忘记它曾经看到过零,从而导致错过匹配。
问题 (1) 很容易通过将内部循环的循环测试更改为:
for (int j = 0; j < COLUMN - 2; ++j) {
第二个问题是通过break
在一行中找到 3 个零后添加一条语句来解决的
生成的循环如下所示:
int zero_c = 0;
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COLUMN - 2; ++j) {
if (array[i][j] == 0) {
zero_c = 1;
if (array[i][j+1] == 0) {
zero_c = 1;
if (array[i][j + 2] == 0) {
zero_c = 1;
break;
}
}
} else {
zero_c = 0;
}
}
...
这应该可以修复错误(假设它在外循环结束时继续重置zero_c
,就像现在一样)。
一个更简单的版本如下:
for (int i = 0; i < ROW; ++i) {
int zero_c = 0;
for (int j = 0; j < COLUMN - 2; ++j) {
if (array[i][j] == 0 && array[i][j+1] == 0 && array[i][j+2] == 0) {
zero_c = 1;
break;
}
}
...
此版本zero_c
在外部循环的顶部重置,并且在打印每一行的结果时不需要重置它。
更高效的版本只需保留一个计数器,无需前瞻。请注意,对于这个版本,需要使用原始的内循环绑定:
for (int i = 0; i < ROW; ++i) {
int zero_c = 0;
for (int j = 0; j < COLUMN; ++j) {
if (array[i][j] == 0) {
zero_c++;
if (zero_c == 3)
break;
}
else {
zero_c = 0;
}
}
...
对于此版本,您将检查zero_c == 3
何时打印行的状态(同样,无需在此处重置)。
推荐阅读
- python - 如果数组的每一行出现在纯numpy的另一个数组中,则有效地删除它
- php - 自动的
标签?
- javascript - ```XLSX.writeFile``` 没有在我的文件系统中下载工作簿
- vue.js - 如何在 ag-grid 中显示行数?
- c++ - typedef shared_ptr
转换为布尔值 - node.js - 主机“localhost”覆盖 docker 中的“localhost”
- java - 如何在多对多关系spring boot中添加现有价值
- scala - 如何在 Spark 中以编程方式获取执行者数量和每个执行者的任务数量
- javascript - 如何将参数从 MVC 控制器传递到 Javascript 并获取结果?
- docker - 在 Arch Linux 上安装 Docker - 来自 url 的 404 错误