C语言编程题 题目:任意输入4个点,求围成四边形的面积

作者&投稿:仲长张 (若有异议请与网页底部的电邮联系)
C语言编程题 题目:任意输入4个点,求围成四边形的面积是多少?~

我测试过了,四点一线,凹四边形,四边形,有两个点共点,都可以,这里使用一条知道N边形N个顶点坐标求N边形的面积的公式,这些情况其实已经可以不考虑,呵呵,自动求
凹四边形情况:

有三点共一线形成三角形的情况:




#include "stdio.h"
#include "math.h"
void main()
{
double x[4],y[4];
for(int i=0;i<4;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
}
double mianji=0.0;
for(int ii = 1 ; ii< 4 ; ii++)
{
mianji+=(x[ii-1]*y[ii]-x[ii]*y[ii-1]);
}
mianji+=x[3]*y[0]-x[0]*y[3];
mianji= fabs(0.5*mianji);
printf("%lf
",mianji);
}

首先如果四边形ABCD是平行四边形,那么就不可能有交点,M与N重合。
如果不是,那么采用解析几何可解。
什么中点,距离啊都用向量求。
三角形面积计算公式可以用余弦定理或者海伦公式。

我测试过了,四点一线,凹四边形,四边形,有两个点共点,都可以,这里使用一条知道N边形N个顶点坐标求N边形的面积的公式,这些情况其实已经可以不考虑,呵呵,自动求

凹四边形情况:

有三点共一线形成三角形的情况:

 

 

 

#include "stdio.h"

#include "math.h"

void main()

{

 double x[4],y[4];

 for(int i=0;i<4;i++)

 {

  scanf("%lf%lf",&x[i],&y[i]);

 }

 double mianji=0.0;

 for(int ii = 1 ; ii< 4 ; ii++)

 {

  mianji+=(x[ii-1]*y[ii]-x[ii]*y[ii-1]);

 }

 mianji+=x[3]*y[0]-x[0]*y[3];

 mianji= fabs(0.5*mianji);

 printf("%lf
",mianji);

}



//
// 算法说明:
// 凸四边形任意一条边的两个顶点位于另外两个顶点所在直线的同一侧
// 凹四边形有两条边的两个顶点位于另外两个顶点所在直线的两侧
// 四个点(0,1,2,3)围成4边形可能的顺序有3种情况:0123 0213 0132
//
#include<stdio.h>
#include<math.h>
#define ESP (1e-6)
double x[4]={0.0},y[4]={0.0};
double A[6],B[6],C[6];//直线方程 Ax+By+C=0
double D[6],E[6];//D、E保存另外两点带入直线方程的值,为零表示点在直线上,符号相同表示位于直线的同一侧
int pos[6][4]={{0,1,2,3},{0,2,1,3},{0,3,1,2},{1,2,0,3},{1,3,0,2},{2,3,0,1}};//用于数组ABCDEF
char str[6][8]={"0,1,2,3","0,2,1,3","0,3,1,2","1,2,0,3","1,3,0,2","2,3,0,1"};//用于打印输出
void TriangleArea(int a,int b, int c, int d)
{
double S;
if(((x[a]-x[b])*(x[a]-x[c])<0) || ((y[a]-y[b])*(y[a]-y[c])<0))
{
S = fabs(x[b]*y[c]-y[b]*x[c]+x[c]*y[d]-x[d]*y[c]+x[d]*y[b]-x[b]*y[d]);
printf("三点(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)共线,三角形(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)\n面积S=%lf\n",
x[a],y[a],x[b],y[b],x[c],y[c],x[b],y[b],x[c],y[c],x[d],y[d],S);
}
else if(((x[b]-x[a])*(x[b]-x[c])<0) || ((y[b]-y[a])*(y[b]-y[c])<0))
{
S = fabs(x[a]*y[c]-y[a]*x[c]+x[c]*y[d]-x[d]*y[c]+x[d]*y[a]-x[a]*y[d]);
printf("三点(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)共线,三角形(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)\n面积S=%lf\n",
x[a],y[a],x[b],y[b],x[c],y[c],x[a],y[a],x[c],y[c],x[d],y[d],S);
}
else if(((x[c]-x[a])*(x[c]-x[b])<0) || ((y[c]-y[a])*(y[c]-y[b])<0))
{
S = fabs(x[a]*y[c]-y[a]*x[c]+x[c]*y[d]-x[d]*y[c]+x[d]*y[a]-x[a]*y[d]);
printf("三点(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)共线,三角形(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)(%5.2lf,%5.2lf)\n面积S=%lf\n",
x[a],y[a],x[b],y[b],x[c],y[c],x[a],y[a],x[b],y[b],x[d],y[d],S);
}
}
//凹四边形
void AoArea01122330()
{
double S = fabs(x[0]*y[1]-x[1]*y[0]+x[1]*y[2]-x[2]*y[1]+x[2]*y[3]-x[3]*y[2]+x[3]*y[0]-x[0]*y[3])/2;
printf("凹四边形\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\n面积S=%lf\n",
x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3],S);
}
void AoArea01133220()
{
double S = fabs(x[0]*y[1]-x[1]*y[0]+x[1]*y[3]-x[3]*y[1]+x[3]*y[2]-x[2]*y[3]+x[2]*y[0]-x[0]*y[2])/2;
printf("凹四边形\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\n面积S=%lf\n",
x[0],y[0],x[1],y[1],x[3],y[3],x[2],y[2],S);
}
void AoArea02211330()
{
double S = fabs(x[0]*y[2]-x[2]*y[0]+x[2]*y[1]-x[1]*y[2]+x[1]*y[3]-x[3]*y[1]+x[3]*y[0]-x[0]*y[3])/2;
printf("凹四边形\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\n面积S=%lf\n",
x[0],y[0],x[2],y[2],x[1],y[1],x[3],y[3],S);
}
//凸四边形
void Area01122330()
{
double S = fabs(x[0]*y[1]-x[1]*y[0]+x[1]*y[2]-x[2]*y[1]+x[2]*y[3]-x[3]*y[2]+x[3]*y[0]-x[0]*y[3])/2;
printf("凸四边形\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\n面积S=%lf\n",
x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3],S);
}
void Area01133220()
{
double S = fabs(x[0]*y[1]-x[1]*y[0]+x[1]*y[3]-x[3]*y[1]+x[3]*y[2]-x[2]*y[3]+x[2]*y[0]-x[0]*y[2])/2;
printf("凸四边形\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\n面积S=%lf\n",
x[0],y[0],x[1],y[1],x[3],y[3],x[2],y[2],S);
}
void Area02211330()
{
double S = fabs(x[0]*y[2]-x[2]*y[0]+x[2]*y[1]-x[1]*y[2]+x[1]*y[3]-x[3]*y[1]+x[3]*y[0]-x[0]*y[3])/2;
printf("凸四边形\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\t(%5.2lf,%5.2lf)\n面积S=%lf\n",
x[0],y[0],x[2],y[2],x[1],y[1],x[3],y[3],S);
}
int CheckInput()
{
//判断输入的4个点是不同的四个点
if((fabs(x[0]-x[1])<ESP && fabs(y[0]-y[1])<ESP) ||
(fabs(x[0]-x[2])<ESP && fabs(y[0]-y[2])<ESP) ||
(fabs(x[0]-x[3])<ESP && fabs(y[0]-y[3])<ESP) ||
(fabs(x[1]-x[2])<ESP && fabs(y[1]-y[2])<ESP) ||
(fabs(x[1]-x[3])<ESP && fabs(y[1]-y[3])<ESP) ||
(fabs(x[2]-x[3])<ESP && fabs(y[2]-y[3])<ESP))
return 0;
return 1;
}
//判断是否是凸四边形 0123
int Check01122330(double *D, double *E)
{
if(D[0]*E[0]>0 && D[2]*E[2]>0 && D[3]*E[3]>0 && D[5]*E[5]>0)
return 1;
else
return 0;
}
//判断是否是凸四边形 0132
int Check01133220(double *D, double *E)
{
if(D[0]*E[0]>0 && D[1]*E[1]>0 && D[4]*E[4]>0 && D[5]*E[5]>0)
return 1;
else
return 0;
}
//判断是否是凸四边形 0213
int Check02211330(double *D, double *E)
{
if(D[1]*E[1]>0 && D[2]*E[2]>0 && D[3]*E[3]>0 && D[4]*E[4]>0)
return 1;
else
return 0;
}
void Calculate(int p, double *A, double *B, double *C, double *D, double *E)
{
int p1=pos[p][0];
int p2=pos[p][1];
int p3=pos[p][2];
int p4=pos[p][3];
if(fabs(y[p2]-y[p1])<ESP)
{
*A = 0.0;
*B = 1.0;
*C = -y[p1];
}
else if(fabs(x[p2]-x[p1])<ESP)
{
*A = 1.0;
*B = 0.0;
*C = -x[p1];
}
else
{
double t=(x[p2]-x[p1])/(y[p2]-y[p1]);
*A = 1.0;
*B = -t;
*C = t*y[p1]-x[p1];
}
*D = *A * x[p3] + *B * y[p3] + *C;
*E = *A * x[p4] + *B * y[p4] + *C;
}
int main()
{
double t;
int i,ii;
do
{
for(i=0;i<4;i++)
{
printf("Please Input Point %d(x,y):", i+1);
scanf("%lf,%lf", &x[i],&y[i]);
}
}while(CheckInput()==0);//检查输入的是4个不同的点
for(i=0;i<6;i++)
{
Calculate(i,&A[i],&B[i],&C[i],&D[i],&E[i]);
printf("(%s)\tA=%5.2lf\tB=%5.2lf\tC=%5.2lf\tD=%5.2lf\tE=%5.2lf\n", str[i], A[i], B[i], C[i], D[i], E[i]);
}
//判断4点共线
if(fabs(D[0])<ESP && fabs(E[0])<ESP)
{
printf("四点共线,面积为零\n");
return 0;
}
//判断3点共线
if(fabs(D[0])<ESP)
{
//0,1,2三点共线
TriangleArea(0,1,2,3);
return 0;
}
else if(fabs(E[0])<ESP)
{
//0,1,3三点共线
TriangleArea(0,1,3,2);
return 0;
}
else if(fabs(E[1])<ESP)
{
//0,2,3三点共线
TriangleArea(0,2,3,1);
return 0;
}
else if(fabs(E[3])<ESP)
{
//1,2,3三点共线
TriangleArea(1,2,3,0);
return 0;
}
//四边形
if(Check01122330(D,E)==0 && Check01133220(D,E)==0 && Check02211330(D,E)==0)
{
//凹四边形
AoArea01122330();
AoArea01133220();
AoArea02211330();
}
else if(Check01122330(D,E)==1)
{
//凸四边形
Area01122330();
}
else if(Check01133220(D,E)==1)
{
//凸四边形
Area01133220();
}
else if(Check02211330(D,E)==1)
{
//凸四边形
Area02211330();
}
return 0;
}

