一、Review
10(可回看)【C语言&趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
09【C语言&趣味算法】再识:折半查找(二分查找)︰基本思想、程序流程图及完整代码、附:顺序查找
08【C语言&趣味算法】再识:冒泡排序(问题分析、算法设计与分析、程序流程图以及完整代码)
07【C语言&趣味算法】最佳存款方案(采用从后往前递推解决)
06【c语言&趣味算法】牛顿迭代法求方程根(可回看)
05【C语言&趣味算法】经典:兔子产子问题(即:Fibonacci数列)
04【C语言&趣味算法】“抓交通肇事犯"问题。算法改进:设置"标识变量”,有效减少循环次数。
03【C语言&趣味算法】(值得品味的一道题)打鱼还是晒网?结构体的简单应用。函数的应用。判断闰年的应用。求指定日期距1990年1月1日的天数。
02【C语言&趣味算法】借书方案问题:小明有5本新书,要借给A、B、C三位小朋友,若每人每次只能借1本,则可以有多少种不同的借法?
01【C语言&趣味算法】百钱百鸡问题(问题简单,非初学者请忽略叭)。请注意算法的设计((程序的框架),程序流程图的绘制,算法的优化。
二、New Problem: Personal income tax issues(个人所得税问题)
2.1 Description of the problem
2.2Analysis of the problem
2.2.1声明(定义)结构体
2.2.2定义结构体类型的变量:3种方法
2.2.3结构体变量的引用、结构体数组的定义与初始化
2.2.4使用typedef来定义类型
2.3 Algorithm design
2.4 Defining the framework of the process(确定程序框架)
2.5 Full code and output
//趣味11:个人所得税问题 #include <stdio.h> #define TAXBASE 2000 /*定义结构体*/ typedef struct{ long start; long end; double taxrate; }TAXTABLE; TAXTABLE TaxTable[]={{0,1500,0.03},{1500,4500,0.10},{4500,9000,0.20},{9000,35000,0.25}, {35000,55000,0.30},{55000,80000,0.35},{80000,1e10,0.45}}; double CaculateTax(long profit) { int i; double tax=0.0; profit-=TAXBASE; for(i=0;i<sizeof(TaxTable)/sizeof(TAXTABLE); i++) { if(profit>TaxTable[i].start) { if(profit>TaxTable[i].end) { tax+=(TaxTable[i].end-TaxTable[i].start)*TaxTable[i].taxrate; } else { tax+=(profit-TaxTable[i].start)*TaxTable[i].taxrate; } profit-=TaxTable[i].end; // printf("start%d:%6ld end%d:%6ld Tax:%12.2f Leave:%6ld\n",i,TaxTable[i].start,i,TaxTable[i].end,tax,(profit)>0 ? profit:0); printf("征税范围:%6ld~%6ld 该范围内缴税金额:%6.2f 超出该范围的金额:%6ld\n", TaxTable[i].start,TaxTable[i].end,tax,(profit)>0 ? profit:0); } } return tax; } int main() { long profit; double tax; printf("请输入个人收入金额:"); scanf("%ld",&profit); tax = CaculateTax(profit); printf("您的个人所得税为: %12.2f\n",tax); }
在Dev-C++运行上述程序后:可能会报警告如下,
翻译一下,其意思是:
简单来讲,这个错误即:常量转换溢出。C语言中char,int,float,double,unsigned char,
unsigned int 等数值有极限范围,当它们之间(隐式)转换时,可能因数值极限而超界溢出。有的编译器会报告这—类型的错误,并不是所有编译器都会报告。
这里应该是无伤大雅的叭!
来看几个测试:
2.6 Question expansion:使用指针指向结构体变量和结构体数组