2013-03-21 28 views
0

我是一名C++程序員,想要掌握C語言的語法,並且我不明白爲什麼當我在此函數中使用指針時會得到垃圾值。當我在這個程序中使用指針時,爲什麼我會得到垃圾? C語言

#include<stdio.h> 
#include <math.h> 

void separate(double, double *dollar, double *quarter, double *dime, double *nickle, double *penny); 
int 
main(void) 
{ 
double amount = 38.39, change, paid = 40.0, dollar, quarter, dime, nickle, penny; 

change = paid - amount; 
separate(change, &dollar, &quarter, &dime, &nickle, &penny); 

printf("Your total change is: $%d\n", change); 
printf("Dollars: %d\n", dollar); 
printf("Quarters: %d\n", quarter); 
printf("Dimes: %d\n", dime); 
printf("Nickles: %d\n", nickle); 
printf("Pennies: %d\n", penny); 

getchar(); 
return (0); 
} 

void separate(double change, double *dollar, double *quarter, double *dime, double *nickle, double *penny) 
{ 
double coins; 
coins = change - floor(change); 
*dollar = floor(change); 
*quarter = coins/25; 
coins = coins - (*quarter * 25); 
*dime = coins/10; 
coins = coins - (*dime * 10); 
*nickle = coins/5; 
*penny = coins - (*nickle * 5); 
} 
+0

在所有變量中獲取垃圾或僅更改? – Skeen 2013-03-21 01:43:42

+0

什麼是「垃圾」,你期待什麼輸出? – 2013-03-21 01:45:41

+1

%d是整數的說明符。 – UncleO 2013-03-21 01:51:18

回答

1

我懷疑你的問題是你沒有正確地進行分割。

請看:

void separate(double change, double *dollar, double *quarter, double *dime, double *nickle, double *penny) 
{ 
    // for your example, change is initially 1.61 
    double coins; 
    coins = change - floor(change); // .61 
    *dollar = floor(change);   // 1 
    *quarter = coins/25;   // .0244 
    coins = coins - (*quarter * 25); // 0 
    *dime = coins/10;    // 0 
    coins = coins - (*dime * 10); // 0 
    *nickle = coins/5;    // 0 
    *penny = coins - (*nickle * 5); // 0 
} 

整數除法和浮點除法不相同的方式工作。你應該乘以100來得到分數,除以25得到宿舍的數量,然後把它作爲一個整數。

*quarters = floor(coins * (100/25)); // floor(2.44) = 2 
coins = coins - *quarters * 25;  // .11 

根據需要重複以獲取其他硬幣的數量。

而且,每個人都提到,您使用%d雙打打印,而不是%f%d是一個整數格式字符串),所以我會提到它太,因爲這是問題的一部分。

+0

另外,由於浮點精度問題,你遲早會遇到這個程序奇怪的行爲。幾乎普遍認爲使用貨幣的整數類型更安全,更容易。 – Wug 2013-03-21 01:57:12

2

您正在使用%d打印雙打!嘗試%f

printf("Your total change is: $%f\n", change); 
printf("Dollars: %f\n", dollar); 
printf("Quarters: %f\n", quarter); 
printf("Dimes: %f\n", dime); 
printf("Nickles: %f\n", nickle); 
printf("Pennies: %f\n", penny); 
1

確實。相當直觀,但%d在printf語句中爲整數。嘗試使用%f打印浮點數

我也建議你看看this

1

你試圖打印double變量與%dprintf那麼將採取雙倍的內存(或它的一部分)的整數變量的內存,因爲printf使用va_list作爲指向參數的指針,如果您指定了不適當的格式,參數點的類型也會出錯。

全部替換%d%f

相關問題