2013-10-27 367 views
0

當我輸入像3,000,000,000(無逗號)的大數字時,我得不到正確的結果。無論輸入的數字多大,顯示的數字都不會超過9位。C數據類型混淆

的問題如下:

執行以下計算,其中該系統只接受來自03x109(即3,000,000,000)正整數,並且示出了結果作爲輸出VDU:y = 3x2 - 2x + 6

如果數字是整數或在範圍內,則不需要檢查算法。我們將假定它始終正確輸入。但是,您必須嘗試使用​​正確的數據類型進行編碼。請書檢查數據類型使用正整數,這將是dened範圍

這裏是內部代碼

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    unsigned x=0, y=0; 

    printf("Enter a positive number between 0 to 300000000\n"); 
    scanf("%u",&x); 

    y=(3*x*x)-(2*x)+6; 

    printf("\n\nThe value of y is %u",y); 

    return 0; 
} 
+0

歡迎來到Stack Overflow!如果你自己解決問題並[描述你所嘗試的](http://whathaveyoutried.com),我們更有可能幫助你。檢查堆棧溢出[問題清單](http://meta.stackexchange。com/questions/156810/stack-overflow-question-checklist)瞭解更多關於提出正確問題的信息。祝你好運,快樂的編碼! –

+1

「VDU輸出」...快速加密問題:你能檢查你的課本是在哪一年打印的嗎? – usr2564301

回答

0

x不能取值-10。正如您的問題所述,您不需要檢查該值,因爲假定始終正確輸入。通過使用-10,你擊敗了這個假設。只在你的支票中使用正數。

編輯:另外,通過使用unsigned您意味着unsigned int。如果您使用的c-int是32位int,而不是16位int,則最大數量只能適合int。

EDIT2:除了在scanf函數中不得不使用%u,還需要使用給定的格式輸出。那就是你需要在屏幕上將你的計算線想象成

給出的信息應該已經足以讓你找出答案。這是一項任務,你應該自己做點什麼,對吧?

+0

for unsigned我是否必須在scanf中使用%u?以及如何獲得vdu輸出?最後一個問題是否有任何特定的平方函數(對於x * x) –

+0

@Ochin Ochin數學庫中有sqrt函數,如果你被允許使用它。我很肯定你會閱讀使用%u。 – ThunderGr

1

您在使用scanf/printf的錯誤格式代碼。 %d是一個有符號整數。使用%u作爲無符號整數。

發生了什麼事是scanf%d正在讀取用戶輸入作爲一個有符號的整數,並將掃描負數。 scanf不會檢查您傳入的變量的數據類型,因此它會存儲在無符號變量中 - 但由於該變量未經簽名,因此不會存儲爲-10。相反,它將是一個非常大的正數,因爲如何存儲負數(Two's complement)。

正確的輸入偏差需要一些工作,這就是爲什麼您的指示說要忽略它。

+0

認爲你是對的;) –

+0

我如何得到vdu輸出?最後一個問題是有任何特定的平方函數(對於x * x) –

+1

即使使用%u也不會糾正這個問題。返回值很可能超出範圍,因爲負數將轉換爲二進制補碼。 – ThunderGr

0

因爲值大於最大值。因此,如果輸入的值超出了整數範圍,那麼它將會翻轉,這就是爲什麼你沒有得到正確的值。 因此,如果你想避免這個問題,比你必須使用長整數長,你會得到正確的值