2017-09-28 70 views
1

我正在用C編寫一個非常基本的程序(對C來說是新東西,所以只需要掌握一些東西),而且我正在爲TypeCasting而努力。爲什麼我需要在此處指定所有值?

這是一個簡單的計算程序,它允許你輸入兩個數字並決定你想要對它們做什麼(加,減,除,乘)。顯然,並非所有的數字都可以被所有其他數字整除,所以在我的switch語句中,我試圖將int轉換爲float。

按照要求,我的變量聲明在這裏:

int inputOne, inputTwo, calculatedValue = 0; 
char calcType; 
char restart = 'n'; 

我知道了通過使所有類型強制轉換值的工作,但這裏是我嘗試之前:

 case 'd': case 'D': 
     calculatedValue = inputOne/inputTwo; 
     printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", (float)calculatedValue); 
     printf("\nPlease note: This is only accurate to two decimal places."); 
     break; 

這隻返回4沒有任何小數位。然後我想也許這是由於計算仍處於INT,所以我改成了這樣:

 case 'd': case 'D': 
     (float)calculatedValue = inputOne/inputTwo; 
     printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", (float)calculatedValue); 
     printf("\nPlease note: This is only accurate to two decimal places."); 
     break; 

但這只是回報1082130432.00。不知道這個數字來自哪裏。

我周圍有使用這樣的:

 case 'd': case 'D': 
     printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", (float)calculatedValue = (float)inputOne/(float)inputTwo); 
     printf("\nPlease note: This is only accurate to two decimal places."); 
     break; 

因爲它是在一個switch語句,我可以只使用一個浮動的,而不是用原來的整數傳開,但我已經做了這個代碼試着更好地理解類型轉換,並且在不需要對所有東西進行類型轉換的情況下都能夠工作。任何人都可以照耀一些光明?我的講師在printf中使用了類型轉換,它工作得很好。在他的榜樣,他試圖尋找學生的平均年齡,他這樣做是這樣的:

printf("\nAverage age: %1.2f", (cAge1 + cAge2 + cAge3)/(float)cNumStudents); 

希望這有意義,因爲它是一個簡單的問題這麼久對不起,我只是想了解爲什麼我不得不強調一切(因爲我的講師說你只需要做到一個價值)。

乾杯

編輯:

我只是嘗試以下,但它返回0.00,而不是答案。

calculatedValue = (float)inputOne/inputTwo; 
     printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", calculatedValue); 
     printf("\nPlease note: This is only accurate to two decimal places."); 
     break; 
+0

