题目:

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", , false, (int)Enum_GoodType.Book, 12.49m));
goods.Add(new Goods("music CD", , false, (int)Enum_GoodType.Other, 14.99m));
goods.Add(new Goods("chocolcate bar", , false, (int)Enum_GoodType.Food, 0.85m));
return GetTestResult(goods);
} public TestCaseResult GetResultForCasee2()
{
List<Goods> goods = new List<Goods>(); //第二批物品
goods.Add(new Goods("book", , true, (int)Enum_GoodType.Book, 10.0m));
goods.Add(new Goods("perfume", , true, (int)Enum_GoodType.Other, 47.5m));
return GetTestResult(goods);
} public TestCaseResult GetResultForCasee3()
{
List<Goods> goods = new List<Goods>(); //第三批物品
goods.Add(new Goods("perfume", , true, (int)Enum_GoodType.Other, 27.99m));
goods.Add(new Goods("perfume", , false, (int)Enum_GoodType.Other, 18.99m));
goods.Add(new Goods("headache pills", , false, (int)Enum_GoodType.Drug, 9.75m));
goods.Add(new Goods("chocolates", , 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 = ; //总价不含税
decimal totalGoodsByTax = ; //总价含税
for (int i = ; 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 = ;
if (null != goods)
{
if (goods.Import)
{ //进口物品,添加附加税
decimal appTax = goods.Price * goods.Count * ImportSurtax;
result += GetMathResult(appTax);
}
if (goods.GoodsType == )
{//不是书籍、食品、药品 需要征收基础税,上面也可以写成(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(".") != -)
{ //rounded up to the nearest 0.05
tax = Math.Round(tax, , MidpointRounding.AwayFromZero);
}
return tax;
} } /// <summary>
/// 商品类型
/// 备注:书籍、食品、药品 可分为一个枚举就是免基本税的,这样细分,考虑后期扩展
/// </summary>
enum Enum_GoodType
{
Book = , //书籍
Food = , //食品
Drug = , //药品
Other = //其他
} }

分析:

这道题考察的点有两个,一个是对业务的理解能力;二是编码能力的考量,封装继承以及写代码功底如何;

编码能力每个人有不同的风格和书写方式,尽量遵循代码设计模式轻耦合,模块化是最好的,而这道题的业务中有一个核心点,就是对税收不能被0.05整除要四舍五入到小数点后一位x.x,详见代码。

经典面试题SALES TAXES思路分析和源码分享的更多相关文章

  1. Spring源码解析02:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  2. Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  3. 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!

    目录 目录 string基础 Java String 类 创建字符串 StringDemo.java 文件代码: String基本用法 创建String对象的常用方法 String中常用的方法,用法如 ...

  4. Python经典算法-猴子吃桃-思路分析

    问题: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天 ...

  5. [原创]Android Studio的Instant Run(即时安装)原理分析和源码浅析

    Android Studio升级到2.0之后,新增了Instant Run功能,该功能可以热替换apk中的部分代码,大幅提高测试安装的效率. 但是,由于我的项目中自定义了一些ClassLoader,当 ...

  6. tomcat架构分析和源码解读

    最近在看<深入分析java web技术内幕>,书中讲解了一部分tomcat的相关知识,我也去查看了一些源码,看了大神们写的代码,我才知道自己就像在做加减乘除一样,这是不行的.还有好多包和类 ...

  7. Kinect v2控制鼠标原理分析和源码

    https://blog.csdn.net/baolinq/article/details/54381284 此程序为利用Kinect v2实现用手指隔空控制鼠标,是我另一个项目的一部分,因为在另外那 ...

  8. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  9. 李洪强iOS经典面试题142-第三方框架及其管理

    李洪强iOS经典面试题142-第三方框架及其管理   第三方框架及其管理 使用过CocoaPods吗?它是什么?CocoaPods的原理? CocoaPod是一个第三方库的管理工具,用来管理项目中的第 ...

随机推荐

  1. mysql sql_mode=only_full_group_by错误解析

    实测,解决问题; 1.错误提示: 2.检查参数设置: 3.mysql的配置文件my.cnf里面可以修改, 但是,改完以后,你检查所有的参数设置都是对的,就是运行不了.怎么办?怎么办? 4.如果还是不行 ...

  2. HOOK NTFS 禁止格式化

    if(bHooked == FALSE) { RtlInitUnicodeString (&HookDriverName, L"\\FileSystem\\Ntfs"); ...

  3. jdbc随笔

    通过jdbc连接数据库的基本步骤:  导入jar包驱动类  jdbc语法:jdbc:子协议:厂商内容  对于mysql而言:jdbc:mysql://主机地址:端口号/库名               ...

  4. springboot 使用maven 打包 报 (请使用 -source 7 或更高版本以启用 diamond 运算符) 错误解决办法

    在使用springboot maven 打包时 报如下错误 (请使用 -source 7 或更高版本以启用 diamond 运算符) pom.xml编译插件 配置如下: <plugin> ...

  5. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十六之铭文升级版

    铭文一级: linux crontab 网站:http://tool.lu/crontab 每一分钟执行一次的crontab表达式: */1 * * * * crontab -e */1 * * * ...

  6. css概括2

    Css内容: 常用样式:字体.颜色.背景... 字体:大小.颜色.粗细.字体 Text-decoration:文本修饰{overline 上 Underline 下 Line-throung 中} T ...

  7. Alpha冲刺 - (5/10)

    Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 过去两天完成了哪些任务 基于ssm框架的前后端交互测试,结合微信小程序demo 展 ...

  8. 使用pwm进行呼吸灯的设计

    本文源码已经上传至csdn: 程序源码如下; #define LEDC_IO_0 (2) esp_err_t app_main() { ledc_timer_config_t ledc_timer = ...

  9. @WebFilter怎么控制多个filter的执行顺序

    转自:http://blog.csdn.net/liming_0820/article/details/53332070 之前我们控制多个filter的执行顺序是通过web.xml中控制filter的 ...

  10. liunx 安装jdk

    1 下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2 切换root ...