求两点之间的欧氏距离 C

Finding Distance Between Euclidean Distance Between Two Points C

我正在尝试编写一个函数来计算两个浮点数之间的欧氏距离。我编写了函数并调用了它,但出现了一些错误。我该如何解决这些问题?

我的代码:

#include <stdio.h>
#include <math.h>

//Function Declarations

float CalculateDistance(float, float, float, float);

int main ()
{
/* Function Call */
float distance1 = CalculateDistance(float x1,float y1,float x2,float y2);


printf("   Point1     Point 2       Distance\n");
printf("(%4.1f, %4.1f)", x1, y1);
printf("(%4.1f, %4.1f)", x2, y2);
printf("%4.1f\n", distance1);


return 0;
}

//Distance Function

double CalculateDistance(float x1, float y1, float x2, float y2)
{   printf("Enter X1 : ");
    scanf("%f",&x1);
    printf("Enter Y1 : ");
    scanf("%f",&y1);
    /////////////////////////////////////
    printf("Enter X2 : ");
    scanf("%f",&x2);
    printf(" Enter Y2 : ");
    scanf("%f",&y2);
    //////////////////////////////////////
    double diffx = x1 - x2;
    double diffy = y1 - y2;
    double diffx_sqr = pow(diffx,2);
    double diffy_sqr = pow(diffy,2);
    double distance = sqrt(diffx_sqr + diffy_sqr);

return distance;
}

我得到的错误:

main.c:18:37: error: expected expression before ‘float’
   18 | float distance1 = CalculateDistance(float x1,float y1,float x2,float y2);
      |                                     ^~~~~
main.c:18:19: error: too few arguments to function ‘CalculateDistance’
   18 | float distance1 = CalculateDistance(float x1,float y1,float x2,float y2);
      |                   ^~~~~~~~~~~~~~~~~
main.c:13:7: note: declared here
   13 | float CalculateDistance(float, float, float, float);
      |       ^~~~~~~~~~~~~~~~~
main.c:22:26: error: ‘x1’ undeclared (first use in this function); did you mean ‘y1’?
   22 | printf("(%4.1f, %4.1f)", x1, y1);
      |                          ^~
      |                          y1
main.c:22:26: note: each undeclared identifier is reported only once for each function it appears in
main.c:23:26: error: ‘x2’ undeclared (first use in this function)

我是 C 语言的新手。非常感谢您的帮助。

首先我要说明您的第一个问题对代码的外观不够关心。远不是虚荣心的问题,代码的清晰度始于足够的缩进,这对于您更清楚地了解正在发生的事情以及最终会接触到您的代码的其他人来说都是非常相关的(这种情况是一个很好的例子: ))。网络上有很多资源可以说明为什么缩进很重要。我在快速搜索中发现的一些是 this one and this one.

关于您的代码:其中一些错误消息确实不是很直观,可能会使不熟悉该语言的人感到困惑。但其他人很清楚发生了什么。即:

main.c:22:26: error: ‘x1’ undeclared (first use in this function); did you mean ‘y1’?

main.c:23:26: error: ‘x2’ undeclared (first use in this function)

关于这两个错误,事实是编译器无法识别变量x1x2的声明位置。您尝试在 printf 调用中使用它们,但在当前范围内没有定义(即当前逻辑块,在这种特定情况下为 main 函数)。

在您的代码中没有任何地方声明 x1x2y1y2 变量。修复代码的第一步就是这样做。

另一件可能不是您想要做的事情(假定该函数需要数据作为其参数)是将用户输入集合添加到 CalculateDistance 函数。鉴于它的名字,人们会想到它的目的是计算距离,仅此而已。将您的代码拆分为小的、特定的函数是一个很好的做法,几乎没有责任。

另一个问题是您在第 6 行声明了类型为 floatCalculateDistance 函数,并在第 25 行定义了类型为 double 的函数。

最后,最后一个(不会阻止您编译代码的东西)是您使用 float 类型定义 xy 变量,并且,在 CalculateDistance 函数中,您正在使用 doubles。这被称为 implicit conversion 并且可能是有时难以调试的错误的来源。在这种特定情况下,它可能不会,因为您正在将 float 数据移动到 double 类型,该类型保存具有更高或相同精度的值,但重要的是您要意识到这一点并尝试尽可能避免它。而且,在您知道发生了什么并且 want/need 在不同类型之间进行转换的情况下,一个好习惯是明确地进行转换,这样您和看到您的代码的任何人都清楚这是有意的。

这是应用了我上面提到的更改的潜在代码版本:

#include <stdio.h>
#include <math.h>

// Fixed declaration type
double CalculateDistance(float, float, float, float);

int main ()
{
  // Variable declarations
  float x1;
  float y1;
  float x2;
  float y2;

  // Moved input-handling to `main`
  printf("Enter X1 : ");
  scanf("%f",&x1);
  printf("Enter Y1 : ");
  scanf("%f",&y1);
  /////////////////////////////////////
  printf("Enter X2 : ");
  scanf("%f",&x2);
  printf(" Enter Y2 : ");
  scanf("%f",&y2);
  //////////////////////////////////////

  /* Function Call */
  double distance1 = CalculateDistance(x1, y1, x2, y2);

  printf("   Point1     Point 2       Distance\n");
  printf("(%4.1f, %4.1f)", x1, y1);
  printf("(%4.1f, %4.1f)", x2, y2);

  // Used `%lf` instead of `%f` to represent `double`s
  printf("%4.1lf\n", distance1);


  return 0;
}

//Distance Function

double CalculateDistance(float x1, float y1, float x2, float y2)
{
  double diffx = x1 - x2;
  double diffy = y1 - y2;
  double diffx_sqr = pow(diffx,2);
  double diffy_sqr = pow(diffy,2);
  double distance = sqrt(diffx_sqr + diffy_sqr);

  return distance;
}

一些最后的考虑:

  • 在我看来,Brian Kernighan 和 Dennis Ritchie 在 The C Programming Language 中对 C 语言进行了很好的介绍。我建议您从头开始,尽早避免尽可能多的不良做法
  • 特别注意代码缩进
  • 了解如何在您的环境中调整编译器标志并搜索推荐的标志。我个人喜欢和使用的几个是:-Wall-Wconversion-Werror-Wpedantic。您可以在 gcc's man page 上找到有关它们的更多信息,如果您没有使用 gcc,您可以在编译器
  • 中使用标志查找类似的结果