2013-08-01 20 views
1

好吧,所以班級在一個月前下課,秋季學期在三週後開始備份。我想在書中做我們從未分配過的作業。這一個問題讓我陷入困境,因爲它在第二章。它是一個給變回的程序(92美分是編譯時初始化)。 我的問題是...有沒有什麼辦法讓這個程序更加「虛僞」,而不是它。 而且我不得不把(int)放在我分配什麼anQuarter,anDime等的前面。否則,我以後會得到小數。這是爲什麼?有經驗的程序員能解釋一下嗎?如何使更換計算器更簡單

另外,本章講述了MOD,所以這就是我使用它的原因。這是在調用類方法之前,顯然在循環和數組之前。所以我不能使用任何這些工具。應該只是一個很基本的「洞穴人」計劃......

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication273 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     double change = 0.92; 

     double quarter = 0.25; 
     double dime = 0.10; 
     double nickel = 0.05; 
     double pennies = 0.01; 

     double anQuarter = (int)(change/quarter); 
     double anDime = (int)((change % quarter)/dime); 
     double anNickel = (int)(((change % quarter) % dime)/nickel); 
     double anPennies = (int)((((change % quarter) % dime) % nickel)/pennies); 

     Console.WriteLine("The amount of quarters are....{0}", anQuarter); 
     Console.WriteLine("The amount of dimes are....{0}", anDime); 
     Console.WriteLine("The amount of nickels are....{0}", anNickel); 
     Console.WriteLine("The amount of pennies are....{0}", anPennies); 
     } 
    } 
} 
+0

你的問題到底是什麼?這看起來像是很簡單的。 –

+1

嘗試使用小數而不是double,因爲準確性很重要。 – LarsTech

+3

在'codereview.stackexchange.com'上詢問這類問題。 –

回答

6

至少,聘請十進制:Difference between decimal, float and double in .NET?

然後去除重複代碼:看到它住在http://ideone.com/ZY9qBm

using System; 

class Program 
{ 
    static void Main() 
    { 
     decimal change = 0.92m; 

     var coins = new [] { // ordered 
      new { name = "quarter", nominal = 0.25m }, 
      new { name = "dime", nominal  = 0.10m }, 
      new { name = "nickel", nominal = 0.05m }, 
      new { name = "pennies", nominal = 0.01m } 
     }; 

     foreach (var coin in coins) 
     { 
      int count = (int) (change/coin.nominal); 
      change -= count * coin.nominal; 

      Console.WriteLine("{0} {1}", count, coin.name); 
     } 
    } 
} 

打印

3 quarter 
1 dime 
1 nickel 
2 pennies 
+0

重寫硬幣分佈以擺脫代碼重複。爲了獲得樂趣,請參閱http://stackoverflow.com/questions/15532840/any-better-way-to-implement-this/15534025#15534025 – sehe

+1

對於匿名結構。我從來沒有想過以這種方式使用它們。 – Steve

1

的一點想法...

我建議decimaldouble - 與decimal,你會得到準確的十進制表示,通常你想用錢是什麼。使用double(或float),您會得到二進制表示,這並不總是相等的。

當你分割時得到小數的原因是double除以double會給你一個C#中的double。如果你想得到int,你必須像你一樣截斷它,或者首先從int開始。一個int除以int會得到一個int

爲了使整個事情更簡單的,你可以把一切作爲美分整數,如:

int change = 92; 

int quarter = 25; 
int dime = 10; 
int nickel = 5; 
int pennies = 1; 

int anQuarter = change/quarter; 
int anDime = ((change % quarter)/dime); 
int anNickel = (((change % quarter) % dime)/nickel); 
int anPennies = ((((change % quarter) % dime) % nickel)/pennies); 

爲了增強可讀性,雖然,你可以做許多不同的方式。其中一種方式(可能不是最好的方法)就是繼續減少所欠的金額,直到達到零。

int anQuarter = 0, anDime = 0, anNickel = 0, anPennies = 0; 
while (change >= 25) 
{ 
    anQuarter++; 
    change -= 25; 
} 
while (change >= 10) 
{ 
    anDime++; 
    change -= 10; 
} 
while (change >= 5) 
{ 
    anNickel++; 
    change -= 5; 
} 
while (change >= 1) 
{ 
    anPennies++; 
    change -= 1; 
} 
2

同時,我不得不把(INT)在我的什麼anQuarter,anDime等人分配的面前。否則,我以後會得到小數。這是爲什麼?經驗豐富的程序員可以解釋:

(int)將表達式中的值轉換爲整數類型。像這樣使用類型轉換是從一種數據類型轉換爲另一種數據類型的有用方法。在這種情況下,您的計算結果爲double數據類型。將其轉換爲int是敲除所有小數位而不捨入的最簡單方法。

+0

這很有道理。我現在明白了。 – Zoro