完整源代码项目地址,关注博主私信'源代码'后可获取
1.问题描述 2.问题分析 3.算法设计 4.确定程序框架 5.完整的程序
1.问题描述
编写一个计算个人所得税的程序,要求输入收入金额后,能够输出应缴的个人所得税。个人所得税征收办法如下:
起征点为2000元。
·不超过500元的部分,征收5%。
·超过500~2000元的部分,征收10%。
·超过2000~5000元的部分,征收15%。
·超过5000~20000元的部分,征收20%。
·超过20000~40000元的部分,征收25%。
·超过40000~60000元的部分,征收30%。
·超过60000~80000元的部分,征收35%。
·超过80000~100000元的部分,征收40%。
·超过100000元以上的,征收45%。
2.问题分析
分析题目特点,我们可以考虑使用Python语言的列表和元组来描述题目中的条件。下面先讲解Python语言中列表和元组的语法要点。
(1)列表
列表是以方括号“[]”包围的数据集合,列表元素之间使用逗号“,”分割。列表的元素类型可以是任何数据类型,也可以包含另一个列表,可以通过列表的下标来访问列表中的元素,下标从0开始。列表的内容是可变的,定义一个列表如下:
list = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
其中list[0]=1,list[1]=2,以此类推。
使用for语句遍历这个列表如下:
for i in list :
print ( i, end= " " )
1 2 3 4 5 6 7 8 9
将会打印出:1 2 3 4 5 6 7 8 9。
下面是列表常用的操作方法。
·list.append(x):添加元素,将元素x添加到列表list的尾部。
·list.extend(aList):添加元素,将列表aList中的所有元素添加到列表list的尾部。
·list.insert(index,x):添加元素,在列表list中的指定位置index处插入元素x。
·list.remove(x):删除元素,在列表list中删除首次出现的指定元素x。
·list.pop([index]):删除元素,删除并返回列表list中指定位置index处的元素,默认是最后一个元素。
·list.clear():删除元素,删除列表中的所有元素,并不是删除列表对象。
·list.index(x):返回第一个x的索引位置,若不存在x元素则抛出异常。
·list.index(x1,x2):从索引位置x2开始往后搜索的第一个x1。
·list.count(x):返回指定元素x在列表list中出现的次数。
·len(list):返回列表中包含元素的个数。
·list.reverse():翻转列表,所有元素原地翻转。
·list.sort():对原列表进行排序,默认是升序。
·list.sort(reverse=True):降序排序。
·list.copy():返回列表对象的浅复制。
(2)元组
Python的元组与列表相似,元组是以圆括号“()”包围的数据集合。与列表不同的是元组的元素一旦确定就不能再改变,它是不可变数据类型。因此它常常被用在不希望数据被其他操作所改变的场景中。
如果圆括号中不包含任何内容,就是一个空元组。
定义一个元组如下:
tuple = ( 'a' , 'b' , 'c' , 'd' )
遍历元组如下:
for i in tuple :
print ( i, end= " " )
a b c d
将会打印输出:a b c d。
3.算法设计
根据列表和元组的相关知识,这里可以同时使用列表和元组来存放不同的税率范围
。接着使用for循环遍历每一个征税范围,将个人收入中超出起征点的金额在每个征税范围内应缴纳的税款累加起来,就得到最后应缴纳的个人所得税。
4.确定程序框架
(1)定义列表TaxTable
其中,元素类型使用元组,该列表描述了征税的范围及对应不同范围的税率。定义如下:
TaxTable = [ ( 0 , 500 , 0.05 ) ,
( 500 , 2000 , 0.10 ) ,
( 2000 , 5000 , 0.15 ) ,
( 5000 , 20000 , 0.20 ) ,
( 20000 , 40000 , 0.25 ) ,
( 40000 , 60000 , 0.30 ) ,
( 60000 , 80000 , 0.35 ) ,
( 80000 , 100000 , 0.40 ) ,
( 100000 , 1e10 , 0.45 ) ]
(2)定义计算税率的函数CaculateTax()
其中,profit为个人收入,TAXBASE是个税起征点。profit-TAXBASE是个人收入中超出个税起征点的部分,仍存入profit变量中,在CaculateTax()中要计算出这部分收入的纳税金额。
def CaculateTax ( profit) :
tax = 0.0
profit -= TAXBASE
i = 0
for i in range ( len ( TaxTable) ) :
if ( profit > TaxTable[ i] [ 0 ] ) :
if ( profit > TaxTable[ i] [ 2 ] ) :
tax += ( TaxTable[ i] [ 1 ] - TaxTable[ i] [ 0 ] ) * TaxTable[ i] [ 2 ]
else :
tax += ( profit - TaxTable[ i] [ 0 ] ) * TaxTable[ i] [ 2 ]
profit -= TaxTable[ i] [ 1 ]
if profit < 0 :
profit = 0
print ( "征税范围:%6d~%6d 该范围内缴税金额:%6.2f 超出该范围的金额:%6d" % ( TaxTable[ i] [ 0 ] , TaxTable[ i] [ 1 ] , tax, profit) )
return tax
在CaculateTax()函数中使用了for循环,循环变量为i,循环次数与TaxTable数组中的元素个数相同。在循环体中用profit(注意此时的profit中存放的是个人收入中超过个税起征点的部分)与征税范围做比较,如果TaxTable[i][1]>profit>TaxTable[i][0],即profit恰好处于某个范围内,则在该范围内应缴税金额为:(profit-TaxTable[i][0])*TaxTable[i][2];如果profit>TaxTable[i][1],则在该范围内应缴税金额为:(TaxTable[i][1]-TaxTable[i][0])*TaxTable[i][2]。
使用for循环将每个征收范围遍历一遍,将各个范围内产生的缴税金额累加起来,就得到应该缴纳的个人所得税的总金额。
CaculateTax()函数的流程图如图所示。
5.完整的程序
根据上面的分析,编写程序如下:
% % time
TAXBASE = 2000
TaxTable = [ ( 0 , 500 , 0.05 ) ,
( 500 , 2000 , 0.10 ) ,
( 2000 , 5000 , 0.15 ) ,
( 5000 , 20000 , 0.20 ) ,
( 20000 , 40000 , 0.25 ) ,
( 40000 , 60000 , 0.30 ) ,
( 60000 , 80000 , 0.35 ) ,
( 80000 , 100000 , 0.40 ) ,
( 100000 , 1e10 , 0.45 ) ]
def CaculateTax ( profit) :
tax = 0.0
profit -= TAXBASE
i = 0
for i in range ( len ( TaxTable) ) :
if ( profit > TaxTable[ i] [ 0 ] ) :
if ( profit > TaxTable[ i] [ 2 ] ) :
tax += ( TaxTable[ i] [ 1 ] - TaxTable[ i] [ 0 ] ) * TaxTable[ i] [ 2 ]
else :
tax += ( profit - TaxTable[ i] [ 0 ] ) * TaxTable[ i] [ 2 ]
profit -= TaxTable[ i] [ 1 ]
if profit < 0 :
profit = 0
print ( "征税范围:%6d~%6d 该范围内缴税金额:%6.2f 超出该范围的金额:%6d" % ( TaxTable[ i] [ 0 ] , TaxTable[ i] [ 1 ] , tax, profit) )
return tax
if __name__ == '__main__' :
print ( "请输入个人收入金额: " , end= '\n' )
profit = int ( input ( ) )
print ( f'输入的金额为: { profit} ' , '\n' )
tax = CaculateTax( profit)
print ( "您的个人所得税为 %12.2f" % tax)
请输入个人收入金额:
输入的金额为:5678
征税范围: 0~ 500 该范围内缴税金额: 25.00 超出该范围的金额: 3178
征税范围: 500~ 2000 该范围内缴税金额:175.00 超出该范围的金额: 1178
您的个人所得税为 175.00
CPU times: user 27.6 ms, sys: 6.23 ms, total: 33.8 ms
Wall time: 2.91 s