没看懂你说的


大洼县13855694593: C语言编程题 题目:任意输入4个点,求围成四边形的面积是多少? -
上忽和肝: C语言编程题:任意输入4个点,求围成四边形的面积是多少.代码如下:#include "stdio.h"#include "math.h" void main() { double x[4],y[4]; for(int i=0;i<4;i++) { scanf("%lf%lf",&x[i],&y[i]); } double mianji=0.0; for(int ii = 1 ; ii< 4 ; ii++) { mianji+...

大洼县13855694593: C语言编程题 题目:任意输入4个点,求围成四边形的面积.(提示:一共4种情况:第一4个点在一直线 第二3个点在一直线 第三围成凹四变形 第四围成四边形)
上忽和肝: 分解成三角形

大洼县13855694593: c语言编程问题:输入4个任意数字,然后按从小到大的顺序输入坐标点(x,y),输出该点所在的象限.代码是: -
上忽和肝: 1、打开自己的Python语言编程的IDLE. 2、在菜单栏中,单击“file”选中“new file”. 3、接着就会出现一个编辑界面. 4、往里面输入一下代码. 5、接着保存我们的文档,对于保存和其他的软件保存差不多,将该文件保存为“stradd”. 6、然后就可以运行我们的代码了,选中“run”-“run module”. 7、就会在我们的shell界面中出现我们想要输出的结果,我们根据我们的提示输入信息,输入以回车键结束,然后就会看到我们执行的效果了.

