kowala's home

kowala's home
這裡是我的學習筆記,陸續增加中。
http://kowala21.blogspot.com

2014-11-08

BCB6 畢氏定理計算機

最近小孩正在學畢氏定理,說簡單還算簡單,但是要用計算機按半天,還要再開根號,蠻麻煩的,就寫了這個小程式,下面有部分程式碼,為何是部分?因為視窗程式很大部分是視窗元件,是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;
}

沒有留言:

張貼留言

請提供您的寶貴意見 ;-)