C语言课程设计错误修改求助


本人今年大二,C语言做课程设计就是证明这道题。在做的过程中遇到几个不明白的问题希望高手能赐教。 课本用的谭浩强的C程序设计(第五版)课程课时少,指针都没学完,就先用前面的知识解决问题, 发现这样几个问题:

 1.面积证明大部分时候出错,计算出来的面积只有整数,但我用的是double型的数据,老师说肯定是因为我把某个高精度数据赋值给了int型的数据,但我检查确实没有,也就是说等号左边都是高精度数据类型,实在不知道问题在哪(比如0 0 4 0 4 4 0 2这一组数据成功,0 0 4 0 4 4 1 3这组数据失败)

 2.老师禁止使用goto语句,说用循环代替,该怎么改(这学期也开了单片机,明明感觉用goto非常舒服思路清楚,无非就是思路更贴近汇编语言一样)

#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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值