4. 应用练习 – [税费计算]
![]() |
4.1. 题目
我们的目标是编写一个程序来计算纳税人的税额。我们考虑一种简化情况,即纳税人仅需申报工资收入:
- 若纳税人未婚,则计算其适用税率档次数 nbParts = nbChildren / 2 + 1;若已婚,则为 nbChildren / 2 + 2,其中 nbChildren 表示子女数量;
- 计算其应税收入 R = 0.72 * S,其中 S 为其年薪;
- 计算其家庭系数 Q = R/N;
- 根据以下数据计算其应纳税额 I。
12620.0 0 0
13190 0.05 631
15640 0.1 1290.5
24740 0.15 2072.5
31810 0.2 3309.5
39970 0.25 4900
48360 0.3 6898.5
55790 0.35 9316.5
92970 0.4 12106
127860 0.45 16754.5
151250 0.50 23147.5
172040 0.55 30710
195000 0.60 39312
0 0.65 49062
每行有 3 个字段。要计算税款 I,请查找满足 QF <= 字段1 的第一行。例如,如果 QF = 30,000,则找到的行将是:
此时税款 I 等于 0.15*R - 2072.5*nbParts。如果 QF 值导致条件 QF<=field1 永远无法满足,则使用最后一行中的系数。具体如下:
由此得出税款 I = 0.65*R - 49062*nbParts。
4.2. 列表版本
结果
数据文件 data.txt:
包含结果的 results.txt 文件:
oui:2:200000:22504.0
non:2:200000:33388.0
oui:3:200000:16400.0
non:3:200000:22504.0
oui:5:50000:0.0
non:0:3000000:1354938.0
4.3. 带文本文件的版本
在上一个示例中,计算税款所需的数据来自三个列表。从现在开始,这些数据将从文本文件中获取:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | |
结果
与之前相同。
程序 (taxes_02b)
上面的 getImpots 方法(第 6–36 行)返回一个元组 (error, limits, coeffR, coeffN),其中 error 是一个错误消息,该消息可能为空。您可能希望使用异常来处理这些错误情况。在这种情况下:
- 如果发生错误,getImpots 方法会抛出异常;
- 否则,它将返回元组 (limits, coeffR, coeffN)。
因此,getImpots 方法的代码如下:
- 第 4 行:我们未检查文件打开是否失败。若失败,将引发 IOError 异常。我们让该异常传播至调用程序;
- 第 9–10 行:我们抛出一个异常,以指示预期中的第一行缺失。我们使用预定义的 RuntimeError 异常。我们也可以创建自己的异常类。稍后我们会这样做;
- 第 16–17 行和第 23–24 行:我们对第 2 行和第 3 行也进行了同样的处理。
主程序代码如下:
# ------------------------------------------------ main
# définition des constantes
DATA="data.txt"
RESULTATS="resultats.txt"
IMPOTS="impots.txt"
# les données nécessaires au calcul de l'impôt ont été placées dans le fichier IMPOTS
# à raison d'une ligne par tableau sous la forme
# val1:val2:val3,...
erreur=False
try:
(limites,coeffR,coeffN)=getTables(IMPOTS)
except IOError, message:
erreur=True
except RuntimeError, message:
erreur=True
# y-a-t-il eu une erreur ?
if(erreur):
print "L'erreur suivante s'est produite : {0}\n".format(message)
sys.exit()
# lecture des données
...
- 第 12–17 行:我们调用 getImpots 方法,并处理它可能抛出的两个异常:IOError 和 RuntimeError。在此处理中,我们仅记录发生了错误;
- 第 20–22 行:我们显示捕获到的异常的错误信息,并终止程序。
