33,311
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include<math.h>
#include<windows.h>
int main()
{
int x1,y1,x2,y2,x3,y3,x4,y4,A1,A2,B1,B2,C1,C2;//改成float会出现死循环
double lab,lbc,lcd,lda,lac,lbd, xm,ym,xn,yn,xr,yr, labd,lbcd,lmn,lmr,lnr,lmnr;
double SABCD,SMNR;
START:
printf("依次输入A,B,C,D四点的坐标A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4),\n") ; //坐标有小数会出问题
scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
printf("A,B,C,D四点的坐标为A(%d,%d),B(%d,%d),C(%d,%d),D(%d,%d)\n",x1,y1,x2,y2,x3,y3,x4,y4);
if //筛选当输入的点有坐标重合的情况
(
(x1==x2&&y1==y2)
||(x1==x3&&y1==y3)
||(x1==x4&&y1==y4)
||(x2==x3&&y2==y3)
||(x2==x4&&y2==y4)
||(x3==x4&&y3==y4)
)
{
printf("A,B,C,D中至少有两点坐标有重合,请重新输入\n\n");
goto START;
}
A1=y2-y1;//计算直线AB和CD一般式的系数,不能使两直线平行
B1=x1-x2;
C1=x2*y1-x1*y2 ;
A2=y3-y4;
B2=x4-x3;
C2=x3*y4-x4*y3 ;
xm=(x1+x3)/2;//计算m,n两点坐标
ym=(y1+y3)/2;
xn=(x2+x4)/2;
yn=(y2+y4)/2;
lab=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); //计算四边形各个边长
lbc=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
lcd=sqrt((x3-x4)*(x3-x4)+(y3-y4)*(y3-y4));
lda=sqrt((x4-x1)*(x4-x1)+(y4-y1)*(y4-y1));
lbd=sqrt((x2-x4)*(x2-x4)+(y2-y4)*(y2-y4));//计算对角线长度
lac=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
if((y2-y1)*x3+(x1-x2)*y3+x2*y1-x1*y2==0)
{
printf("A,B,C三点共线,请重新输入坐标使得三点不共线\n\n");
Sleep(5000);
goto START;
}
else if((y2-y1)*x4+(x1-x2)*y4+x2*y1-x1*y2==0)
{
printf("A,B,D三点共线,请重新输入坐标使得三点不共线\n\n");
Sleep(5000);
goto START;
}
else if(A1*B2==A2*B1&&C1!=C2)
{
printf("直线AB与直线CD平行,请重新输入坐标\n\n") ;
Sleep(5000);//windows.h头文件下命令,“s”小写以秒为单位,"S"大写以微秒为单位
goto START;
}
else if
(
((y3-y1)*x2+(x1-x3)*y2+x3*y1-x1*y3)* ((y3-y1)*x4+(x1-x3)*y4+x3*y1-x1*y3)>0
&&
((y4-y2)*x1+(x2-x4)*y1-x2*y4+x4*y2)* ((y4-y2)*x3+(x2-x4)*y3-x2*y4+x4*y2)>0
)
{
printf("A,B,C,D四点依次连接得到的不是一般四边形,请重新输入坐标使得对角线AC,BD不在四边形ABDC中交叉\n\n");
Sleep(5000);
goto START;
}
else if
(
(
((y3-y1)*x2+(x1-x3)*y2+x3*y1-x1*y3)* ((y3-y1)*x4+(x1-x3)*y4+x3*y1-x1*y3)>0
&&
((y4-y2)*x1+(x2-x4)*y1-x2*y4+x4*y2)* ((y4-y2)*x3+(x2-x4)*y3-x2*y4+x4*y2)<0
)
||
(
((y3-y1)*x2+(x1-x3)*y2+x3*y1-x1*y3)* ((y3-y1)*x4+(x1-x3)*y4+x3*y1-x1*y3)<0
&&
((y4-y2)*x1+(x2-x4)*y1-x2*y4+x4*y2)* ((y4-y2)*x3+(x2-x4)*y3-x2*y4+x4*y2)>0
)
)
{ printf("A,B,C,D四点依次连接得到的是凹四边形,请重新输入坐标使得四边形为凸四边形\n\n");
Sleep(5000);
goto START;
}
else
printf("ABCD顺次连接为一般四边形\nlab=%-1.2f\nlbc=%-1.2f\nlcd=%-1.2f\nlda=%-1.2f\n\n",lab,lbc,lcd,lda);
labd=(lab+lbd+lda)/2;
lbcd=(lbc+lcd+lbd)/2;
SABCD=sqrt(labd*(labd-lab)*(labd-lbd)*(labd-lda))+sqrt(lbcd*(lbcd-lbc)*(lbcd-lcd)*(lbcd-lbd));//得到四边形ABCD的面积
xr=(C2*B1-C1*B2)/(A1*B2-A2*B1) ;//计算AB,CD延长线的交点
yr=(A2*C1-A1*C2)/(A2*B1-A1*B2);
lmn=sqrt((xm-xn)*(xm-xn)+(ym-yn)*(ym-yn));//计算mn长度
lmr=sqrt((xm-xr)*(xm-xr)+(ym-yr)*(ym-yr));//计算mr长度
lnr=sqrt((xr-xn)*(xr-xn)+(yr-yn)*(yr-yn));//计算nr长度
lmnr=(lmn+lmr+lnr)/2;
SMNR=sqrt(lmnr*(lmnr-lnr)*(lmnr-lmr)*(lmnr-lmn));
if(SABCD-4*SMNR<0.00001&&SABCD-4*SMNR>-0.00001) //10^-6次方就不行,出现证明失败,极限就是-5次方怎么提高精度
{
printf("lmn=%-10.2f\nlnr=%-10.2f\nlmr=%-10.2f\n\n",lmn,lnr,lmr);
printf("四边形的面积为%-10.4f\n三角形MNR面积为%-10.4f\n",SABCD,SMNR);
printf("证明成功\n");
}
else
{
printf("lmn=%-10.2f\nlnr=%-10.2f\nlmr=%-10.2f\n\n",lmn,lnr,lmr);
printf("四边形ABCD的面积为%-10.4f\n三角形MNR面积为%-10.4f\n",SABCD,SMNR);
printf("证明失败\n") ;
}
return 0;
}
#include <stdio.h>
int main()
{float a;
double b;
b=1000/3;
a=1000/3;
printf("%f\n\n",(0.0000001)/2);//这个和你举得float的例子一样
printf("%lf\n\n",(0.0000001)/2);//以double的格式%lf去输出,结果也是一样的
printf("%1.10f\n\n",(0.0000001)/2);//在%f前修饰符,就把结果精确了,并且没有出现垃圾数
printf("%f\n\n",(10000)/3);//这个输出情况就比较费解了
printf("%1.10f\n\n",(10000)/3);//再加上修饰符也是没用的,和上面一样,多几个没用的零
{printf("%f\n\n",a); //这个就相当费解了,第一条我是照抄谭浩强书上的例子,他这个例子的结果是3333.33252,我们老师说
printf("%1.10f\n\n",a); //252那个就是垃圾数,随机数,系统内原来的存储空间中的数据,但是调试的结果连小数部分都
printf("%5.10f\n\n",a);}; //没有,并且也没有出现随机数,后面那个填1.10修饰符输出%f我自己试的,也是没用的
{printf("%f\n\n",b); //把数据类型换成double也同样不对
printf("%1.10f\n\n",b); //不知道是不是和编译器有关系…桌面上的图标名字是Microsoft Visual C++6.0,新建工程后,标题栏名字是这样:我自己随便起的文件名-创天中文VC++
printf("%5.10f\n\n",b);};
return 0;
}
#include <stdio.h>
#include<math.h>
#include<windows.h>
int main()
{
double x1,y1,x2,y2,x3,y3,x4,y4,A1,A2,B1,B2,C1,C2;
double lab,lbc,lcd,lda,lac,lbd, xm,ym,xn,yn,xr,yr, labd,lbcd,lmn,lmr,lnr,lmnr;
double SABCD,SMNR;
while(1)
{
printf("依次输入A,B,C,D四点的坐标A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4),\n");
scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
printf("A,B,C,D四点的坐标为A(%lf,%lf),B(%lf,%lf),C(%lf,%lf),D(%lf,%lf)\n", x1, y1, x2, y2, x3, y3, x4, y4);
if
(
(x1==x2&&y1==y2)
||(x1==x3&&y1==y3)
||(x1==x4&&y1==y4)
||(x2==x3&&y2==y3)
||(x2==x4&&y2==y4)
||(x3==x4&&y3==y4)
)
{ printf("A,B,C,D中至少有两点坐标有重合,请重新输入\n\n") ;
continue;
};
A1=y2-y1;//计算直线AB和CD一般式的系数,不能使两直线平行
B1=x1-x2;
C1=x2*y1-x1*y2;
A2=y3-y4;
B2=x4-x3;
C2=x3*y4-x4*y3;
xm=(x1+x3)/2;//计算m,n两点坐标
ym=(y1+y3)/2;
xn=(x2+x4)/2;
yn=(y2+y4)/2;
lab=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); //计算四边形各个边长
lbc=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
lcd=sqrt((x3-x4)*(x3-x4)+(y3-y4)*(y3-y4));
lda=sqrt((x4-x1)*(x4-x1)+(y4-y1)*(y4-y1));
lbd=sqrt((x2-x4)*(x2-x4)+(y2-y4)*(y2-y4));//计算对角线长度
lac=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
if((y2-y1)*x3+(x1-x2)*y3+x2*y1-x1*y2==0)
{
printf("A,B,C三点共线,请重新输入坐标使得三点不共线\n\n");
Sleep(5000);
continue;};
if((y2-y1)*x4+(x1-x2)*y4+x2*y1-x1*y2==0)
{
printf("A,B,D三点共线,请重新输入坐标使得三点不共线\n\n");
Sleep(5000);
continue; };
if(A1*B2==A2*B1&&C1!=C2)
{
printf("直线AB与直线CD平行,请重新输入坐标\n\n") ;
Sleep(5000); //windows.h头文件下命令,“s”小写以秒为单位,"S"大写以微秒为单位
continue; };
if
(
((y3-y1)*x2+(x1-x3)*y2+x3*y1-x1*y3)* ((y3-y1)*x4+(x1-x3)*y4+x3*y1-x1*y3)>0
&&
((y4-y2)*x1+(x2-x4)*y1-x2*y4+x4*y2)* ((y4-y2)*x3+(x2-x4)*y3-x2*y4+x4*y2)>0
)
{
printf("A,B,C,D四点依次连接得到的不是一般四边形,请重新输入坐标使得对角线AC,BD不在四边形ABDC中交叉\n\n");
Sleep(5000);
continue;};
if
(
(
((y3-y1)*x2+(x1-x3)*y2+x3*y1-x1*y3)* ((y3-y1)*x4+(x1-x3)*y4+x3*y1-x1*y3)>0
&&
((y4-y2)*x1+(x2-x4)*y1-x2*y4+x4*y2)* ((y4-y2)*x3+(x2-x4)*y3-x2*y4+x4*y2)<0
)
||
(
((y3-y1)*x2+(x1-x3)*y2+x3*y1-x1*y3)* ((y3-y1)*x4+(x1-x3)*y4+x3*y1-x1*y3)<0
&&
((y4-y2)*x1+(x2-x4)*y1-x2*y4+x4*y2)* ((y4-y2)*x3+(x2-x4)*y3-x2*y4+x4*y2)>0
)
)
{ printf("A,B,C,D四点依次连接得到的是凹四边形,请重新输入坐标使得四边形为凸四边形\n\n");
Sleep(5000);
continue;};
printf("ABCD顺次连接为一般四边形\nlab=%-1.2f\nlbc=%-1.2f\nlcd=%-1.2f\nlda=%-1.2f\n\n",lab,lbc,lcd,lda);
break;
};
labd=(lab+lbd+lda)/2;
lbcd=(lbc+lcd+lbd)/2;
SABCD=sqrt(labd*(labd-lab)*(labd-lbd)*(labd-lda))+sqrt(lbcd*(lbcd-lbc)*(lbcd-lcd)*(lbcd-lbd));//得到四边形ABCD的面积
xr=(C2*B1-C1*B2)/(A1*B2-A2*B1) ;//计算AB,CD延长线的交点
yr=(A2*C1-A1*C2)/(A2*B1-A1*B2);
lmn=sqrt((xm-xn)*(xm-xn)+(ym-yn)*(ym-yn));//计算mn长度
lmr=sqrt((xm-xr)*(xm-xr)+(ym-yr)*(ym-yr));//计算mr长度
lnr=sqrt((xr-xn)*(xr-xn)+(yr-yn)*(yr-yn));//计算nr长度
lmnr=(lmn+lmr+lnr)/2;
SMNR=sqrt(lmnr*(lmnr-lnr)*(lmnr-lmr)*(lmnr-lmn));
if(SABCD-4*SMNR<0.00001&&SABCD-4*SMNR>-0.00001) //10^-6次方就不行,出现证明失败,极限就是-5次方怎么提高精度
{
printf("lmn=%-10.2f\nlnr=%-10.2f\nlmr=%-10.2f\n\n",lmn,lnr,lmr);
printf("四边形的面积为%-10.4f\n三角形MNR面积为%-10.4f\n",SABCD,SMNR);
printf("证明成功\n");
}
else
{
printf("lmn=%-10.2f\nlnr=%-10.2f\nlmr=%-10.2f\n\n",lmn,lnr,lmr);
printf("四边形ABCD的面积为%-10.4f\n三角形MNR面积为%-10.4f\n",SABCD,SMNR);
printf("证明失败\n") ;
};
return 0;
}
#include <stdio.h>
#include<math.h>
#include<windows.h>
int main()
{
double x1,y1,x2,y2,x3,y3,x4,y4,A1,A2,B1,B2,C1,C2;
double lab,lbc,lcd,lda,lac,lbd, xm,ym,xn,yn,xr,yr, labd,lbcd,lmn,lmr,lnr,lmnr;
double SABCD,SMNR;
while(1)
{
printf("依次输入A,B,C,D四点的坐标A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4),\n");
scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
printf("A,B,C,D四点的坐标为A(%lf,%lf),B(%lf,%lf),C(%lf,%lf),D(%lf,%lf)\n", x1, y1, x2, y2, x3, y3, x4, y4);
if
(
(x1==x2&&y1==y2)
||(x1==x3&&y1==y3)
||(x1==x4&&y1==y4)
||(x2==x3&&y2==y3)
||(x2==x4&&y2==y4)
||(x3==x4&&y3==y4)
)
{ printf("A,B,C,D中至少有两点坐标有重合,请重新输入\n\n") ;
continue;
};
A1=y1-y2;//计算直线AB和CD一般式的系数,不能使两直线平行
B1=x2-x1;
C1=x1*y2-x2*y1;
A2=y3-y4;
B2=x4-x3;
C2=x3*y4-x4*y3;
xm=(x1+x3)/2;//计算m,n两点坐标
ym=(y1+y3)/2;
xn=(x2+x4)/2;
yn=(y2+y4)/2;
lab=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); //计算四边形各个边长
lbc=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
lcd=sqrt((x3-x4)*(x3-x4)+(y3-y4)*(y3-y4));
lda=sqrt((x4-x1)*(x4-x1)+(y4-y1)*(y4-y1));
lbd=sqrt((x2-x4)*(x2-x4)+(y2-y4)*(y2-y4));//计算对角线长度
lac=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
if((y2-y1)*x3+(x1-x2)*y3+x2*y1-x1*y2==0)
{
printf("A,B,C三点共线,请重新输入坐标使得三点不共线\n\n");
Sleep(5000);
continue;};
if((y2-y1)*x4+(x1-x2)*y4+x2*y1-x1*y2==0)
{
printf("A,B,D三点共线,请重新输入坐标使得三点不共线\n\n");
Sleep(5000);
continue; };
if(A1*B2==A2*B1&&C1!=C2)
{
printf("直线AB与直线CD平行,请重新输入坐标\n\n") ;
Sleep(5000); //windows.h头文件下命令,“s”小写以秒为单位,"S"大写以微秒为单位
continue; };
if
(
((y3-y1)*x2+(x1-x3)*y2+x3*y1-x1*y3)* ((y3-y1)*x4+(x1-x3)*y4+x3*y1-x1*y3)>0
&&
((y4-y2)*x1+(x2-x4)*y1-x2*y4+x4*y2)* ((y4-y2)*x3+(x2-x4)*y3-x2*y4+x4*y2)>0
)
{
printf("A,B,C,D四点依次连接得到的不是一般四边形,请重新输入坐标使得对角线AC,BD不在四边形ABDC中交叉\n\n");
Sleep(5000);
continue;};
if
(
(
((y3-y1)*x2+(x1-x3)*y2+x3*y1-x1*y3)* ((y3-y1)*x4+(x1-x3)*y4+x3*y1-x1*y3)>0
&&
((y4-y2)*x1+(x2-x4)*y1-x2*y4+x4*y2)* ((y4-y2)*x3+(x2-x4)*y3-x2*y4+x4*y2)<0
)
||
(
((y3-y1)*x2+(x1-x3)*y2+x3*y1-x1*y3)* ((y3-y1)*x4+(x1-x3)*y4+x3*y1-x1*y3)<0
&&
((y4-y2)*x1+(x2-x4)*y1-x2*y4+x4*y2)* ((y4-y2)*x3+(x2-x4)*y3-x2*y4+x4*y2)>0
)
)
{ printf("A,B,C,D四点依次连接得到的是凹四边形,请重新输入坐标使得四边形为凸四边形\n\n");
Sleep(5000);
continue;};
printf("ABCD顺次连接为一般四边形\nlab=%-1.2f\nlbc=%-1.2f\nlcd=%-1.2f\nlda=%-1.2f\n\n",lab,lbc,lcd,lda);
break;
};
labd=(lab+lbd+lda)/2;
lbcd=(lbc+lcd+lbd)/2;
SABCD = sqrt((lab + lda + lbd)*(lab + lda - lbd)*(lab - lda + lbd)*(-lab + lda + lbd) / 16.0)
+ sqrt((lbc + lcd + lbd)*(lbc + lcd - lbd)*(lbc - lcd + lbd)*(-lbc + lcd + lbd) / 16.0);//得到四边形ABCD的面积
xr=(C2*B1-C1*B2)/(A1*B2-A2*B1) ;//计算AB,CD延长线的交点
yr=(A1*C2-A2*C1)/(A2*B1-A1*B2);
lmn=sqrt((xm-xn)*(xm-xn)+(ym-yn)*(ym-yn));//计算mn长度
lmr=sqrt((xm-xr)*(xm-xr)+(ym-yr)*(ym-yr));//计算mr长度
lnr=sqrt((xr-xn)*(xr-xn)+(yr-yn)*(yr-yn));//计算nr长度
lmnr=(lmn+lmr+lnr)/2;
SMNR=sqrt(lmnr*(lmnr-lnr)*(lmnr-lmr)*(lmnr-lmn));
if(SABCD-4*SMNR<0.00001&&SABCD-4*SMNR>-0.00001) //10^-6次方就不行,出现证明失败,极限就是-5次方怎么提高精度
{
printf("lmn=%-10.2f\nlnr=%-10.2f\nlmr=%-10.2f\n\n",lmn,lnr,lmr);
printf("四边形的面积为%-10.4f\n三角形MNR面积为%-10.4f\n",SABCD,SMNR);
printf("证明成功\n");
}
else
{
printf("lmn=%-10.2f\nlnr=%-10.2f\nlmr=%-10.2f\n\n",lmn,lnr,lmr);
printf("四边形ABCD的面积为%-10.4f\n三角形MNR面积为%-10.4f\n",SABCD,SMNR);
printf("证明失败\n") ;
};
return 0;
}