题目描述:
数据文件里面是用二进制编写的,里面放了一堆int型的数,每个数占4个字节,每次读取两个,这两个数构成一个坐标。
(1)规定处于第一象限的数是有效点,(即x>0,y>0的坐标),问这么多点中有效点有多少个?
(2)从键盘上输入k和n,从第一问中的有效点中找出 距离小于n,距离小于n的点的个数要大于k,将它们以文本格式输出到文件中。
输入描述:
1、模拟数据下载网址,数据同2012年
https://download.youkuaiyun.com/download/tsc5214/11012209
2、控制台输入的数据:1 4
输出描述:
控制台输出内容:
读取的数据中有效点有13个
Output.txt
(X,Y) 个数
(8,9) 3
(6,8) 3
(8,6) 3
(8,9) 3
代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int seekValidPoints(struct coordinate co[],int num,struct coordinate validco[]);
void seekPoints(struct coordinate validco[],int validnum);
struct coordinate{
int x;
int y;
};
int main(){
FILE *fp;
struct coordinate co[100];
struct coordinate validco[100];
int i=0;
int validnum=0;
if((fp=fopen("D:\\2019Post\\pat\\pat\\data2012.dat","r"))==NULL){
printf("can not open the file");
exit(0);
}
while(fread(&co[i].x,4,1,fp)){
fread(&co[i].y,4,1,fp);
i++;
}
fclose(fp);
validnum=seekValidPoints(co,i,validco);
printf("读取的数据中有效点有%d个\n",validnum);
seekPoints(validco,validnum);
return 0;
}
int seekValidPoints(struct coordinate co[],int num,struct coordinate validco[]){
int i,count=0;
for(i=0;i<num;i++){
if(co[i].x>0&&co[i].y>0){
validco[count].x=co[i].x;
validco[count].y=co[i].y;
count++;
}
}
return count;
}
void seekPoints(struct coordinate validco[],int validnum){
int k,n;
int t,i,j,s;
int* num;
FILE *fa;
scanf("%d %d",&k,&n);
num=(int*)malloc(sizeof(int)*validnum);
for(t=0;t<validnum;t++){
num[t]=0;
}
for(i=0;i<validnum;i++)
for(j=0;j<validnum;j++){
if(i!=j){
double result;
result=sqrt((double)((validco[i].x-validco[j].x)*(validco[i].x-validco[j].x)+(validco[i].y-validco[j].y)*(validco[i].y-validco[j].y)));
if(result<n)
num[i]++;
}
}
if((fa=fopen("D:\\2019Post\\pat\\pat\\Output2015.txt","w"))==NULL){
printf("can not open the file");
exit(0);
}
fprintf(fa,"(X,Y) 个数\n");
for(s=0;s<validnum;s++){
if(num[s]>k){
fprintf(fa,"(%d,%d) %d\n",validco[s].x,validco[s].y,num[s]);
}
}
fclose(fa);
}