鱼C论坛

 找回密码
 立即注册
查看: 1482|回复: 13

[已解决]求平面两点间的最短距离

[复制链接]
发表于 2020-4-29 20:16:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这里需要加#include<math.h>这个头文件嘛?
#define 那一行,是正确的写法嘛?
  1. 程序设计题:
  2. 数组元素x[i],y[i]表示平面上某点坐标,统计所有各点间最短距离,并将其值以格式"%.3f"输出
  3. #include <stdio.h>
  4. #define len(x1,y1,x2,y2) sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
  5. int main()
  6. {
  7.     int i,j;
  8.     float c,minc;
  9.     float x[]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
  10.     float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};
  11.     minc=len(x[0],y[0],x[1],y[1]);
  12.     //从以下开始答题 return 0;
  13. }
复制代码
最佳答案
2020-4-29 22:15:02
  1. #include<stdio.h>
  2. #include<math.h>

  3. int main()
  4. {
  5.     int i,j;
  6.     float len;
  7.     float c,minc;
  8.     float x[]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
  9.     float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};
  10.    
  11.     minc = 0;
  12.     for(i=0;i<10;i++)
  13.     {
  14.         for(j=0;j<10;j++)
  15.         {
  16.             len = sqrt((x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j]));
  17.             minc = len > minc ? len: minc;
  18.         }
  19.     }
  20.     printf("最小值%.3f",minc);
  21.    
  22.     return 0;
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-29 20:17:36 | 显示全部楼层
这里需要加#include<math.h>这个头文件嘛?
#define 那一行,是正确的写法嘛?
是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-29 20:19:51 | 显示全部楼层
自己尝试写了一下,但运行错误【捂脸】
  1. #include<stdio.h>
  2. #include<math.h>
  3. #define len(x1,y1,x2,y2) sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
  4. int main()
  5. {
  6.     int i,j;
  7.     float c,minc;
  8.     float x[]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
  9.     float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};
  10.     minc=len(x[0],y[0],x[1],y[1]);
  11.     for(i=0;i<9;i++)
  12.     {
  13.             for(j=0;j<9;i++)
  14.         {
  15.                 if(len(x[i],y[j],x[i+1],y[j+1])<minc)
  16.                         minc=len(x[i],y[j],x[i+1],y[j+1]);
  17.         }
  18. }
  19.         printf("%.3f",minc);
  20.         return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-29 22:14:26 | 显示全部楼层
首先是define的用法问题,不能像你那样用的,我摘了百度上的一小段,你理解一下,具体的可以查资料。

define在C语言中是一个宏定义的关键字,它的用法如下:
#define 常量名 值 该句使用在程序开头,整个程序中该常量在预编译的时候用后面的值作简单替换。
例如:在程序开始有这么一句 #define PRICE 30
在整个程序中,PRICE的值都是30.

另外,题目的理解问题,最小值应该不是两个相邻的元素进行距离运算吧!   随机的点我也没有搞清楚。下面的代码仅供参考,默认x和y的下标是一样的了。

  1. define在C语言中是一个宏定义的关键字,它的用法如下:
  2. #define 常量名 值 该句使用在程序开头,整个程序中该常量在预编译的时候用后面的值作简单替换。
  3. 例如:在程序开始有这么一句 #define PRICE 30
  4. 在整个程序中,PRICE的值都是30.
复制代码


你的程序里还是有些小问题,可以对照我的代码看一下区别。纠错一下      如果题目意思是平面上随机的点,x和y下标可以任意取得话,那么就要对数组x和y的元素先进行绝对值大小排序了。这里我就先不写了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-29 22:15:02 | 显示全部楼层    本楼为最佳答案   
  1. #include<stdio.h>
  2. #include<math.h>

  3. int main()
  4. {
  5.     int i,j;
  6.     float len;
  7.     float c,minc;
  8.     float x[]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
  9.     float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};
  10.    
  11.     minc = 0;
  12.     for(i=0;i<10;i++)
  13.     {
  14.         for(j=0;j<10;j++)
  15.         {
  16.             len = sqrt((x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j]));
  17.             minc = len > minc ? len: minc;
  18.         }
  19.     }
  20.     printf("最小值%.3f",minc);
  21.    
  22.     return 0;
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 00:21:32 | 显示全部楼层

啊啊太感谢了!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 00:22:24 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 01:18:38 | 显示全部楼层
后来在网上翻到了参考答案,码在这里了
  1. #include<stdio.h>
  2. #include<math.h>
  3. #define len(x1,y1,x2,y2) sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
  4. int main()
  5. {
  6.         int i,j;
  7.         float c,minc;
  8.         float x[]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
  9.         float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};
  10.         minc=len(x[0],y[0],x[1],y[1]);
  11.         for(i=0;i<9;i++)
  12.         {
  13.                 for(j=i+1;j<10;j++)
  14.                 {
  15.                         if((c=len(x[i],y[i],x[j],y[j]))<minc)
  16.                                 minc=c;
  17.                 }
  18.         }
  19.         printf("%.3f",minc);
  20.         return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-30 07:37:43 | 显示全部楼层
Justin1 发表于 2020-4-29 22:14
首先是define的用法问题,不能像你那样用的,我摘了百度上的一小段,你理解一下,具体的可以查资料。

de ...

他用的是有参宏……没有问题的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-30 07:50:10 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-30 07:37
他用的是有参宏……没有问题的

长知识了,目前学得也还不够
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-30 07:51:10 | 显示全部楼层
Marcccccy 发表于 2020-4-30 01:18
后来在网上翻到了参考答案,码在这里了

有点误人子弟了,哈哈哈。以后得说答案仅供参考了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-30 08:06:38 | 显示全部楼层
Marcccccy 发表于 2020-4-30 01:18
后来在网上翻到了参考答案,码在这里了


不好意思啊,昨天以为调试对了,就发了,结果我的程序有两个问题,第一个是j 应该 = i +1 ,我的程序运行可以有(x[1] - x[1])的平方了,第二个是最大最小值问题  ,昨天的求的是最大值。
修改后代码如下      
  1. #include<stdio.h>
  2. #include<math.h>

  3. int main()
  4. {
  5.     int i,j;
  6.     float len;
  7.     float c,minc;
  8.     float x[]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
  9.     float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};
  10.    
  11.     minc = sqrt((x[1] - x[0])*(x[1] - x[0]) + (y[1] - y[0])*(y[1] - y[0]));
  12.     for(i=0;i<9;i++)
  13.     {
  14.         for(j=i+1;j<10;j++)
  15.         {
  16.             len = sqrt((x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j]));
  17.             minc = len < minc ? len: minc;
  18.         }
  19.     }
  20.     printf("最小值%.3f",minc);
  21.    
  22.     return 0;
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-4 12:26:34 | 显示全部楼层
Justin1 发表于 2020-4-30 08:06
不好意思啊,昨天以为调试对了,就发了,结果我的程序有两个问题,第一个是j 应该 = i +1 ,我的程序运 ...

好欸,谢谢啦!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-4 12:28:09 | 显示全部楼层
Justin1 发表于 2020-4-30 07:51
有点误人子弟了,哈哈哈。以后得说答案仅供参考了

欸参考答案也是仅供参考的嘛嘿嘿
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 16:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表