任务和代码(一):
成绩处理
/*
*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);
}
运行结果:
任务和代码(二):
个税计算器之码数分离
在学习分支结构时,我们做过一个个人所得税计算器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;
}
运行结果:
知识点总结:
(1)定义结构体数组,也就是数组类型是结构体
(2)结构体数组传参,函数原型和函数调用
(3)由于结构体代表的是一组空间,故排序过程中可整体赋值
(4)结构体成员的调用
(5)多输入,以输入0为结束标志
心得:
把结构体当成int这种数据类型对待