一步一步分解吧....
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
例如輸入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
全站熱搜
留言列表