You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}
问题分析与解决方案

问题根源

  1. 循环边界错误:查找数对的循环for (i = 0; i < n; i++)会导致当i = n-1时,访问a[i+1]超出数组下标范围(数组下标最大为n-1),触发未定义行为。
  2. 条件判断逻辑错误:数组是按降序排列的,数对的距离计算为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:24:52