查看完整版本: [C++] 八進位數值的轉換
頁: [1]

ezschool6307 發表於 2011-8-24 12:01 AM

[C++] 八進位數值的轉換

Q:輸入一個八進位數值,並將此八進位數值以二進位格式及十進位格式輸出

我從課本和網路上找到的部分


比較常看到10進位轉換(或者 頗難的16進位轉換精簡版)


而自己改寫後... 雖然compile會過


執行時→發現有時候輸入(八進位數值) 仍計算錯誤!!


目前只知道十進位的表示法→自己是程式新手,可能寫法都比較笨拙


如果有更好的寫法   或者比較簡單的方式(還請多多包涵、指點)


至於,如何將八進位數值轉成二進位,不知道該怎麼修改


希望大家能給些建議,互相分享討論....Thanks  ^^


Code:
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>

using namespace std;
int main()
{
    string number;
    string input1="請輸入任意(八進位)數值: ";
   
    cout<<input1;
    cin>>number;
   
    std::string data= number;
    std::stringstream sstr(data);
    int in_int=0;
    char in_char=' ';
    std::cout.setf(std::ios::dec);
    while(sstr >> in_char)
    {
        if(in_char=='O')
            sstr >> std::oct >> in_int;
        else if(in_char=='0')
            sstr >> in_char >> std::hex >> in_int;
        else
        {
            long pos=sstr.tellg();
            sstr.seekg(pos-1);
            sstr >> std::dec >> in_int;
        }
        std::cout << in_int << std::endl;
    }
    system("pause");
    return 0;
}

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

trtc008056 發表於 2011-8-24 01:07 AM

本帖最後由 trtc008056 於 2011-8-24 01:13 AM 編輯

通常我的作法
未知進位-->10-->2

但是如果是這到題目的話

會變成

8--->2--->10

比較好處理


程式碼:
http://codepad.org/7ycSjp6s

有一些小bug

1.他不會去檢查是否為正確的8進位

2.因為都是用int,所以輸入三位數以上的恐怕會爆掉(overflow)

3.程式有點醜,請見諒。
另外,有些看不太懂你的程式

我寫的存脆做計算(計概上面寫的...)

轉換方法

10->...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ezschool6307 發表於 2011-8-24 01:38 AM

謝謝版主   這麼用心的將計算原理

也舉例說明,這樣有比較清楚些~

程式的部分   我會在Try看看(慢慢了解中...)

iseeyou 發表於 2011-8-24 09:34 PM

一般在電腦內作這種進至轉換的程式. 通常只有一個目的.
就是把 整數(int). 要輸出顯示時的轉換
或是輸入的數字字串轉換成整數(int)
note : 用 cout 輸出一個整數其時也要作這種轉換, 只是 C++ 的library 幫你作掉了

基本上很少有人會把一個 int 的內容. 用每一個十近位的位數當作是另一個進位的一個位數.
因為這樣子跟本無法運算.
也因為如此. 所以. 我就寫一個 8 進位字串, 轉換成 2 進為字串的程式把
#include <iostream>
#include <string>

std::string OctSToBinS(const std::string &oct)
{
        char *p[]={"000","001","010","011","100","101","110","111"};
        std::string bin;
        for( unsigned i = 0 ; i < oct.size() ; ++i)
        {
                if( oct >= '0' && oct <= '7' )
                {
                        bin += p-'0'];    // 使用查表法. 這只有在8進位轉2 進位才能用(or 16 轉2 也能用, 8 近位的一個位數其實就是3 個bit . 所以. 可以這樣子寫
                }
                else break; // 不是 8 進位數字不轉了
        }
        return bin;
}


int main(int argc, char* argv[])
{
        std::string oct=OctSToBinS("12345670");
        std::cout << oct << std::endl;
        return 0;
}
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

trtc008056 發表於 2011-8-24 10:46 PM

回復 4# iseeyou


比較少在用C++

不知道string可以和char*一起用

如果是我的話可能會用strcat把他們接起來~~<br><br><br><br><br><div></div>

kenttw 發表於 2011-8-25 01:09 AM

回復 1# ezschool6307

eyny 不給我貼原始碼

這個給你參考:
http://chopapp.com/#rc48lafb

----

ezschool6307 發表於 2011-8-25 11:34 AM

OK!! 謝謝各位大大的熱烈回應~

真的受益良多  ^^

原來...論壇中好多高中群集呢(佩服)

小弟會嘗試把這些建議的修改部分

融入在自己的程式裡 3Q

qitar888 發表於 2011-9-27 07:27 PM

八進位轉二進位的方法就是建表直接作轉換就行了

0→000
1→001

7→111

而二進位轉十進位的方法就是直接用乘的
頁: [1]