题目要求如下:

从网页上下载 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; 
} 

2014年苏州大学计算机研究生复试机试编程题

结果见图

相关文章:

猜你喜欢
相关资源
相似解决方案