2013-08-01 2 views
1

Итак, классы прошли месяц назад, а семестр осени возобновится через 3 недели. Я хотел сделать домашнее задание в книге, которую мы никогда не назначали. Этот вопрос должен заставить меня застрять, потому что во второй главе. Его программа для изменения (92 центов - это инициализация времени компиляции). Мой вопрос: есть ли способ сделать эту программу более «заглушенной», чем она есть. А также мне пришлось поставить (int) перед моим назначением того, что aQuarter, 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

Попробуйте использовать десятичную, а не двойную, поскольку важна точность. – 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

+1 для анонимной структуры. Я никогда не думал использовать их таким образом. – Steve

1

Несколько мыслей ...

Я бы рекомендовал decimal над double - с decimal, вы получите точные десятичные представления, которые, как правило, то, что вы хотите с деньгами. С double (или float) вы получаете двоичные представления, которые не всегда равны.

Причина, по которой вы получаете десятичные знаки при делении, состоит в том, что double, деленная на double, даст вам double в C#. Если вы хотите получить int, вам нужно либо усечь его, как вы, либо начать с int s в первую очередь. A 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

Смежные вопросы