题目:
SALES TAXES Basic sales tax is applicable at a rate of 10% on all goods, except books, food, and medical products that are exempt. Import duty is an additional sales tax 除书籍 食品 药品外其他商品基本税为10%。进口税附加5%,不免税。 applicable on all imported goods at a rate of 5%, with no exemptions. When I purchase items, I receive a receipt which lists the name of all the items and their price (including tax), finishing with the total cost of the items, and the total amounts of sales taxes paid. The rounding rules for sales tax are that for a tax rate of n%, a shelf price of p contains (np/100 rounded up to the nearest 0.05, exp:7.125 -> 7.15; 6.66 -> 6.7) amount of sales tax. Write an application that prints out the receipt details for these shopping baskets... INPUT: Input 1: 1 book at 12.49 1 music CD at 14.99 1 chocolcate bar at 0.85 Input 2: 1 imported box of chocolates at 10.00 1 imported bottle of perfume at 47.50 Input 3: 1 imported bottle of perfume at 27.99 1 bottle of perfume at 18.99 1 packet of headache pills at 9.75 1 box of imported chocolates at 11.25 OUTPUT Output 1: 1 book : 12.49 1 music CD: 16.49 1 chocolate bar: 0.85 Sales Taxes: 1.50 Total: 29.83 Output 2: 1 imported box of chocolates: 10.50 1 imported bottle of perfume: 54.65 Sales Taxes: 7.65 Total: 65.15 Output 3: 1 imported bottle of perfume: 32.19 1 bottle of perfume: 20.89 1 packet of headache pills: 9.75 1 imported box of chocolates: 11.85 Sales Taxes: 6.70 Total: 74.68
C#实现代码如下:
using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace SalesTaxes { public class TestCaseResult { public decimal Taxes { get; set; } //税合计 public decimal TotalPrice { get; set; } //总计含税 public TestCaseResult(decimal Taxes, decimal TotalPrice) { this.Taxes = Taxes; this.TotalPrice = TotalPrice; } } public class Test { //Test case1 public TestCaseResult GetResultForCasee1() { List<Goods> goods = new List<Goods>(); //第一批物品 goods.Add(new Goods("book", 1, false, (int)Enum_GoodType.Book, 12.49m)); goods.Add(new Goods("music CD", 1, false, (int)Enum_GoodType.Other, 14.99m)); goods.Add(new Goods("chocolcate bar", 1, false, (int)Enum_GoodType.Food, 0.85m)); return GetTestResult(goods); } public TestCaseResult GetResultForCasee2() { List<Goods> goods = new List<Goods>(); //第二批物品 goods.Add(new Goods("book", 1, true, (int)Enum_GoodType.Book, 10.0m)); goods.Add(new Goods("perfume", 1, true, (int)Enum_GoodType.Other, 47.5m)); return GetTestResult(goods); } public TestCaseResult GetResultForCasee3() { List<Goods> goods = new List<Goods>(); //第三批物品 goods.Add(new Goods("perfume", 1, true, (int)Enum_GoodType.Other, 27.99m)); goods.Add(new Goods("perfume", 1, false, (int)Enum_GoodType.Other, 18.99m)); goods.Add(new Goods("headache pills", 1, false, (int)Enum_GoodType.Drug, 9.75m)); goods.Add(new Goods("chocolates", 1, true, (int)Enum_GoodType.Food, 11.25m)); return GetTestResult(goods); } /// <summary> /// 获取测试结果 /// </summary> /// <param name="goods"></param> /// <returns></returns> private TestCaseResult GetTestResult(List<Goods> goods) { decimal totalGoods = 0; //总价不含税 decimal totalGoodsByTax = 0; //总价含税 for (int i = 0; i < goods.Count; i++) { totalGoods += goods[i].Price * goods[i].Count; totalGoodsByTax += Goods.GetGoodsPriceByTax(goods[i]); } return new TestCaseResult(totalGoodsByTax - totalGoods, totalGoodsByTax); } } class Program { static void Main(string[] args) { //Test case 1 var test = new Test(); var result = test.GetResultForCasee1(); Assert.AreEqual(1.50m, result.Taxes); Assert.AreEqual(29.83m, result.TotalPrice); //Test case 2 result = test.GetResultForCasee2(); Assert.AreEqual(7.65m, result.Taxes); Assert.AreEqual(65.15m, result.TotalPrice); //Test case 3 result = test.GetResultForCasee3(); Assert.AreEqual(6.70m, result.Taxes); Assert.AreEqual(74.68m, result.TotalPrice); } } /// <summary> /// 商品名称 /// </summary> class Goods { /// <summary> /// 构造函数,初始化商品名称 /// </summary> public Goods(string Name, int Count, bool Import, int GoodsType, decimal Price) { this.Name = Name; this.Count = Count; this.Import = Import; this.GoodsType = GoodsType; this.Price = Price; } /// <summary> /// 商品名称 /// </summary> public string Name { set; get; } /// <summary> /// 商品数量 /// </summary> public int Count { set; get; } /// <summary> /// 是否进口(true=>进口) /// </summary> public bool Import { set; get; } /// <summary> /// 商品类型 对应枚举 Enum_GoodType /// </summary> public int GoodsType { set; get; } /// <summary> /// 单价 /// </summary> public decimal Price { set; get; } /// <summary> /// 基本税 /// </summary> const decimal BasicDuty = 0.1m; /// <summary> /// 进口附加税 /// </summary> const decimal ImportSurtax = 0.05m; /// <summary> /// 计算商品的价格 /// </summary> /// <param name="goods">商品</param> /// <returns>商品最终价格</returns> public static decimal GetGoodsPriceByTax(Goods goods) { decimal result = 0; if (null != goods) { if (goods.Import) { //进口物品,添加附加税 decimal appTax = goods.Price * goods.Count * ImportSurtax; result += GetMathResult(appTax); } if (goods.GoodsType == 4) {//不是书籍、食品、药品 需要征收基础税,上面也可以写成(goods.GoodsType==(int)Enum_GoodType.Book ||...) decimal baseTax = goods.Price * goods.Count * BasicDuty; result += GetMathResult(baseTax); } result += goods.Price * goods.Count; } return result; } /// <summary> /// 计算0.05舍弃值,核心代码 /// </summary> /// <returns></returns> private static decimal GetMathResult(decimal tax) { if ((tax / 0.05m).ToString().IndexOf(".") != -1) { //rounded up to the nearest 0.05 tax = Math.Round(tax, 1, MidpointRounding.AwayFromZero); } return tax; } } /// <summary> /// 商品类型 /// 备注:书籍、食品、药品 可分为一个枚举就是免基本税的,这样细分,考虑后期扩展 /// </summary> enum Enum_GoodType { Book = 1, //书籍 Food = 2, //食品 Drug = 3, //药品 Other = 4 //其他 } }
分析:
这道题考察的点有两个,一个是对业务的理解能力;二是编码能力的考量,封装继承以及写代码功底如何;
编码能力每个人有不同的风格和书写方式,尽量遵循代码设计模式轻耦合,模块化是最好的,而这道题的业务中有一个核心点,就是对税收不能被0.05整除要四舍五入到小数点后一位x.x,详见代码。