4个税收分类。
第一次写完版本:
#include <stdio.h>
#define first_rate 0.15
#define over_rate 0.28
#define single_boundary 17850;
#define household_boundary 23900;
#define married_boundary 29750;
#define divorce_boundary 14875;
void caculate(long n);
int main(void)
{
long sum_money,get_money;
char type;
printf("please enter your type (single/household/married/divorce) :\n");
while (scanf("%s",type) == 1)
{
switch (type)
{
case 'single':
n =single_boundary;
caculate(n);
break;
case 'household':
n = (long)household_boundary;
caculate(n);
break;
case 'married':
n = (long)married_boundary;
caculate(n);
break;
case 'divorce':
n = (long)divorce_boundary;
caculate(n);
break;
default:
printf("your enter is wrong please enter again: \n");
break;
}
printf("done!\n");
return 0;
}
}
void caculate(long n)
{
printf("please enter the sum_money: ");
scanf("%ld",sum_money);
if (sum_money > n)
get_money = first_rate *n + over_rate*(sum_money - n);
else
get_money = first_rate * sum_money;
printf("the total money of you is %ld and you can get is %ld",sum_money,get_money);
}
很多错误: 1. 首先 case 后面的便签必须是:整数值!(包括char 类型),而我使用了字符串。2.子目标函数中 没有声明sum_money 与get_money,而在主函数中声明,错误很严重,在那里用就在那里声明,我在函数调用那么就在子函数中声明。 改看之后的版本:
#include <stdio.h>
#define first_rate 0.15
#define over_rate 0.28
#define single_boundary 17850;
#define household_boundary 23900;
#define married_boundary 29750;
#define divorce_boundary 14875;
void caculate(long n);
int main(void)
{
long n,sum_money,get_money;
char type;
printf("please enter your type (single/household/married/divorce) :\n");
while (scanf("%c",&type) == 1)
{
switch (type)
{
case 's':
n =single_boundary;
caculate(n);
break;
case 'h':
n = (long)household_boundary;
caculate(n);
break;
case 'm':
n = (long)married_boundary;
caculate(n);
break;
case 'd':
n = (long)divorce_boundary;
caculate(n);
break;
default:
printf("your enter is wrong please enter again: \n");
break;
}
printf("done!\n");
return 0;
}
}
void caculate(long n)
{
long sum_money,get_money;
printf("please enter the sum_money: ");
scanf("%ld",&sum_money);
if (sum_money > n)
get_money = first_rate *n + over_rate*(sum_money - n);
else
get_money = first_rate * sum_money;
printf("the total money of you is %ld and you can get is %ld",sum_money,get_money);
}
虽然可以运行,但是还是有问题 1.当输入分类的类型为s(single)时候,应该输出的是3279.5,而结果是3279。这里还是初学的时候浮点数没有判断,这种税率问题可能会出现小数的结果,而我声明和打印时候都是用的整型!,这点错误出现很多次了 下次注意!3.函数没有办法循环输入,结果是把 return 0; 放在了while 循环的里面这样就导致了循环只会输出一次,
修改后运行还是出现一点小问题,就是循环里面如果不加scanf()语句会使得输入一次s 然后输入20000,之后能得出结果:
please enter the sum_money: 20000
the total money of you is 20000.0 and you can get is 3279.5
please enter your type (single/household/married/divorce) :
your enter is wrong please enter again. please enter your type (single/household/married/divorce) :
循环自动跳过一次 进入swith 的default,加上scanf()后没有这个问题,尚未想通这个问题,是不是之后输入的20000存在了栈区被下一次类型输入读取 了,导致跳过一次输入直接进入default 的输入,而加了scanf()后将栈区里面的值刷新了就没有这个问题,个人想法,后面的学习中记得解决这个问题!
#include <stdio.h>
#define first_rate 0.15
#define over_rate 0.28
#define single_boundary 17850;
#define household_boundary 23900;
#define married_boundary 29750;
#define divorce_boundary 14875;
void caculate(long n);
int main(void)
{
long n;
char type;
printf("please enter your type (single/household/married/divorce) q to quit:\n");
while (scanf("%c",&type) == 1 && type != 'q')
{
switch (type)
{
case 's':
n =single_boundary;
caculate(n);
break;
case 'h':
n = (long)household_boundary;
caculate(n);
break;
case 'm':
n = (long)married_boundary;
caculate(n);
break;
case 'd':
n = (long)divorce_boundary;
caculate(n);
break;
default:
printf("your enter is wrong please enter again. ");
break;
}
printf("please enter your type (single/household/married/divorce) :\n");
scanf("%c",&type);
}
printf("done!");
return 0;
}
void caculate(long n)
{
double sum_money,get_money;
printf("please enter the sum_money: ");
scanf("%lf",&sum_money);
if (sum_money > n)
get_money = first_rate *n + over_rate*(sum_money - n);
else
get_money = first_rate * sum_money;
printf("the total money of you is %.1f and you can get is %.1f\n",sum_money,get_money);
}
但还是有一些问题,比如一来就输入1000,或者在输入钱的数量是输入ww,很多问题。之后学习再来解决。20171209. 11:22.