[問題] 四點座標算最大面積

看板C_and_CPP作者 (香香)時間15年前 (2010/05/09 22:48), 編輯推噓2(204)
留言6則, 4人參與, 最新討論串1/2 (看更多)
大家好 小弟在寫這個題目 題目要求 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
回1F 對
05/10 12:08, 3F

05/10 21:01, , 4F
程式應該先考慮點的位置 若是四個點在一行列或其他
05/10 21:01, 4F

05/10 21:28, , 5F
一開始有說4點一直線不考慮 就只有四邊型跟三角型而已
05/10 21:28, 5F

05/10 21:29, , 6F
還是還能圍出其他形狀的最大面積
05/10 21:29, 6F
文章代碼(AID): #1BviiuoN (C_and_CPP)
文章代碼(AID): #1BviiuoN (C_and_CPP)