编程考试矩阵验证程序:未初始化局部变量‘lc’报错排查
问题分析与修正方案
咱们先解决你提到的uninitialized local variable 'lc' used错误,再聊聊代码里其他影响功能实现的问题:
一、lc变量的核心问题
你在cns()函数里声明了int lc;但没有给它初始化值。在C++中,函数内部的局部变量不会自动被初始化为0,它的初始值是内存里的随机垃圾值,编译器检测到你要使用这个未初始化的变量,就会抛出这个错误。
另外,你在main()函数里还声明了一个int lc;,这个变量和cns()里的lc是完全独立的两个变量(作用域不同),而且main()里的lc根本没被用到,属于冗余代码,应该删掉。
二、代码里的逻辑错误(影响功能实现)
除了变量问题,你的核心逻辑也有问题,这会导致即使变量正确了,函数也无法返回正确结果:
- 用行总和判断整行全负是错误的:比如一行里有
-3, -2, 4,总和是-1(负数),但这行里有正数,显然不符合"整行全部为负数"的要求;反过来,一行里有-1, -1, 3,总和是1(正数),但前两个是负数,也不符合判断逻辑。 - lc计数逻辑错误:你在累加
ts的过程中,只要ts < 0就给lc++,这会导致同一行被多次计数(比如一行全是负数,每次累加ts都会更小,lc会被加n次),完全不是你要统计的"全负行数"。
三、修正后的代码
#include "stdafx.h" #include <iostream> using std::cin; using std::cout; using std::endl; using std::boolalpha; bool cns(); const int n=5; int a[n][n]; bool cns() { int lc = 0; // 初始化lc为0,解决未初始化问题 // 输入矩阵元素 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << "a[" << i << "][" << j << "]=" << endl; cin >> a[i][j]; } } // 统计全为负数的行数 for (int i = 0; i < n; i++) { bool isAllNegative = true; // 先假设当前行全为负 for (int j = 0; j < n; j++) { if (a[i][j] >= 0) { // 只要有一个元素非负,就推翻假设 isAllNegative = false; break; // 提前结束本行遍历,优化效率 } } if (isAllNegative) { lc++; // 只有整行全负时,计数才+1 } } // 判断是否仅有一行全负 return lc == 1; } int main() { cout << boolalpha << cns() << endl; // 用boolalpha让输出显示true/false而非1/0 return 0; }
额外说明
- 我在
main()里加了boolalpha,这样输出会显示true或false,比默认的1或0更直观。 - 遍历每行时,只要发现一个非负数就
break,不用遍历完整个行,提升了代码运行效率。
内容的提问来源于stack exchange,提问作者Tinkman
相关产品推荐
相关产品推荐

