初级版
当坐标已知且固定,可以定义两个数组分别存放x坐标值和y坐标值,通过for循环求出面积。
#include<stdio.h>
int main()
{
double x[4]={1,2,4,1};
double y[4]={2,5,4,2};
double area,sum=0;
int i;
for(i=0;i<3;i++)
{
area=(x[i+1]-x[i])*(y[i+1]+y[i])/2;
sum+=area;
}
printf("%f",sum);
return 0;
}
这种方法只能运用在数据量较少的情况下,而且不能重复使用,也就是如果要计算不同的多边形的面积,每次都要修改代码中数组的大小以及数组中的元素。故下面的版本对此进行了改进,使得我们能根据不同的需求自行输入坐标计算面积。
中级版
如果想要不固定坐标值而改成每次输入不同的坐标值进行运算,由于我这里的是C99之前的版本,不能用变量作为数组定义的大小,所以采用了两种方法解决了该问题。
方法一定义宏变量N表示坐标的个数,每次计算面积还是需要改变代码中N的数值,但是不需要再对坐标进行修改,而是每次运行时再输入;而方法二用stdio.h中的malloc函数申请空间来分配动态内存,每次运行计算面积的命令前不用修改代码。
方法一
#include<stdio.h>
#include<string.h>
#define N 4 //N的数值自行修改
int main()
{
double x[N],y[N];
double area=0,sum=0.0;
int i,j;
for(i=0;i<N;i++)
{
printf("请输入横坐标:");
scanf("%lf",&x[i]);
}
printf("横坐标输入完毕");
for(i=0;i<N;i++)
{
printf("请输入纵坐标:");
scanf("%lf",&y[i]);
}
for(i=0;i<N-1;i++)
{
area=(x[i+1]-x[i])*(y[i+1]+y[i])/2;
sum+=area;
}
printf("area equals to %lf",sum);
return 0;
}
方法二
#include<stdio.h>
#include<stdlib.h>
int CreatePolygon(double **a,double **b,int c);
double CalculateArea(double *a,double *b,int c);
int main()
{
int number;//坐标个数
double *x=0,*y=0;
double area;
printf("请输入坐标个数:");
scanf("%d",&number);
CreatePolygon(&x,&y,number);
area=CalculateArea(x,y,number);
printf("该多边形面积为%lf\n",area);
free(x);
free(y);
return 0;
}
int CreatePolygon(double **a,double **b,int c)
{
int i;
*a=(double*)malloc(c*sizeof(double));
*b=(double*)malloc(c*sizeof(double));
for(i=0;i<c;i++)
{
printf("请输入第%d个点的横坐标",i+1);
scanf("%lf",*a+i);
}
printf("%%%%横坐标输入完成%%%%\n");
for(i=0;i<c;i++)
{
printf("请输入第%d个点的纵坐标",i+1);
scanf("%lf",*b+i);
}
printf("%%%%纵坐标输入完成%%%%\n");
return 0;
}
double CalculateArea(double *a,double *b,int c)
{
int i;
double sum=0,area;
for(i=0;i<c-1;i++)
{
area=(a[i+1]-a[i])*(b[i+1]+b[i])/2;
sum+=area;
}
return sum;
}
中级版的两种方法解决了代码需要手动修改的问题,但坐标需要手动输入,如果数据量太大,以上的方法真正使用起来还是过于繁琐。而坐标数据通过文件的形式传输给代码则会方便很多。
所以,我对此再次改进,改成以文件的形式输入横纵坐标,减少了运行代码时需要一个一个输入坐标的麻烦。
终极版
当坐标的数据量庞大,且源自一个文件,手动输入坐标太复杂,则可以采用读取文件的方式获得坐标。这里我设计的代码对文件格式有一些要求:
1、文件的第一行是坐标的个数,其余行是点的x,y坐标;
2、其中第一行和最后一行坐标应该相同,使得多边形闭合。
函数整体上与version 2的第二种方法相似,只不过将scanf改为fscanf。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int CreatePolygon(double **x,double **y,char *filename);
double CalculateArea(double *x,double *y,int z);
int main()
{
double *x=0,*y=0,area;
int k;
char FileName[100];
printf("请输入文件名:");
scanf("%s",FileName);
k=CreatePolygon(&x,&y,FileName);
/*
四个坐标才能构成三角形,
所以k>3才能成功创建多边形
*/
if(k>3)
{
area=CalculateArea(x,y,k);
printf("多边形面积为%lf\n",area);
}
else
{
printf("Failed to create polygon.\n");
}
free(x);
free(y);
return 0;
}
int CreatePolygon(double **x,double **y,char *filename)
{
FILE *fp;
int number,i;
fp=fopen(filename,"r");
if(fp==NULL)
{
printf("Error opening file.\n");
return -1;
}
/*判断文件是否能打开*/
fscanf(fp,"%d",&number);
*x=(double*)malloc(number*sizeof(double));
*y=(double*)malloc(number*sizeof(double));
for(i=0;i<number;i++)
{
fscanf(fp,"%lf%lf",&(*x)[i], &(*y)[i]);
/*读取第i个点的x和y*/
}
fclose(fp);
return number;
}
double CalculateArea(double *x,double *y,int z)
{
int i;
double sum=0,area;
for(i=0;i<z-1;i++)
{
area=(x[i+1]-x[i])*(y[i+1]+y[i])/2;
sum+=area;
}
return fabs(sum);
}