不是答案,但請注意'(float)something = something' [在標準C中無效](http://coliru.stacked-crooked.com/a/e99279b49f399697)。 – HolyBlackCat

+0

您的變量的聲明丟失。請出示[MCVE]。你確定'inputOne'和'inputTwo'包含你期望的值嗎? –

+0

答案完全取決於'inputOne'和'inputTwo'是如何聲明的。他們是「int」還是「double」,或者是什麼? –

回答

1
int inputOne, inputTwo; 
calculatedValue = (float)inputOne/inputTwo; 

需要演員 - 有替代品,但它是使用以確保分工與計算浮點運算,而不是整數運算。

然而,這只是需要審查的一個步驟:calculatedValue的類型是什麼?如果這也是int,那麼float商被轉換回int。然後FP部門沒有使用。

int calculatedValue = (float)inputOne/inputTwo; // poor code 

而是使用一個浮點(FP)型

float calculatedValue = (float)inputOne/inputTwo; // better 

由於calculatedValue,作爲float,被轉換爲double進行打印,可以考慮使用double數學用於所有典型FP操作並保留float空間/速度的選擇用途。

double calculatedValue = (double)inputOne/inputTwo; // better yet 
printf("%.2f", calculatedValue); 

一般情況下,避免鑄造。它傾向於隱藏問題。替代方案:

double calculatedValue = 1.0 * inputOne/inputTwo; 
// or 
double calculatedValue = inputOne; 
calculatedValue /= inputTwo; 

注意在%1.2f"1無濟於事。 1是打印號碼的指定最小寬度,並且一個數字總是打印出至少1個字符。由於".2"部分的原因,%1.2f"將始終打印出至少4個字符。 考慮%.2f"

+0

完美,很棒的答案謝謝。 calvulatedValue,inputOne和inputTwo都被聲明爲int。你能解釋一下爲什麼下面這些工作可行嗎?這是因爲它將int轉換爲float還是操作數? printf(「%s%d%s%d%s%1.2f」,「value的值」,inputOne,「除以」,inputTwo,「等於」,(float)calculatedValue =(float)inputOne /(浮動)inputTwo); –

+0

@MitchellWelch'(float)calculatedValue = ...'中的'(float)calculatedValue'不是有效的C代碼。也許你正在使用一些帶有語言擴展或者另一種語言的C編譯器(C++?IDK) – chux

+0

@MitchellWelch請注意,當我們到達答案的結尾時,chux假設'caluclatedValue'是一個'float'或一個'double'。如果'calculatedValue'是一個'int',這個解決方案將* not *工作。 –

2

您的問題是分部本身。

劃分兩個int s產生另一個int。由於它是int,因此不可能有小數。

鑄造intfloat不能神奇地重新引入它從來沒有的小數。

您需要將操作數中的任意一個操作到float,以便該部門本身不生成int。你不需要任何其他演員。

+1

他們還需要確保'calculateValue'實際上被聲明爲float或double。 – zwol

+0

嗨。我只是將更改後的代碼添加到原始帖子中,但它不起作用。這是因爲calculateValue被設置爲int嗎?試圖瞭解如何在這種情況下正確使用類型轉換。 –

+0

@MitchellWelch如果'calculatedValue'被聲明爲'int',那麼你永遠不會得到浮點結果。你真的需要告訴我們你的變量是如何聲明的;它使所有的差異。 –

1

您必須決定是否爲整數值或浮點值編寫計算器。

如果您正在爲整數值編寫計算器,則不需要任何強制轉換。當你寫

calculatedValue = inputOne/inputTwo; 

你會得到一個整數結果,其餘部分被丟棄,但這是適合整數計算器的結果。

如果你想爲浮點值計算器,你最好的賭注將是申報inputOneinputTwocalculatedResult所有爲double。在這種情況下,你仍然不需要任何類型轉換,因爲現在,當你寫

calculatedValue = inputOne/inputTwo; 

你會得到浮點除法和浮點結果。

正如其他人所解釋的,如果出於某種原因,你有inputOneinputTwo爲整數,但你想有一個浮點結果,你將不得不宣佈calculatedResultdouble,寫

calculatedResult = (doiuble)inputOne/inputTwo; 

你」 ve也詢問了關於該行

printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", (float)calculatedValue = (float)inputOne/(float)inputTwo); 

並聲稱它以某種方式工作。但這不是C,所以我們不能解釋它。 (是什麼編譯您使用?)在C語言中,表達

(float)calculatedValue = (float)inputOne/(float)inputTwo 

是非法的,因爲左側

(float)calculatedValue 

是一個右值,並且是不可轉讓。

+0

嗯,可能是這種情況(如果我使用了錯誤的編譯器,從字面上使用大學告訴我使用的那個編譯器,可能會感到困惑)。我的編譯器是安裝了C++東西的Visual Studio Basic,但我們將文件重命名爲.c而不是.cpp。也許這是我的困惑? –

+0

我剛剛注意到你說這是一個右值,這意味着它不可賦值......但它是可賦值的,因爲我可以給它賦值。如果我將它的聲明更改爲float而不是int,那麼這可以在沒有類型轉換的情況下進行賦值。 –

+0

@MitchellWelch我告訴你它不能在C **中分配**。說它是可分配的,因爲你可以分配它,就像說你可以從加油站偷錢,因爲你曾嘗試過一次並逃脫了它。你的編譯器有擴展(他們都這樣做),這意味着它編譯Visual Studio sorta-C,而不是標準的,可移植的C.如果你想用C解決你的問題,我們可以幫助你。如果你想繼續使用'(float)calculatedValue = something',或者理解它是如何工作的,我們不能。 –

0

你的程序有問題部分歸結爲:

int inputOne = 10, inputTwo = 3, calculatedValue; 
calculatedValue = inputOne/inputTwo; 

calculatedValueint,因此不能有小數部分。所以這裏calculatedValue包含3之後的分割。

現在,如果你有printf("%f", (float)calculatedValue)打印你會得到3.000000的輸出,因爲(float)投只會在calculatedValue轉換的整數值(= 3)到float(= 3.0)。

在奧得河,以獲得期望的結果你可能想這樣做:

int inputOne = 10, inputTwo = 3; 
float calculatedValue; 
calculatedValue = inputOne/inputTwo; 

但同樣calculatedValue將包含3.0,而不是預期的3.33333。 現在,這裏的問題是,表達inputOne/inputTwoint其值爲3(記住,無論inputOneinputTwoint S),所以基本上你還是分配int!值3float變量calculatedValue

爲了得到預期的結果,你可以這樣做:

float inputOne = 10, float = 3; 
float calculatedValue; 
calculatedValue = inputOne/inputTwo; 

所有變量是float類型,則expresion inputOne/inputTwo將是一個floatcalculatedValue最終將包含3.33333。

int inputOne = 10, float = 3; 
float calculatedValue; 
calculatedValue = (float)inputOne/inputTwo; 

這裏表達(float)inputOne/inputTwo是float類型(我們通過int劃分float),並再次yo'ill得到預期的結果。

相關問題