2016-02-12 83 views
0

我想獲取用戶輸入,將其存儲在數字數組中,然後獲取數字的美元和美分部分,將它們存儲在單獨的數組中,然後打印格式化的數字。使用單獨的陣列美元和美分印刷美元金額

這是我的代碼:

#include <stdio.h> 

int main() 
{ 
    int i; 
    float amounts[5]; 

printf("Enter numbers as dollar amounts: \n"); 

for(i=0; i<5; i++) { 
    printf("Value %d: ", i+1); 
    scanf("%f", &amounts[i]); 
} 

long dollars[5]; 
long cents[5]; 

for (i=0; i<5; i++) { 
    dollars[i]=(int)amounts[i]; 
    cents[i]=(amounts[i]-dollars[i]); 
    cents[i]*=100; 
} 

for (i=0; i<5; i++) { 
    printf("\n$%ld.", dollars[i]); 
    printf("%ld", cents[i]); 
} 

return 0; 
} 

我,我怎麼可能拿分,並將它們存儲在一個數組作爲一項長期的類型有點不確定。在執行程序時,我得到正確的美元,但美分部分始終爲0.任何建議?

編輯:

所以我試圖通過這樣做是爲了解決一些問題:

#include <stdio.h> 

int main() 
{ 
int i, j; 
float amounts[5]; 

printf("Enter numbers as dollar amounts: \n"); 

for(i=0; i<5; i++) { 
    printf("Value %d: ", i+1); 
    scanf("%f", &amounts[i]); 
} 

long dollars[5]; 
long cents[5]; 
double decimal[5]; 

for (i=0; i<5; i++) { 
    dollars[i]=trunc(amounts[i]); 
} 

for (i=0; i<5; i++) { 
    printf("\n$%ld.", dollars[i]); 

    decimal[i]=100*(amounts[i]-dollars[i]); 
    cents[i]=(int)decimal[i]; 

    if(cents[i]<10) 
     printf("0%ld", cents[i]); 
    else 
     printf("%ld", cents[i]); 
} 

return 0; 
} 

不過,現在我得到的一切,對於美分[I]輸出小於10 1比它應該少。所以3.06打印爲3.05美元。某些原因,3.12也是如此。另外,對於我正在使用什麼變量類型的一些批評,這是針對一個任務,它決定了要使用哪些類型。

4編寫一個程序,它將從鍵盤讀取五個值(使用一個循環)並將它們存儲在名稱數量爲float的數組中。創建名稱爲美元和美分的兩個long類型數組的兩個數組。將金額數組中的每個值的整數部分存儲在美元的相應元素中,並將金額的小數部分存儲爲以美分爲單位的兩位數整數(例如,2.75的金額[1]將導致2以美元存儲[1]和75以美分[1]存儲)。輸出型的兩列中的值,只要貨幣量(例如,2.75 $)

+2

請不要使用浮點數的錢。將這個值存儲爲美分/便士等。 –

+2

既然'cents [i] =(amount [i] -dollars [i]);'嘗試將分數存儲在int中,則存儲的值將始終爲零。在同一行中進行乘法:'cents [i] = 100 *(金額[i] - 美元[i]);'。仍然存在問題:由於「浮動」類型的範圍有限,諸如1000000.03之類的數字可能仍然會給予美分爲0。另外,請注意,您的代碼會將'1.09'格式化爲'1.9' - 您也必須修復此問題。 –

+1

你做了一個從'long int'到'float'的轉換,然後你做回來了,真的嗎? – Michi

回答

3

你在這裏失去了小數部分:

cents[i]=(amounts[i]-dollars[i]); 
cents[i]*=100; 

兩者之間的差值小於1,因此將該值分配給int會導致它被截斷爲0。

您需要分配,以避免截斷之前乘以區別:

cents[i]=100*(amounts[i]-dollars[i]); 
1

for (i=0; i<5; i++) { dollars[i]=(int)amounts[i]; cents[i]=(amounts[i]-dollars[i]); cents[i]*=100; }

改用:

for (i=0; i<5; i++) { 
    dollars[i]=(int)amounts[i]; 
    double decimal = 100*(amounts[i]-dollars[i]); 
    cents[i]= (int)decimal; 
} 
+1

有一個';'失蹤......你發現了嗎? – Michi

+0

絕對應該使用舍入到最近的函數來避免截斷問題。 '分[i] =(長)圓(十進制);' – chux

0

OP的方法有問題

printf("\n$%ld.", dollars[i]); 
printf("%ld", cents[i]); 
  1. 負數amount[i] == -1.23出來像"$-1.-23"

  2. 價值觀像amount[i] == 9.998打印爲"$9.99"和可能的應該是"$10.00"

  3. 丟失的前導零amount[i] == 1.03打印爲"$1.3"@Jonathan Leffler

  4. dollars[i]=(int)amounts[i]amounts[i]int範圍之外時失敗。

  5. 爲OP

    // problem 
    dollars[i]=(int)amounts[i]; 
    cents[i]=(amounts[i]-dollars[i]); // cents[i] is an integer, cannot hold a fraction 
    cents[i]*=100; 
    
    // Alternative 
    
    // round 
    amount[i] = round(amount[i] * 100)/100.0; 
    
    // take apart; 
    float ipart; 
    cents[i] = (int) roundf(modff(amounts[i], &ipart)*100.0f); 
    dollars[i] = (int) ipart; 
    

的一個關鍵問題,如果代碼是使用FP要錢建議:

  1. 使用double

  2. 經過任何不準確的計算後,舍入到最接近的貨幣單位。在OP的情況下,這是1/100

    amount[i] = round(amount[i] * 100)/100.0; 
    
  3. 使用統一的打印

    printf("\n$%0.2f", amount[i]); 
    
0
#include <stdio.h> 
#include <math.h> 

int main() 
{ 
int i, j; 
float amounts[5]; 

printf("Enter numbers as dollar amounts: \n"); 

for(i=0; i<5; i++) { 
    printf("Value %d: ", i+1); 
    scanf("%f", &amounts[i]); 
} 

long dollars[5]; 
long cents[5]; 
float ipart; 

for (i=0; i<5; i++) { 
    cents[i] = (int) roundf(modff(amounts[i], &ipart)*100.0f); 
    dollars[i] = (int) ipart; 

    if(cents[i]==100){ 
     dollars[i]++; 
     cents[i]=0; 
    } 
} 

for (i=0; i<5; i++) { 
    printf("\n$%ld.", dollars[i]); 

    if(cents[i]<10) 
     printf("0%ld", cents[i]); 
    else 
     printf("%ld", cents[i]); 
} 

return 0; 
}