C语言进阶-第11~13讲:结构体实践(成绩处理&个税计算器之码数分离)
来源:互联网 发布:java语言翻译器 编辑:程序博客网 时间:2024/04/30 05:24
任务和代码(一):
成绩处理
/* *All rights reserved *文件名称:main.c *作者: Osseyda *完成日期:2017.11.6 *版本号:v2. * *问题描述:定义学生结构体,在结构体数组中,输入了学生学号和两门课的成绩 *输出要求: (1)计算每名学生的学分绩——各科成绩乘以学分的和,再除以总学分 (本题中,C语言和数学课的学分分别是3和4),输出按学分绩排序后的成绩单; (2)计算各科的均分; (3)输出得奖学金的同学学号清单——奖学金规则是,学分绩要高于80且没有挂科。*/ #include <stdio.h>#define N 100 /*N表示最多允许的学生人数*/#define gmath 4#define gc 3typedef 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<n;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<n;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<n-1;i++) for(j=0;j<n-i-1;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<n;i++) printf("%d\t%d\t%d\t%.2f\n",s[i].num,s[i].c,s[i].math,s[i].grade);}运行结果:
任务和代码(二):
个税计算器之码数分离
在学习分支结构时,我们做过一个个人所得税计算器if语句版,在其中,税率等数据直接写进了程序。这并不是一个好的方案。
下面定义一个结构体数组,保存各个收入范围个税计算的基础数据,一定程度上,将代码与数据分离,这是工程中常见的做法。
/* *All rights reserved *文件名称:main.c *作者: Osseyda *完成日期:2017.11.6 *版本号:v2. * *问题描述:利用这个结构体数组,输入个人月收入总额,计算并输出他本月应缴税款和税后收入。*计算方法:个人所得税=(收入总额-3500)*税率-速算扣除数*/#include <stdio.h>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;}运行结果:
(1)定义结构体数组,也就是数组类型是结构体
(2)结构体数组传参,函数原型和函数调用
(3)由于结构体代表的是一组空间,故排序过程中可整体赋值
(4)结构体成员的调用
(5)多输入,以输入0为结束标志
心得:
把结构体当成int这种数据类型对待
阅读全文
0 0
- C语言进阶-第11~13讲:结构体实践(成绩处理&个税计算器之码数分离)
- 《C语言及程序设计》实践参考——个税计算器之码数分离
- C语言进阶-第11~13讲:结构体实践(该年第几天&紧急救援)
- C语言进阶-第15~16讲:结构体应用(学生成绩统计)
- 进阶项目5-个税计算器之码数分离
- C语言进阶-第11~13讲:结构体(含数组和函数)
- C语言初步-第11讲:算术运算符与算术表达式(分离各位数)
- C语言进阶-第15~16讲:结构体(含指针和函数)
- C语言进阶-第15~16讲:结构体应用(玩转日期和时间)
- C语言提高-第18讲: 一维数组应用二三例(成绩处理)
- C语言进阶-第30讲:联合体及其与结构体的区别
- C语言进阶-第6讲:递归法问题求解(两数的最大公约数)
- C语言初步-第7讲:分支结构体验(三数最大数)
- C语言提高-第24/25讲: 数组名【指针】作为函数参数(成绩处理函数版)
- C语言基础之结构体进阶
- C语言初步-第26讲:利用switch语句解决问题(成绩等级)
- C语言初步-第11讲:算术运算符与算术表达式(分离整数和小数部分)
- C语言初步-第24讲:if语句的嵌套(个人所得税计算器if语句版)
- GDI+绘制矩形,并且实现可旋转、缩放、移动功能(基于MFC对话框)
- 博客登录实现权限拦截
- 怎么把刚刚误删除的数据找回来?
- 提升编程能力万无一失的办法,你试过了么?
- Spring Boot的初步学习
- C语言进阶-第11~13讲:结构体实践(成绩处理&个税计算器之码数分离)
- C# 随机日期生成及日期差
- Linux常用命令
- linux工具---nc
- NewStart(三)—— LoginWindow
- LeetCode||53. Maximum Subarray
- Azure Blob 存储更改缓存时间
- 【skill】tmux快捷键
- android jni c/c++线程通过CallVoidMethod调用java函数出现奔溃问题