C语言站点距离计算程序1号站最近却输出0的问题排查
问题原因分析
- 全局变量
min未显式初始化:C语言中未手动初始化的全局整型变量默认值为0,当1号站点为最近站点时,现有逻辑不会触发min的赋值操作,最终min会保留初始值0,这是错误输出的直接原因。 - 最小值比较逻辑完全错误:
- 你将
y = a[2]写在循环内部,每次迭代都会把比较基准设为还未完成计算的a[2],当i=1计算1号站点距离时,a[2]还是未赋值的垃圾值,若1号站点距离大于这个垃圾值,就不会给min赋值为1。 - 没有提前设置初始最小参考值,找最近站点的逻辑应该是先把第一个站点设为初始最近站点,再依次和后面的站点比较更新。
- 你将
- 数组越界访问:你定义的距离存储数组
a长度为3,合法下标范围是0~2,但循环中i遍历到3时会访问a[3],属于越界操作,会篡改相邻内存的变量值,也会引发不可预期的异常。 - 变量类型不匹配:你把存储距离参考值的
y定义为int类型,却直接将float类型的距离值赋值给y,会发生精度截断,导致距离比较的逻辑完全错误。 - 函数声明不规范:
cordinate_entry和results_analysis函数声明返回值为float,但实际没有return语句,属于语法不规范,可能引发编译器告警。
修复后的可运行代码
#include<stdio.h> #include<math.h> float val[4][2], a[4]; // 调整a数组长度为4,适配站点1/2/3的下标 int j, i, min; // 无返回值的函数修改返回值类型为void void cordianation_entry () { printf ("enter your cordianation:"); scanf("%f,%f", &val[0][0], &val[0][1]); for (j = 1; j < 4; j++) { printf ("enter station %d coordination:", j); scanf ("%f,%f", &val[j][0], &val[j][1]); } } void results_analysis () { float min_dist; // 先计算1号站点距离,初始化最近站点为1 a[1] = pow((val[1][0] - val[0][0]), 2) + pow((val[1][1] - val[0][1]), 2); a[1] = sqrt(a[1]); min = 1; min_dist = a[1]; // 输出1号站点的距离和等级 printf ("\n*distance to station %d is %f\n", 1, a[1]); if (a[1] < 100) printf ("\tDistance is Low\n"); else if (a[1] < 1000 && a[1] >= 100) printf ("\tDistance is Moderate\n"); else printf ("\tDistance is High\n"); // 遍历计算2、3号站点的距离并比较更新最近站点 for (i = 2; i < 4; i++) { a[i] = pow((val[i][0] - val[0][0]), 2) + pow((val[i][1] - val[0][1]), 2); a[i] = sqrt(a[i]); printf ("\n*distance to station %d is %f\n", i, a[i]); if (a[i] < 100) printf ("\tDistance is Low\n"); else if (a[i] < 1000 && a[i] >= 100) printf ("\tDistance is Moderate\n"); else printf ("\tDistance is High\n"); // 和当前最小距离比较 if (a[i] < min_dist) { min = i; min_dist = a[i]; } } printf("\nStation %d is the nearest station", min); } // main函数标准写法返回值为int int main () { cordianation_entry (); results_analysis (); return 0; }
内容的提问来源于stack exchange,提问作者Imtias Bakar
相关产品推荐
相关产品推荐

