为何我编写的求数组最小值程序始终输出0?
问题分析与修复方案
你的程序始终输出0的核心原因是read函数将用于终止输入的0也存入了数组,并且把这个0包含在了返回的有效元素个数n中。当minim函数遍历数组时,这个0会被当作正常元素参与比较,最终导致结果为0。
举个例子:若你输入5 3 2 0,read函数会把0存入arr[3],返回的n=4。minim函数会遍历arr[0]到arr[3],其中arr[3]是0,自然会被判定为最小值。
修复方案
方案1:调整读入逻辑,仅存储非0有效元素
修改read函数,先读取数值,判断非0后再存入数组,避免终止符进入数组:
int read(int v[], int size) { int i = 0; int num; do { scanf("%i", &num); if (num != 0 && i < size) { v[i] = num; i++; } } while (num != 0 && i < size); return i; }
方案2:保留原读入逻辑,剔除终止用的0
如果要保留原有的读入流程,可在返回n前检查最后一个元素是否为0,若是则将n减1:
int read(int v[], int size) { int i = 0; do { scanf("%i", &v[i]); i++; } while (v[i-1] != 0 && i < size); int n = i; // 若最后一个元素是终止用的0,且数组有元素,就去掉这个0的计数 if (n > 0 && v[n-1] == 0) { n--; } return n; }
额外边界处理
如果用户一开始就输入0,此时数组无有效元素,minim函数访问v[0]会触发未定义行为,建议在main函数中增加判断:
int main() { int arr[100]; int n = read(arr, 100); if (n == 0) { printf("\n数组中没有有效元素\n"); return 0; } int min = minim(arr, n); printf("\n数组的最小值是 %i\n", min); return 0; }
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

