C语言程序多最短距离数对无输出问题求助
问题描述
编写C语言程序从文件读取浮点数组,找出其中距离最短的数对。当仅有一组最短距离数对时程序可正常输出,但存在2组及以上时,"PARES CERCANOS"区域无输出,其他提示正常显示。
问题代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main() { char file_name[100]; int n, i; printf("\tEscriba el nombre del archivo:\n"); //请输入文件名 scanf("%s", file_name); FILE *archivo = fopen(file_name, "r"); //archivo表示文件 if (archivo == NULL) { printf("No se pudo abrir el archivo.\n"); //文件打开失败 return 1; } //通过计数元素获取n的值 float value; n = 0; while (fscanf(archivo, "%f\n", &value) != EOF) { n++; } rewind(archivo); //重置文件指针到开头 float a[n]; for (int i = 0; i < n; i++) { fscanf(archivo, "%f\n", &a[i]); } fclose(archivo); //关闭文件 //选择排序算法进行排序 :3 for (int i = 0; i < n - 1; i++) { int maxIndex = i; for (int j = i + 1; j < n; j++) { if (a[j] > a[maxIndex]) { maxIndex = j; } } float temp = a[i]; a[i] = a[maxIndex]; a[maxIndex] = temp; } //已排序的值 printf("\nValores ordenados de mayor a menor:\n"); //从大到小排序的值 for (int i = 0; i < n; i++) { printf("%.2f, ", a[i]); } printf("\n"); int distanceSize = n - 1; float distancia[distanceSize]; //distancia表示数对间的距离 //直接计算线性距离,避免混乱 printf("\nDistancia: \n"); //距离 for (i = 0; i < distanceSize; i++) { distancia[i] = a[i] - a[i + 1]; printf("%.2f, ", distancia[i]); } //对距离进行排序 for (i = 0; i < distanceSize; i++) { for (int j = 0; j < distanceSize - i - 1; j++) { if (distancia[j] > distancia[j + 1]) { float temp = distancia[j]; distancia[j] = distancia[j + 1]; distancia[j + 1] = temp; } } } //用冒泡排序,因为其他排序没写出来 printf("\n\nValores ordenados de la distancia:\n"); //排序后的距离值 for (i = 0; i < distanceSize; i++) { printf("%.2f, ", distancia[i]); } float min = distancia[0]; // printf("\n%.2f\n", distancia[0]); printf("\n\nDistancia Min: %.2f\n", min); //最小距离 printf("\nPARES CERCANOS\n"); //最接近数对(此处为多组时无输出的区域) for (i = 0; i < n; i++) { if (a[i + 1] - a[i] == min) { printf("(%.2f, %.2f)", a[i], a[i + 1]); } } return 0; }
问题分析与解决方案
问题根源
- 循环边界错误:查找数对的循环
for (i = 0; i < n; i++)会导致当i = n-1时,访问a[i+1]超出数组下标范围(数组下标最大为n-1),触发未定义行为。 - 条件判断逻辑错误:数组是按降序排列的,数对的距离计算为
a[i] - a[i+1](正数),但代码中判断条件写为a[i+1] - a[i] == min,该表达式结果为负数,而min是正数,条件永远不成立,导致无输出。
修改后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main() { char file_name[100]; int n, i; printf("\tEscriba el nombre del archivo:\n"); //请输入文件名 scanf("%s", file_name); FILE *archivo = fopen(file_name, "r"); //archivo表示文件 if (archivo == NULL) { printf("No se pudo abrir el archivo.\n"); //文件打开失败 return 1; } //通过计数元素获取n的值 float value; n = 0; while (fscanf(archivo, "%f\n", &value) != EOF) { n++; } rewind(archivo); //重置文件指针到开头 float a[n]; for (int i = 0; i < n; i++) { fscanf(archivo, "%f\n", &a[i]); } fclose(archivo); //关闭文件 //选择排序算法进行排序 :3 for (int i = 0; i < n - 1; i++) { int maxIndex = i; for (int j = i + 1; j < n; j++) { if (a[j] > a[maxIndex]) { maxIndex = j; } } float temp = a[i]; a[i] = a[maxIndex]; a[maxIndex] = temp; } //已排序的值 printf("\nValores ordenados de mayor a menor:\n"); //从大到小排序的值 for (int i = 0; i < n; i++) { printf("%.2f, ", a[i]); } printf("\n"); int distanceSize = n - 1; float distancia[distanceSize]; //distancia表示数对间的距离 //直接计算线性距离,避免混乱 printf("\nDistancia: \n"); //距离 for (i = 0; i < distanceSize; i++) { distancia[i] = a[i] - a[i + 1]; printf("%.2f, ", distancia[i]); } //对距离进行排序 for (i = 0; i < distanceSize; i++) { for (int j = 0; j < distanceSize - i - 1; j++) { if (distancia[j] > distancia[j + 1]) { float temp = distancia[j]; distancia[j] = distancia[j + 1]; distancia[j + 1] = temp; } } } //用冒泡排序,因为其他排序没写出来 printf("\n\nValores ordenados de la distancia:\n"); //排序后的距离值 for (i = 0; i < distanceSize; i++) { printf("%.2f, ", distancia[i]); } float min = distancia[0]; // printf("\n%.2f\n", distancia[0]); printf("\n\nDistancia Min: %.2f\n", min); //最小距离 printf("\nPARES CERCANOS\n"); //最接近数对(此处为多组时无输出的区域) // 修正循环边界和判断条件 for (i = 0; i < n - 1; i++) { if (a[i] - a[i + 1] == min) { printf("(%.2f, %.2f) ", a[i], a[i + 1]); } } return 0; }
额外优化建议
- 浮点数比较建议使用误差容忍,因为浮点数存在精度问题,比如用
fabs((a[i] - a[i+1]) - min) < 1e-6替代直接相等判断,避免因精度丢失导致的匹配失败。 - 动态数组
float a[n]是C99标准特性,若编译器不支持,可改用malloc动态分配内存。
内容的提问来源于stack exchange,提问作者akaay
相关产品推荐
相关产品推荐

