C语言 求解 5
一、在给定文件in1.txt中读取一组平面上的顶点的坐标,计算出他们所围出的凸多边形的面积,并保存在指定的文件out1.txt中。【输入输出要求】数据输入:在文件in1....
一、在给定文件in1.txt中读取一组平面上的顶点的坐标,计算出他们所围出的凸多边形的面积,并保存在指定的文件out1.txt中。
【输入输出要求】
数据输入:在文件in1.txt文件中,第一行为点的个数N,后面的N行,每行两个数字(由空格分隔),分别表示该点的X,Y坐标,所有点的坐标互不相同,按顺时针次序给出,并确保该多边形是一个凸多边形。
数据输出:在文件out1.txt文件中输出该多边形的面积,保留两位小数。
【样例输入文件】
4
3 3
3 0
1 0
1 2
【样例输出文件】
5.00
我的方法是从第一个点引线到其他定点把四边形分成三角形 ,算出每个三角形边长,用海伦公式求面积,累加,用的他给的数据,但第二个三角形面积是-1.#J,怎么回事?求解
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int read(char * filename,float x[],float y[])
{
FILE *fp;
int n,i;
if((fp=fopen(filename,"r+"))==NULL)
{
printf("cannot open the file.\n");
exit(0);
}
fscanf(fp,"%d",&n);
for(i=0;i<n;i++)
{
fscanf(fp,"%f %f",&x[i],&y[i]);
}
return n;
}
float cal(float x[],float y[],int n)
{
float sum=0;
int i;
for(i=1;i<n-1;i++)
{
int p;
float a,b,c,q;
a=sqrt((x[i]-x[i+1])*(x[i]-x[i+1])+(y[i]-y[i+1])*(y[i]-y[i+1]));
b=sqrt((x[0]-x[i+1])*(x[0]-x[i+1])+(y[0]-y[i+1])*(y[0]-y[i+1]));
c=sqrt((x[0]-x[i])*(x[0]-x[i])+(y[0]-y[i])*(y[0]-y[i]));
p=(a+b+c)/2;
q=sqrt(p*(p-a)*(p-b)*(p-c));//海伦公式
printf("%.2f ",q);
sum+=q;
}
return sum;
}
int write(char * filename ,float area)
{
FILE *fp;
int n;
if((fp=fopen(filename,"r+"))==NULL)
{
printf("cannot open the file.\n");
n=0;
}
else
{
fprintf(fp,"%f",area);
n=1;
}
return n;
}
int main()
{
char filename[15],filename2[15];
float x[100],y[100];
int n,m;
float area;
printf("请输入读入文件名:");
scanf("%s",filename);
n=read(filename,x,y);
area=cal(x,y,n);
printf("%.2f",area);
printf("请输入输出文件名:");
scanf("%s",filename2);
m=write(filename2,area);
if(m=0)
printf("面积保存失败。\n");
return 0;
} 展开
【输入输出要求】
数据输入:在文件in1.txt文件中,第一行为点的个数N,后面的N行,每行两个数字(由空格分隔),分别表示该点的X,Y坐标,所有点的坐标互不相同,按顺时针次序给出,并确保该多边形是一个凸多边形。
数据输出:在文件out1.txt文件中输出该多边形的面积,保留两位小数。
【样例输入文件】
4
3 3
3 0
1 0
1 2
【样例输出文件】
5.00
我的方法是从第一个点引线到其他定点把四边形分成三角形 ,算出每个三角形边长,用海伦公式求面积,累加,用的他给的数据,但第二个三角形面积是-1.#J,怎么回事?求解
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int read(char * filename,float x[],float y[])
{
FILE *fp;
int n,i;
if((fp=fopen(filename,"r+"))==NULL)
{
printf("cannot open the file.\n");
exit(0);
}
fscanf(fp,"%d",&n);
for(i=0;i<n;i++)
{
fscanf(fp,"%f %f",&x[i],&y[i]);
}
return n;
}
float cal(float x[],float y[],int n)
{
float sum=0;
int i;
for(i=1;i<n-1;i++)
{
int p;
float a,b,c,q;
a=sqrt((x[i]-x[i+1])*(x[i]-x[i+1])+(y[i]-y[i+1])*(y[i]-y[i+1]));
b=sqrt((x[0]-x[i+1])*(x[0]-x[i+1])+(y[0]-y[i+1])*(y[0]-y[i+1]));
c=sqrt((x[0]-x[i])*(x[0]-x[i])+(y[0]-y[i])*(y[0]-y[i]));
p=(a+b+c)/2;
q=sqrt(p*(p-a)*(p-b)*(p-c));//海伦公式
printf("%.2f ",q);
sum+=q;
}
return sum;
}
int write(char * filename ,float area)
{
FILE *fp;
int n;
if((fp=fopen(filename,"r+"))==NULL)
{
printf("cannot open the file.\n");
n=0;
}
else
{
fprintf(fp,"%f",area);
n=1;
}
return n;
}
int main()
{
char filename[15],filename2[15];
float x[100],y[100];
int n,m;
float area;
printf("请输入读入文件名:");
scanf("%s",filename);
n=read(filename,x,y);
area=cal(x,y,n);
printf("%.2f",area);
printf("请输入输出文件名:");
scanf("%s",filename2);
m=write(filename2,area);
if(m=0)
printf("面积保存失败。\n");
return 0;
} 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询