题目要求如下:
从网页上下载 input.dat 文件,里面是用二进制编写的,里面放了一堆 int 型的数,每个数占 4 个字节,每
次读取两个,这两个数构成一个坐标.
规定处于第一象限的数是有效点(即 x>0, y>0 的坐标),问这么多点中有效点有多少个?
现在用户从键盘输入一个坐标和一个数字 k ,设计算法输出 k 个离该坐标距离最近的点的坐标和每个坐标到
该点的距离,写入到 output.txt 文件中
期间看错了题目,以为是每个点的距离(见注释段),后来改正了代码,由于没有output文件所以rand生成
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<math.h>
typedef struct
{
int x;
int y;
double juli;
}Point;
double distance(Point* a,Point* b)
{
int juli=(a->x - b->x)*(a->x - b->x)+(a->y-b->y)*(a->y-b->y);
return sqrt((double)(juli));
}
void mp_sort(Point* ptr,int count)
{
Point temp;
for(int i=0;i<count-1;i++)
for(int j=0;j<count-i-1;j++)
if(ptr[j].juli>ptr[j+1].juli)
{
temp=ptr[j];
ptr[j]=ptr[j+1];
ptr[j+1]=temp;
}
}
int main()
{
FILE* fpw;
FILE* fr;
int* data;
int k=0;
Point* points=NULL;
Point dian;
int count,valid_num;
fpw=fopen("input.dat","wb");
data=(int*)malloc(sizeof(int)*16);
srand(time(NULL));
for(int i=0;i<16;i++)
{
data[i]=rand()%64-32;
}
fwrite(data,sizeof(int),16,fpw);
free(data);
fclose(fpw);
fr=fopen("input.dat","rb");
fseek(fr,0,SEEK_END);
count=ftell(fr)/sizeof(int);
rewind(fr);
data=(int*)malloc(sizeof(int)*count);
fread(data,sizeof(int),count,fr);
int points_num=count/2;
points=(Point*)malloc(sizeof(Point)*points_num);
for(int i=0;i<count;i=i+2)
{
// printf("%d %d\n",data[i],data[i+1]);
points[k].x=data[i];
points[k].y=data[i+1];
k++;
}
valid_num=0;
for(int i=0;i<points_num;i++)
{
//printf("%d %d\n",points[i].x,points[i].y);
if(points[i].x>0&&points[i].y>0)
valid_num++;
}
printf("the number of valid points is %d \n",valid_num);
printf("输入k\n");
scanf("%d",&k);
printf("输入个点的坐标\n");
scanf("%d %d",&dian.x,&dian.y);
for(int i=0;i<points_num;i++)
{
points[i].juli=distance(&points[i],&dian);
}
mp_sort(points,points_num);
/*for(int i=0;i<points_num;i++)
{
printf("the distance of every point to (%d,%d)\n",points[i].x,points[i].y);
for(int j=0;j<points_num;j++)
{
printf("(%d,%d) ",points[j].x,points[j].y);
printf("%.2f\n",distance(&points[i],&points[j]));
}
} 这是每个点到每个点的距离*/
printf("the nearest %d points to (%d,%d) are\n",k,dian.x,dian.y);
fpw=fopen("output.txt","w");
for(int i=0;i<k;i++)
{
printf("(%d,%d) %.3f\n",points[i].x,points[i].y,points[i].juli);
fprintf(fpw,"(%d,%d) %.3f\n",points[i].x,points[i].y,points[i].juli);
}
free(data);
fclose(fr);
fclose(fpw);
return 0;
}
结果见图