一步一步分解吧....

1.
  while(c[i]!='.')//跑到c[i]='.'的時候跳出while迴圈 
  {
    a[j]=c[i];//把小數點前面的數字放到另一個陣列a[j] 
    i++;
   }


你這裡是想要把整數的部分提出來,
你少做了一件事:j沒有跟著++
所以你的a陣列資料就錯了
 
 
2.
    for(j=i;j>=0;j--)//減到等於0為止還有(i-1)才會剛好在小數點前面 
    {
   x+=(a[j]-0x30)*pow(2,n);//用反向的陣列乘2的n次方 
   n++;
    } 

例如我輸入的是10.01
跑完第一個部分,你的i=2,
而a[2]應該是沒有東西的,所以j的起始應該是i-1
 

 3. 

    for(i=i+1;i<=num;i++)//加到num為止還有(i+1)才會在小數點後一位 
    {
    b[z]=c[i];//小數點後面的數字放到陣列b[z] 
    }

和前面的while迴圈一樣,你少了一個z++
 
 
(p.s.  程式到這裡結束,現在的i = num, q = 0,於是你的下一段code只能說是...  全滅)。

 4. 

    for(z=i;z>q;z--)//要減到大於上面while迴圈裡的q就可以了,剛好在小數點後的一個數字 
    {
   m=z-num;//m等於用z減掉全部總共幾個字元 
   y+=(b[z]-0x30)*pow(2,m);//剛好反向陣列來做可以用來乘上2的m次方,m會是負的 
    }

 

先弄清楚一件事情,
例如輸入10.01,其中小數的部分,我們要的是
0 x pow(2,-1) + 1 x pow(2,-2)
而 b[]裡面目前是 "b[0]='0'   b[1]='1'
 
所以你這段應該全部重練
 for(i=0; i     {
     y+=(b[i]-0x30)/pow(2,i+1);
    }z是上一步驟留下來的小數位數目,表示陣列b的長度
 
 ---

到目前為止,對於輸入之中有包含小數點的部分,應該已經全對了,但還是有些問題,至少我看到下面這兩點
 
1.如果我輸入的是一個沒有小數點的整數,這個程式會爆炸。
2. 如果我輸入的是123.456,你的程式也不會印出error

這些部分就慢慢吸收慢慢加油吧,祝你學習程式愉快  :)

※補充,如果想檢查自己程式怎麼死的,可以善用printf,
ex:

for(j=i-1;j>=0;j--)
    {
     x+=(a[j]-0x30)*pow(2,n);/
     n++;
     printf("n=%d, x=%lf\n",n,x);
    }  可以藉由列印變數值,來發現邏輯的錯誤在哪裡



-----------------------------------------以上文章引用自奇摩知識+圖文為原所有人版權所有!如有任何問題請告知站長處理!-------------------------------------------------


語言學習機訂購網站:http://digiwis.shop.conn.tw/list.html?member=af000017132
arrow
arrow
    全站熱搜

    王嘉鴻 發表在 痞客邦 留言(0) 人氣()