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
原创粉丝点击