大洼县13855694593: 设计C语言程序 计算24点题目要求在输入4个数后,程序对这个4个数进行运算,若能计算出结果等于24,输出运算 -
上忽和肝: #include <stdio.h> #include <string.h> int c24; char expr3[80]; char expr4[80]; void count2( int a, int b ) {if ( a + b == 24 ){c24 ++;printf( "%s\t%s\t%d+%d=24\n", expr4, expr3, a, b );}if ( a * b == 24 ){c24 ++;printf( "%s\t%s\t%d+%d=24\n...

大洼县13855694593: 给出四个点,求其组成的四边形或三角形面积.跪求其c语言程序?高手解答,对了再给10分 -
上忽和肝: 我就给你一个数据词典吧三角形面积可以用海伦公式求的头文件判断四点关系(){ 定义一个变量 i; 中间量 middle=0; 4点中只有(123; 124; 134; 234)这四种情况 for(i=0;i<4;i++){ if(判断3点是否共线){ 是的话 middle++;} } return middle}得到...

大洼县13855694593: 哪位大侠可以帮我完成一个编程(C语言的),随便输入4个数,按大小顺序输出 -
上忽和肝: #include"stdio.h" void main() { int a,b,c,d,t; scanf("%d%d%d%d",&a,&b,&c,&d); if(a<b) {t=a;a=b;b=t;} if(c<d) {t=c;c=d;d=t;} if(a<c) {t=a;a=c;c=t;} if(b<d) {t=b;b=d;d=t;} if(b<c) {t=b;b=c;c=t;} printf("%d,%d,%d,%d",a,b,c,d); } 你的输入语句有问题

