苏州大学计算机专业2012年复试上机真题

题目描述:

文件以二进制方式存放一系列整数,每个整数占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++;
		}
	}

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值