(1)问题描述
一个国家计算所得税的规则由如下的不确定多条规则构成:
M1, R1
M2, R2
...
Mn, Rn
其中,n是规则的条数,由用户输入。对于任意的1<=i<=n,Ri表示个人收入中在区间[Mi, Mi+1)的部分的税率,它是一个整数,代表百分之几。M1为税率起征点,M0=0, R0=0。
(2)问题要求
① 请定义一个结构体,用来存放一条规则。
② 根据用户输入的规则条数,使用结构体的数组存放所有的规则。
③ 定义一个子函数 inputRules(struct Rule rules[], int n),根据用户输入的规则条数,从键盘得到所有规则,存放至数组。
④ 定义一个子函数计算所得税。
// 参数 income 表示个人收入
double computeTax(struct Rule rules[], int n, int income);
⑤ 在主函数中,一次录入规则后,可以循环计算任意多个人的所得税,直到输入的收入为-1 为止。
⑥ 请至少测试以下情况
- 输入规则后,在录入收入时,直接录入-1;
- 收入为 0;
- 收入小于M1;
- 收入等于Mi的各种情况;
- 收入大于Mn;
- 收入在Mn−1和Mn之间的情况。
(3) 程序运行要求
程序的一次运行结果如下:
①
请输入规则的条数: 3
请输入第 1 条规则: 800 3
请输入第 2 条规则: 2000 4
请输入第 3 条规则: 5000 3
②
纳税规则如下:
纳税线 税率
800 3
2000 4
5000 36
③
请输入您的收入: 0
您的收入是: 0,应缴所得税: 0.00 元。
④
请输入您的收入: 800
您的收入是: 800,应缴所得税: 0.00 元。
⑤
请输入您的收入: 801
您的收入是: 801,应缴所得税: 0.03 元。
⑥
请输入您的收入: 2000
您的收入是: 2000,应缴所得税: 36.00 元。
(2000 – 800) × 3 / 100
⑦
请输入您的收入: 1999
您的收入是: 1999,应缴所得税: 35.97 元。
⑧
请输入您的收入: 5000
您的收入是: 5000,应缴所得税: 156.00 元。
[(2000 – 800) × 3 + (5000 – 2000) × 4] / 100
请输入您的收入: 10000
您的收入是: 10000,应缴所得税: 306.00 元。
[(2000 – 800) × 3 + (5000 – 2000) × 4 + (10000 – 5000) × 3] / 100
⑨
请输入您的收入: -1
再见
请按任意键继续···
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
struct Rule { // 表示一条规则的结构体
double taxLine; // 纳税线
double taxRate; // 税率
};
// 根据用户输入的规则条数,从键盘得到所有规则,存放至数组。
void inputRules(struct Rule rules[], int num);
// 计算所得税的函数。
double computeTax(struct Rule rules[], int num, double income);
// 根据用户输入的规则条数,打印得到所有规则至屏幕。
void printRules(struct Rule rules[], int num);
int main() {
int ruleNumber;
double income;
double tax;
struct Rule myrules[50];
while (true) {
cout << "请输入规则的条数:";
cin >> ruleNumber;
if (ruleNumber > 0) {
break;
} else {
cout << "无效输入,请输入正整数!" << endl;
}
}
inputRules(myrules, ruleNumber);
printRules(myrules, ruleNumber);
while (true) {
while (true) {
cout << "请输入您的收入(输入-1退出):";
cin >> income;
if (income > 0 || income == -1) {
break;
} else {
cout << "无效输入,请输入正数!" << endl;
}
}
if (income == -1) {
break;
}
tax = computeTax(myrules, ruleNumber, income);
cout << "您的收入是:" << setprecision(2) << fixed << income << "元,应交所得税:"
<< setprecision(2) << fixed << tax << "元。" << endl;
}
cout << "感谢您的使用,再见!";
return 0;
}
void inputRules(struct Rule rules[], int num) {
for (int i = 0; i < num; i++) {
cout << "请输入第 " << i + 1 << " 条规则(纳税线 税率):";
cin >> (rules + i)->taxLine >> (rules + i)->taxRate;
}
}
double computeTax(struct Rule rules[], int num, double income) {
double sum = 0;
int i;
if (income > rules->taxLine) {
for (i = 1; i < num; i++) {
if (income < (rules + i)->taxLine) {
sum += (income - (rules + i - 1)->taxLine) * (rules + i - 1)->taxRate / 100;
break;
} else {
sum += ((rules + i)->taxLine - (rules + i - 1)->taxLine) * (rules + i - 1)->taxRate / 100;
}
}
if (i == num) {
sum += (income - (rules + i - 1)->taxLine) * (rules + i - 1)->taxRate / 100;
}
}
return sum;
}
void printRules(struct Rule rules[], int num) {
cout << "纳税规则如下:" << endl;
cout << " 纳税线 税率 " << endl;
for (int i = 0; i < num; i++) {
cout << setw(8) << (rules + i)->taxLine << setw(8) << (rules + i)->taxRate << endl;
}
}
标签:收入,所得税,double,income,rules,int,计算,规则
From: https://www.cnblogs.com/catting123/p/16640822.html