(以下內容可以在http://140.135.8.200/phpBB/viewtopic.php?f=11&t=12同步閱讀)
題目說明的非常不清楚,有些時候我不喜歡給太明確的程式要求,一方面是懶,另一方面我覺得大家要多動腦筋想想,這個題目下面有多少程式功能必須要完成,然後規畫一下流程,撰寫程式。
簡單分成三個程式功能:1. 輸出輸入介面以及輸入檢查,2. 二進制轉十進制,3.十進制轉二進制
先談2, 3這兩個部份,作為通用性考量,輸入浮點數應該是要被接受。進制轉換的演算法在網路上或是一般計算機概論的書裡面都可以找的到,不過我習慣自己想,以下的演算法是在寫這篇紀錄的時候想的,也許下一次再重寫這個程式會有不同的想法,另外當然也可能會有不小心想錯了的可能。發現錯誤請糾正。
- 2. 二進制轉十進制
假設二進制數字 110011.001101(2)要轉換成十進制,這裡將它分成整數部分和小數部分。整數部分為110011,實作的演算法為(由右至左) 1 x 2[super]0[/super] + 1 x 2[super]1[/super] + 0 x 2[super]2[/super] + 0 x 2[super]3[/super] + 1 x 2[super]4[/super] + 1 x 2[super]5[/super]
小數的部分為001101,實作的演算法為(由右至左) 0 x 2[super]-1[/super] + 0 x 2[super]-2[/super] + 1 x 2[super]-3[/super] + 1 x 2[super]-4[/super] + 0 x 2[super]-5[/super] + 1 x 2[super]-6[/super]
首先需要先決定如何將資料儲存在電腦當中,這會很大的影響未來演算法的走向。常常會有寫到後面寫不下去然後回來重新定義輸入資料型態的事情發生,不過對於學習來說這些過程都是好的。
因為目前我們比較熟悉整數(long)和浮點數(double)的使用,這裡也使用這個資料形態來儲存所要處理的資料。可以想樣一下當你從電腦鍵盤輸入110011.001101的時候你認為你輸入了一個二進制的數字,其實存在電腦裡面的是一個十進制的double。
將整數和浮點數分開的方法我利用一個簡單的型別轉換:當浮點數轉成整數的時候會無條件捨去小數點後面的資料,這個特性其實挺好的。
long binary_int;double input_num, binary_dec;
cout << "Please enter a binary number: ";cin >> input_num; //螢幕上要你輸入的是二進制數字,其實存在電腦裡的是dobule
binary_int = (int) input_num; //很簡單的兩行程式碼把整數部分和小數部分分開binary_dec = input_num - binary_int;
再來是要取出每一個位置的數值用來成以2的次方,如果要由右至左進行可以將整數的部分 mod 10,這樣就會留下個位數字位置的值用來成以2的次方。整數部分的值對10進行整數除法留下的就是扣掉最右邊的位置的數值,然後反覆進行直到整數位置的值為零為止。
有程式碼看可能會簡單一點int tmp1;for(int i = 0; binary_int > 0; ++i) //變數i宣告在for迴圈當中,它的生存範圍就在這個括號{}裡面, //當for迴圈結束變數i會被釋放,記憶空間歸還給作業系統 { tmp1 = binary_int % 10; binary_int /= 10; // binary_int 是整數,所以除完以後會將小數部分丟掉
decimal_int += tmp1*pow(double(2),double(i)); //要用pow要include}這樣就寫完整數部分了。
小數部分將小數點後面的數值乘以10,然後取出整數部分乘上相對應的次方數值,重複步驟一直到小數部分為零為止,作法類似上面。最後將整數和小數部分相加即得到最後的答案[/list]
未完待續.....也許就不續了....
沒有留言:
張貼留言