程序目标
这个程序由C Primer Plus(Fifth Edition)中的一道练习引出。
我们的目标是制作一个界面友好且安全性高(防止错误输入)的程序。按照书上的要求,我们拟定伪代码:
主体:
DO循环{
提示输入等级类型
判断:类型。如果不正确,置标记为0
提示输入金额
判断:金额。如果不正确,置标记为0{
类型1:调用函数输出税额
类型2:调用函数输出税额
类型3:调用函数输出税额
类型4:调用函数输出税额
}
缓冲区调整
}循环继续条件(标记)
输出税额的函数:
如果:金额在规定以下
返回:金额 * 0.15
否则
返回:规定 * 0.15 + (金额 - 规定) * 0.28
为了使界面更美观,我们采用制表符来提示用户输入,并采用无缓冲输入达到一定的效果,详细请看程序代码。
程序代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 5 /* 6 本程序依照1988年的United States Federal Tax Schedule 7 该计划分为四个标准征税: 8 单身 17850 9 户主 23900 10 已婚共有 29750 11 已婚离异 14875 12 每一种等级在其范围内征收15%的税,超过部分按28%计算 13 */ 14 15 #define ALONE 17850.0 16 #define FAM_MAN 23900.0 17 #define MA_TOG 29750.0 18 #define MA_SE 14875.0 19 20 double calc(double money, double base); 21 22 int main(int argc, char * argv[]){ 23 char type; 24 double money; 25 int flag = 1; //循环标记 26 27 do{ 28 printf("┌─────────────┐ " 29 "│请选择纳税人身份: │ " 30 "│a.单身 b.户主 │ " 31 "│c.已婚共有 d.已婚离异│ " 32 "│输入其它内容退出 │ " 33 "└─────────────┘ " 34 " User#[ ]"); 35 //下面的getche是有回显无缓冲输入,函数原形在conio.h中 36 if( ( type = getche() ) != 'a' && type != 'b' && type != 'c' && type != 'd'){ 37 flag = 0; 38 printf(" 已退出! "); 39 break; 40 } 41 42 printf(" 请输入纳税人财产总额:$[ ]"); 43 if( scanf("%lf",&money) ){ 44 switch(type){ 45 case 'a': 46 printf("这位纳税人需要缴纳 $%g 的税款 ",calc(money, ALONE) ); 47 break; 48 case 'b': 49 printf("这位纳税人需要缴纳 $%g 的税款 ",calc(money, FAM_MAN) ); 50 break; 51 case 'c': 52 printf("这位纳税人需要缴纳 $%g 的税款 ",calc(money, MA_TOG) ); 53 break; 54 case 'd': 55 printf("这位纳税人需要缴纳 $%g 的税款 ",calc(money, MA_SE) ); 56 break; 57 } 58 } 59 else{ 60 flag = 0; 61 printf("数据错误! "); 62 } 63 while(getchar() != ' '); //调整读取缓冲区 64 65 }while(flag); 66 67 printf(" 谢谢使用 "); 68 getch(); 69 70 return 0; 71 } 72 73 double calc(double money, double base){ 74 return (money < base) ? (money * 0.15) : (base * 0.15 + (money - base) * 0.28); 75 //这个函数返回正确的税额,?:运算符简洁,这里提供一个记忆技巧: 76 //是真的吗 ? 是 : 不是 77 }
部分代码显示纠错: