题目描述:
文件以二进制方式存放一系列整数,每个整数占4个字节。从第一个整数开始,第一个整数和第二个整数构成一个坐标点,以此类推,数据文件中保存了许多坐标点数据。
问题1:规定处于第一象限的坐标点为有效点,请问数据文件中所有点的个数n为多少?有效点的个数k为多少?
问题2:每个有效点与坐标原点构成一个的矩形,请问k个有效点与坐标原点构成的k个矩形的最小公共区域面积为多少?
问题3:寻找有效点钟符合下列条件的点:以该点为坐标原点,其它有效点仍然是有效点即处于第一象限(不包括坐标轴上的点)。输出这些点。
问题4:对所有有效点进行分组,每个有效点有且只有属于一个分组,分组内的点符合下列规则:若对组内所有点的x坐标进行排序,点p1(x1,y1)在点p2(x2,y2)后面,即x1>x2那么y1>y2,请输出所有的分组。
输入描述:
https://download.csdn.net/download/tsc5214/11012209
模拟数据下载网址
输出描述:
所有点的个数为:31个,有效点的个数为13个
最小公共区域面积为1
符合条件的点为:
(1,1)
Group1
(1,1) (4,3) (6,8) (8,9) (22,77) (77,99)
Group2
(8,6) (90,10)
Group3
(8,9)
Group4
(8,90)
Group5
(20,3)
Group6
(80,3)
Group7
(90,2)
体会:
1.读取二进制数据的时候,由于是feof()和fread()组合起来使用的,会发生明明数据已经读完但是还会再读一次的问题。后发现feof只是检查标志位,刚读完的时候fread由于是读到数据的,所以并不会调整标志位,只有下次fread的时候发现读不到数据,才会调整标志位,这样就发生了再读一次的问题。
解决方法:不使用feof()作为判断,由于fread读取成功会返回读取的字节数,不成功则会返回0,故直接用fread()作为循环是否结束的标志,具体见代码。
参考文章:https://blog.csdn.net/bujuan827/article/details/53872498
代码:
#include<stdio.h>
#include<stdlib.h>
struct coordinate{
int x;
int y;
int area;
};
int input(struct coordinate co[]);
int validPoint(struct coordinate co[],int num);
int seekAreaMin(struct coordiante co[],int validnum);
void seekDefinedPoints(struct coordinate co[],int validnum);
void seekGroups(struct coordinate co[],int validnum);
int main(){
struct coordinate co[1000];
int num,validnum,minarea;
num=input(co);
validnum=validPoint(co,num);
printf("所有点的个数为:%d个,有效点的个数为%d个\n",num,validnum);
minarea=seekAreaMin(co,validnum);
printf("最小公共区域面积为%d\n",minarea);
seekDefinedPoints(co,validnum);
seekGroups(co,validnum);
}
int input(struct coordinate co[]){
FILE *fp;
int i=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);
return i;
}
int validPoint(struct coordinate co[],int num){
int i,validnum=0;
for(i=0;i<num;i++){
if(co[i].x>0&&co[i].y>0){
co[validnum].x=co[i].x;
co[validnum].y=co[i].y;
validnum++;
}
}
return validnum;
}
int seekAreaMin(struct coordinate co[],int validnum){
int i,j,s;
for(i=0;i<validnum;i++){
co[i].area=co[i].x*co[i].y;
}
for(j=1;j<validnum;j++)
for(s=0;s<validnum-j;s++){
if(co[s].area>co[s+1].area){
struct coordinate temp;
temp=co[s];
co[s]=co[s+1];
co[s+1]=temp;
}
}
return co[0].area;
}
void seekDefinedPoints(struct coordinate co[],int validnum){
int i,j;
printf("符合条件的点为:\n");
for(i=0;i<validnum;i++){
for(j=0;j<validnum;j++){
if(i!=j){
if(co[j].x-co[i].x<=0||co[j].y-co[i].y<=0){
break;
}
}
}
if(j==validnum)
printf("(%d,%d) ",co[i].x,co[i].y);
}
printf("\n");
}
void seekGroups(struct coordinate co[],int validnum){
int* flag;
int s,i,j,d,t,u,groupnum=1;
for(i=1;i<validnum;i++)
for(j=0;j<validnum-i;j++){
if(co[j].x>co[j+1].x){
struct coordinate temp;
temp=co[j];
co[j]=co[j+1];
co[j+1]=temp;
}
}
flag=(int*)malloc(sizeof(int)*validnum);
for(s=0;s<validnum;s++){
flag[s]=0;
}
for(d=0;d<validnum;d++){
if(flag[d]==0){
printf("Group%d\n",groupnum);
printf("(%d,%d) ",co[d].x,co[d].y);
flag[d]=1;
u=d;
for(t=d+1;t<validnum;t++){
if(flag[t]==0){
if(co[t].x>co[u].x&&co[t].y>co[u].y){
printf("(%d,%d) ",co[t].x,co[t].y);
flag[t]=1;
u=t;
}
}
}
printf("\n");
groupnum++;
}
}
}