大洼县13855694593: 任意输入4个整数,从大到小排列输出.c语言程序怎么写 -
上忽和肝: 任意输入4个整数,从大到小排列输出.c语言程序写法:main() {int a,b,c,d,m; scanf("%d %d %d %d",&a,&b,&c,&d); if(b>a) {m=a;a=b;b=m;} if(d>c) {m=c;c=d;d=m;} if(c>a) {m=a;a=c;c=m;} if(c>b); {m=b;b=c;c=m;}printf("\n%d %d %d %d\n",a,...

大洼县13855694593: 任意输入一个四位数,逐个输出数字.C语言编程题 -
上忽和肝: #include <stdio.h> int main() { int i; char s[10]; scanf("%s",s);//最简2113单的方法 就是直5261接输入成4102字符1653串. for(i = 0; s[i]; i ++) printf("%c\n",s[i]);//输出各个位内每位一行.容 return 0; }

大洼县13855694593: 如何用C语言编程"输入4个数,通过加减乘除计算出24,显示计算过程,并提示成功信息." -
上忽和肝: #include "stdlib.h" #include "stdio.h" #include "string.h" typedef struct D_NODE {int data;struct D_NODE *left,*right; } NODE24; NODE24 head;int res=24;int maketree(int *src,int *i, NODE24 *p) {int d=src[*i];(*i)++;switch (d)...

大洼县13855694593: c语言编程题,计算二十四点 随机生成四个1~10的数字,使用加减乘除运算,计算24.输出这四个数字是否能计算
上忽和肝: 很简单呀.最随机数1-10 赋值A,最随机数1-赋值B,....共赋值ABCD,叛断,赋值A等于BCD,则重取随机数,然后叛断用ABCD相加或减等于24,等则输出.不等于则重取

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网