作业要求 2015-2016学年度第一学期已经考试结束,为了了解学生的业务课程考试情况、平时表现情况和综合奖学金评定工作,需对全班同学的业务课程考试成绩、平时表现成绩进行相应处理。其中业务课程包括:高等数学、C语言程序设计、大学英语视听一、软件技术导论、近现代史和大学体育一6门课程;平时表现成绩包括:辅导员评分、班主任评分和班级同学评分三项。业务课程考试成绩和平时表现评分均实行百分制。
综合奖学金评定办法:
(1)业务课程成绩占70%,平时表现成绩占30%。
(2)业务课程任一门考试成绩低于60分不能参与奖学金评定。
(3)综合奖学金分为三个等级:一等奖学金、二等级学金和三等奖学金。其中一等奖学金占班级人数的3%,二等奖奖学金占班级人数的7%,三等奖 奖学金占班级人数的20%,具体获奖人数应根据班级人数和奖学金各等级的分配比例相乘进行四舍五入来确定。
要求根据以上题目描述,结合函数专项实训,从要求解决的问题中抽取出具体功能,并根据抽取出的具体功能和C语言函数的规范设计相应函数,进而经函数定义、声明与调用等过程评选出各等级奖学金的获奖者信息。
作业内容
1.了解C语言函数的肢体结构
C语言的函数具有明显的肢体结构,由函数的返回值类型、函数名、(函数的参数类型、形式参数名)构成函数的首部;由{}、函数内部变量的定义语句、功能性执行语句构成函数体。
自定义函数相互间的区别是函数的返回值类型、函数名、函数的参数、内部变量、功能性语句的不同,函数的整体结构都是一样的,有函数首部和函数体。
2. 根据实际应用需求抽取(分解)具体功能
3. 根据具体功能和函数格式设计函数
4. 定义函数
5. 声明与调用函数
#include <stdio.h>
#include<stdlib.h>
typedef struct
{
char sno[11]; //规范化学号格式
char name[10]; //姓名
int Gshu ; //高等数学成绩
int Ccheng;//C语言程序设计成绩
int Rdao;//软件技术导论成绩
int Dying;//大学英语视听一成绩
int Dti;//大学体育一成绩
int Jdaishi;//近现代史成绩
int Gkeflag;//挂科标记,初始化为0,若有挂科则标记为1
int Fdaoyuan;//辅导员评分
int Bzhuren;//班主任评分
int Bjin;//班级同学评分
double Zhefen; //学生的综合成绩=业务课成绩70%+综合表现成绩30%
}Student;
/*********************************输入函数****************************************************/
//功能包括:循环输入n位学生的信息,擦屏
void input(Student stu[],int n)
{
int i;
for(i=0;i<n;i++)
{
stu[i].Gkeflag=0;
printf("请输入第%d位学生的十位学号:",i+1);
scanf("%s",stu[i].sno);
printf("请输入第%d位学生的姓名:",i+1);
scanf("%s",stu[i].name);
printf("请输入第%d位学生的高等数学成绩:",i+1);
scanf("%d",&stu[i].Gshu);
if(stu[i].Gshu<60)
stu[i].Gkeflag=1;
printf("请输入第%d位学生的c语言程序设计成绩:",i+1);
scanf("%d",&stu[i].Ccheng);
if(stu[i].Ccheng<60)
stu[i].Gkeflag=1;
printf("请输入第%d位学生的大学英语视听一成绩:",i+1);
scanf("%d",&stu[i].Dying);
if(stu[i].Dying<60)
stu[i].Gkeflag=1;
printf("请输入第%d位学生的软件技术导论成绩:",i+1);
scanf("%d",&stu[i].Rdao);
if(stu[i].Rdao<60)
stu[i].Gkeflag=1;
printf("请输入第%d位学生的近现代史成绩:",i+1);
scanf("%d",&stu[i].Jdaishi);
if(stu[i].Jdaishi<60)
stu[i].Gkeflag=1;
printf("请输入第%d位学生的大学体育一成绩:",i+1);
scanf("%d",&stu[i].Dti);
if(stu[i].Dti<60)
stu[i].Gkeflag=1;
printf("请输入第%d位学生的辅导员评分:",i+1);
scanf("%d",&stu[i].Fdaoyuan);
printf("请输入第%d位学生的班主任评分:",i+1);
scanf("%d",&stu[i].Bzhuren);
printf("请输入第%d位学生的班级同学评分:",i+1);
scanf("%lf",&stu[i].Bjin);
system("cls");
}
}
/********************************计算综合成绩函数**************************************/
//功能包括:学生的综合成绩=业务课成绩70%+综合表现成绩30%
void calculate(Student stu[],int n)
{
int i;
double a,b;
for(i=0;i<n;i++)
{
a=0;b=0;
a=0.7*((double)stu[i].Gshu+(double)stu[i].Ccheng+(double)stu[i].Dying+(double)stu[i].Rdao+(double)stu[i].Jdaishi+(double)stu[i].Dti);
b=0.3*((double)stu[i].Fdaoyuan+(double)stu[i].Bzhuren+(double)stu[i].Bjin);
stu[i].Zhefen=a+b;
}
}
/**************************************排序函数*********************************************/
//依然是冒泡法排序,这里是整体排序
void sort(Student stu[],int n)
{
int i,j,a,b,c;
Student temp;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if(stu[j].Zhefen<stu[j+1].Zhefen&&stu[j].Zhefen)//冒泡排序总评分高的,整体前移
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
/**********************************输出函数***********************************************/
//按照奖学金人数,按排好的序从前到后输出,但要跳过挂科的人
void output(Student stu[],int n)
{
int a,b,c,i,j;
a=n*0.03+0.5;//一等奖学金人数,强制转换去尾
b=n*0.07+0.5;//二等奖学金人数
c=n*0.2+0.5;//三等奖学金人数
/******************一等奖学金***********************/
printf("得一等奖学金的同学:\n");
printf("学号\t\t姓名\t综合成绩\t\n");//从前到后输出,跳过挂科
i=0;
for(j=0;j<n;j++)
{
if(stu[j].Gkeflag==0&&i<a)//判断是否挂科,控制次数
{
printf("%s\t%s\t%.2lf\t\n",stu[j].sno,stu[j].name, stu[j].Zhefen);
i++;//循环次数的控制
}
else
continue;
j++;//下次循环的初值
break;
}
/*****************二等奖学金**************************/
printf("得二等奖学金的同学:\n");
printf("学号\t\t姓名\t综合成绩\t\n");
i=0;
for(;j<n;j++)
{
if(stu[j].Gkeflag==0&&i<b)
{
printf("%s\t%s\t%.2lf\t\n",stu[j].sno,stu[j].name, stu[j].Zhefen);
i++;
}
j++;
break;
}
/********************三等奖学金*******************/
printf("得三等奖学金的同学:\n");
printf("学号\t\t姓名\t综合成绩\t\n");
i=0;
for(;j<n;j++)
{
if(stu[j].Gkeflag==0&&i<c)
{
printf("%s\t%s\t%.2lf\t\n",stu[j].sno,stu[j].name, stu[j].Zhefen);
i++;
}
break;
}
}//三批输出,还是有点赘余,后期可以改用一个函数重复调用
/**********************************主函数*******************************************/
int main()
{
int n;
printf("请输入要输入的学生数:");
scanf("%d",&n);
Student *stu=NULL; //初始化指针
stu=(Student*)malloc(n*sizeof(Student));//分配动态内存
input(stu,n); //调用实参
calculate(stu,n); //调用
sort(stu,n); //调用
output(stu,n); //调用
getchar(); getchar(); //暂停
free(stu);//******************************释放占用的动态数组
return 0;
}