C语言结构体工资缴税,C语言进阶-第11~13讲:结构体实践(成绩处理&个税计算器之码数分离)...

任务和代码(一):

成绩处理

/*

*All rights reserved

*文件名称:main.c

*作者: Osseyda

*完成日期:2017.11.6

*版本号:v2.

*

*问题描述:定义学生结构体,在结构体数组中,输入了学生学号和两门课的成绩

*输出要求:

(1)计算每名学生的学分绩——各科成绩乘以学分的和,再除以总学分

(本题中,C语言和数学课的学分分别是3和4),输出按学分绩排序后的成绩单;

(2)计算各科的均分;

(3)输出得奖学金的同学学号清单——奖学金规则是,学分绩要高于80且没有挂科。

*/

#include

#define N 100 /*N表示最多允许的学生人数*/

#define gmath 4

#define gc 3

typedef struct{

int num; //学号

int c; //C语言成绩

int math; //数学成绩

float grade; //两科均分

}Student;

void sort_grade(Student stu[],int);

int main( ){

int n,i;

int account=0;

float sumC=0,sumMath=0;

//定义结构体数组存放多名同学的成绩

Student stu[N];

printf("请输入学生人数: ");

scanf("%d", &n);

printf("请输入学号、C和数学课的成绩: \n");

//输入数据

for(i=0;i

scanf("%d %d %d",&stu[i].num,&stu[i].c,&stu[i].math);

stu[i].grade=(float)(stu[i].c*gc+stu[i].math*gmath)/(gc+gmath);

sumC+=stu[i].c;

sumMath+=stu[i].math;

}

//输出按学分绩排序后的成绩单

printf("按学分绩排序后的成绩单: \n");

printf("学号\tC\t\数学\t学分绩\n");

sort_grade(stu,n);

//输出科均分

printf("科均分\t%.2f\t%.2f\n",sumC/n,sumMath/n);

//输出得奖学金同学的学号

printf("得奖学金同学的学号: \n");

for(i=0;i

if(stu[i].math>=60&&stu[i].c>=60&&stu[i].grade>80)

printf("%d ",stu[i].num);

}

printf("\n");

return 0;

}

void sort_grade(Student s[],int n){

int i,j;

Student t;

for(i=0;i

for(j=0;j

if(s[j].grade>s[j+1].grade){

t=s[j];

s[j]=s[j+1];

s[j+1]=t;

}

for(i=0;i

printf("%d\t%d\t%d\t%.2f\n",s[i].num,s[i].c,s[i].math,s[i].grade);

}

运行结果:

39cbf761db35620b56c94acbf552eea8.png

任务和代码(二):

个税计算器之码数分离

在学习分支结构时,我们做过一个个人所得税计算器if语句版,在其中,税率等数据直接写进了程序。这并不是一个好的方案。

下面定义一个结构体数组,保存各个收入范围个税计算的基础数据,一定程度上,将代码与数据分离,这是工程中常见的做法。

/*

*All rights reserved

*文件名称:main.c

*作者: Osseyda

*完成日期:2017.11.6

*版本号:v2.

*

*问题描述:利用这个结构体数组,输入个人月收入总额,计算并输出他本月应缴税款和税后收入。

*计算方法:个人所得税=(收入总额-3500)*税率-速算扣除数

*/

#include

typedef struct {

int payTax; //超出起征点的下限

double rate; //税率

int deducted; //速算扣除数

}TaxNode;

int main(){

TaxNode taxNode[10]={

{0,0.03,0},

{1500,0.10,105},

{4500,0.20,555},

{9000,0.25,1005},

{35000,0.30,2755},

{55000,0.35,5505},

{80000,0.45,13505}

};

double dSalary,dTax,dNetIncome,dValue;

double dRate,dOffset;

printf("请输入您本月的收入总额(元):");

while(scanf("%lf", &dSalary)&&dSalary){

dValue=dSalary-3500;

if (dValue>taxNode[6].payTax)

dRate=taxNode[6].rate,dOffset=taxNode[6].deducted;

else if (dValue>taxNode[5].payTax)

dRate=taxNode[5].rate,dOffset=taxNode[5].deducted;

else if (dValue>taxNode[4].payTax)

dRate=taxNode[4].rate,dOffset=taxNode[4].deducted;

else if (dValue>taxNode[3].payTax)

dRate=taxNode[3].rate,dOffset=taxNode[3].deducted;

else if (dValue>taxNode[2].payTax)

dRate=taxNode[2].rate,dOffset=taxNode[2].deducted;

else if (dValue>taxNode[1].payTax)

dRate=taxNode[1].rate,dOffset=taxNode[1].deducted;

else if (dValue>taxNode[0].payTax)

dRate=taxNode[0].rate,dOffset=taxNode[0].deducted;

else

dRate=0,dOffset=0;

dTax=dValue*dRate-dOffset;

dNetIncome=dSalary-dTax;

printf("您本月应缴个人所和税 %.2lf 元,税后收入是 %.2lf 元。\n", dTax, dNetIncome);

printf("\n");

printf("请输入您本月的收入总额(元):");

}

return 0;

}

运行结果:

d12def6ad04b33233030bdc023906dbd.png

知识点总结:

(1)定义结构体数组,也就是数组类型是结构体

(2)结构体数组传参,函数原型和函数调用

(3)由于结构体代表的是一组空间,故排序过程中可整体赋值

(4)结构体成员的调用

(5)多输入,以输入0为结束标志

心得:

把结构体当成int这种数据类型对待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值