[問題] 四點座標算最大面積
大家好
小弟在寫這個題目
題目要求
1.先換成整數再記算
2.四點一直線的情形不考慮
3.必須使用海龍公式且必須使用函數
4.情況有2種 最大面積為四邊形 最大面積為三角形 顯示結果必須印出由哪幾點圍成
我寫的(使用 putty Linux gnuC)
1.只能算出四邊形 三角形不會算
2.沒辦法避免浮點數的誤差
麻煩大家看一下程式碼
---------------------------------
#include<stdio.h>
#include<math.h>
double D(int A1,int B1,int A2,int B2) /*算距離*/
{
double D;
D=(A1-A2)*(A1-A2)+(B1-B2)*(B1-B2);
return sqrt(D);
}
double A(double a,double b,double c) /*算面積*/
{
double s,A;
s=(a+b+c)/2;
A=s*(s-a)*(s-b)*(s-c);
return sqrt(A);
}
int main()
{
float a1,a2,a3,a4,b1,b2,b3,b4;
char d;
int A1,A2,A3,A4,B1,B2,B3,B4;
/*輸入*/
start1:
printf("請輸入第一個正負整數座標點X1、Y1,並以逗點區隔兩個整數:");
scanf("%f,%f",&a1,&b1);
printf("請輸入第二個正負整數座標點X2、Y2,並以逗點區隔兩個整數:");
scanf("%f,%f",&a2,&b2);
printf("請輸入第三個正負整數座標點X3、Y3,並以逗點區隔兩個整數:");
scanf("%f,%f",&a3,&b3);
printf("請輸入第四個正負整數座標點X4、Y4,並以逗點區隔兩個整數:");
scanf("%f,%f",&a4,&b4);
/*換整數*/
A1=(int) a1;
A2=(int) a2;
A3=(int) a3;
A4=(int) a4;
B1=(int) b1;
B2=(int) b2;
B3=(int) b3;
B4=(int) b4;
/*輸出*/
printf("你所輸入的四個座標分別為
(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n",A1,B1,A2,B2,A3,B3,A4,B4);
if(D(A1,B1,A2,B2)>D(A1,B1,A3,B3)||D(A1,B1,A4,B4)>D(A1,B1,A3,B3)||D(A2,B2,A4,B4)>D(A2,B2,A1,B1)||D(A2,B2,A4,B4)>D(A2,B2,A3,B3))
printf("其最大面積為 %f 由(%d,%d),(%d,%d),(%d,%d),(%d,%d)所圍成
\n",A(D(A1,B1,A2,B2),D(A2,B2,A3,B3),D(A1,B1,A3,B3))
+A(D(A1,B1,A3,B3),D(A3,B3,A4,B4),D(A1,B1,A4,B4)),A1,B1,A2,B2,A3,B3,A4,B4);
else
if((A(D(A1,B1,A2,B2),D(A1,B1,A3,B3),D(A2,B2,A3,B3))
+A(D(A1,B1,A2,B2),D(A1,B1,A4,B4),D(A2,B2,A4,B4))
+A(D(A1,B1,A3,B3),D(A1,B1,A4,B4),D(A3,B3,A4,B4)))
==A(D(A2,B2,A3,B3),D(A2,B2,A4,B4),D(A3,B3,A4,B4)))
printf("其最大面積為 %f 由(%d,%d),(%d,%d),(%d,%d)所圍成
\n",A(D(A2,B2,A3,B3),D(A2,B2,A4,B4),D(A3,B3,A4,B4)),A2,B2,A3,B3,A4,B4);
else
if((A(D(A2,B2,A1,B1),D(A2,B2,A3,B3),D(A1,B1,A3,B3))
+A(D(A2,B2,A1,B1),D(A2,B2,A4,B4),D(A1,B1,A4,B4))
+A(D(A2,B2,A3,B3),D(A2,B2,A4,B4),D(A3,B3,A4,B4)))
==A(D(A1,B1,A3,B3),D(A1,B1,A4,B4),D(A3,B3,A4,B4)))
printf("其最大面積為 %f 由(%d,%d),(%d,%d),(%d,%d)所圍成
\n",A(D(A1,B1,A3,B3),D(A1,B1,A4,B4),D(A3,B3,A4,B4)),A1,B1,A3,B3,A4,B4);
else
if((A(D(A3,B3,A1,B1),D(A3,B3,A2,B2),D(A1,B1,A2,B2))
+A(D(A3,B3,A1,B1),D(A3,B3,A4,B4),D(A1,B1,A4,B4))
+A(D(A3,B3,A2,B2),D(A3,B3,A4,B4),D(A2,B2,A4,B4)))
==A(D(A1,B1,A2,B2),D(A1,B1,A4,B4),D(A2,B2,A4,B4)))
printf("其最大面積為 %f 由(%d,%d),(%d,%d),(%d,%d)所圍成
\n",A(D(A1,B1,A2,B2),D(A1,B1,A4,B4),D(A2,B2,A4,B4)),A1,B1,A2,B2,A4,B4);
else
if((A(D(A4,B4,A1,B1),D(A4,B4,A2,B2),D(A1,B1,A2,B2))
+A(D(A4,B4,A1,B1),D(A4,B4,A3,B3),D(A1,B1,A3,B3))
+A(D(A4,B4,A2,B2),D(A4,B4,A3,B3),D(A2,B2,A3,B3)))
==A(D(A1,B1,A2,B2),D(A1,B1,A3,B3),D(A2,B2,A3,B3)))
printf("其最大面積為 %f 由(%d,%d),(%d,%d),(%d,%d)所圍成
\n",A(D(A1,B1,A2,B2),D(A1,B1,A3,B3),D(A2,B2,A3,B3)),A1,B1,A2,B2,A3,B3);
/*再次使用*/
start2:
printf("是否輸入另一組座標(Y/N):");
scanf(" %c",&d);
switch(d)
{
case 'y':
case 'Y':
goto start1;
case 'n':
case 'N':
break;
default:
goto start2;
}
printf("歡迎下次再次使用本程式\n");
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.130.208.149
※ 編輯: priest0204 來自: 140.130.208.149 (05/09 22:49)
推
05/09 23:07, , 1F
05/09 23:07, 1F
→
05/10 02:43, , 2F
05/10 02:43, 2F
→
05/10 12:08, , 3F
05/10 12:08, 3F
推
05/10 21:01, , 4F
05/10 21:01, 4F
→
05/10 21:28, , 5F
05/10 21:28, 5F
→
05/10 21:29, , 6F
05/10 21:29, 6F
討論串 (同標題文章)