最近小孩正在學畢氏定理,說簡單還算簡單,但是要用計算機按半天,還要再開根號,蠻麻煩的,就寫了這個小程式,下面有部分程式碼,為何是部分?因為視窗程式很大部分是視窗元件,是BCB自動產生的,我們多半不需管它,只需專注於核心功能寫作就行了。
下載
https://www.dropbox.com/s/5qx8xpz8zmhm69h/BisTheory1.rar?dl=0
程式說明
這隻程式主要有兩個部分,一是三角形輸入幾個邊,要求哪個邊判定,第二是浮點數計算問題,程式碼如下
一、狀態判定,填入幾個邊了
int chkState(){
UnicodeString s1,s2,s3;
s1=edit1->Text;//1
s2=edit2->Text;//3
s3=edit3->Text;//5
if(s1.Length()>0)mystate[1]=1;else mystate[1]=0;
if(s2.Length()>0)mystate[2]=3;else mystate[2]=0;
if(s3.Length()>0)mystate[3]=5;else mystate[3]=0;
mystate[0]=mystate[1]+mystate[2]+mystate[3];
return mystate[0];
}
這裡只要文字框產生 change()事件啟動,會檢查三個邊,字串長度>0,並分別給定其代表值,最後加總該值傳回,
a=1
b=3
c=5
如果傳回 8 ,代表b+c=8,那就知道要求的是 a 了。
二、浮點數計算
浮點數計算比較麻煩,因為有精度問題,動不動就會溢位,這裡沒專門處理這問題,只是簡單的提供精度設定,溢位就會變成負值,你就手動把精度調低些就好了。
精度就是靠四捨五入函式來完成,計算就是依據狀態判定來求相應的值。
四捨五入,使用整數法
double round(double src,int n){
double res;
int i,k=1;
for(i=0;i<n;i++)k*=10;
res=int(src*k+0.5);
res/=k;
return res;
}
計算
這裡沒用sqrt()函數,因為溢位時,會跳出一個對話 sqrt DOMAIN error,有點煩,所以改用求1/2平方來代替,溢位就是負值。
double calculate(){
a=uStrToDouble(edit1->Text);
b=uStrToDouble(edit2->Text);
c=uStrToDouble(edit3->Text);
switch (mystate[0]){
case 8://a=sqrt(c^2-b^2);
b2=pow(b,2);c2=pow(c,2);
a2=c2-b2;
//result=sqrt(round(a2,8));
result=pow(a2,0.5);
break;
case 6://b=sqrt(c^2-a^2);
a2=pow(a,2);c2=pow(c,2);
b2=c2-a2;
//result=sqrt(round(b2,8));
result=pow(b2,0.5);
break;
case 4://c=sqrt(a^2+b^2);
a2=pow(a,2);b2=pow(b,2);
c2=a2+b2;
//result=sqrt(round(c2,8));
result=pow(c2,0.5);
break;
}
return result;
}
沒有留言:
張貼留言
請提供您的寶貴意見 ;-)