学生管理系统v2.0

学生管理系统v2.0
#include  <stdio.h>
#include  <stdlib.h>
#define  ARR_SIZE  30                     /* 最多可处理30人的学号和成绩 */
//自定义函数声明
int	Menu(void);                             /* 显示系统功能菜单 */
int	ReadScore(long num[], float score[]);         /* 输入学号和成绩 */
float GetAver(float score[], int n);               /* 计算课程平均分 */
float GetSum(float score[], int n);               /* 计算课程总分 */
void Dsortbyscore(float score[],long num[],int n,int (*compare)(int a,int b));  /* 按成绩升序或者降序排序 */
void Asortbynum(float score[],long num[], int n,int (*compare)(int a,int b));    /* 按学号由低到高升序排序 */
void Print(long num[],float score[],int n);         /* 输出所有学生的学号和成绩 */
int Search(long num[], float score[], int n, long x);  /* 按学号顺序查找,并输出成绩和成绩排名 */
void GetDetail(float score[], int n);             /* 成绩统计分析,给出各成绩区段上的人数和比例 */
void swap1(long *x,long *y);/* 交换学号数据 */
void swap2(float *x,float *y);/* 交换成绩数据 */
int ascending(int a,int b);/*升序排序*/
int descending(int a,int b);/*降序排序*/


int main() {
	int item,n,flag;       /* item-用户输入的功能选项,n-实际学生人数,flag-查找函数的返回值 */
	float score[ARR_SIZE],Aver,Sum;   /* score[]-成绩数组,Aver-成绩平均值,Sum-成绩总和 */
	long num[ARR_SIZE],xnum;    /* num[]-学号数组,xnum-要查找的学号 */
	int order;/*值为1表示升序排序,值为2表示降序排序*/
	while(1) { //通过“死循环”,允许用户连续进行多种选择操作
		item=Menu();
		switch(item) {
			case 1:
				n = ReadScore(num, score);            /* 输入学生的学号和成绩 */
				printf("学生总数为:%d\n", n);
				Print(num,score,n);       /* 输出学生的学号和成绩,检验输入数据是否正确 */
				break;
			case 2:
				Sum = GetSum(score, n);
				printf("总成绩= %.2f\n", Sum);   /* 计算成绩总和并输出 */
				Aver = GetAver(score, n);
				printf("平均值=%.2f\n", Aver);   /* 计算成绩平均值并输出 */
				break;
			case 3:/*按成绩排序*/
				printf("请选择排序方式,值为1表示升序排序,值为2表示降序排序:");
				scanf("%d",&order);
				if(order==1) {
					Dsortbyscore(score,num,n,ascending);/*函数指针指向ascending*/
				} else {
					Dsortbyscore(score,num,n,descending);/*函数指针指向descending*/
				}
				printf("排序后的结果为 :\n");
				Print(num,score,n);            /* 输出排序后的结果 */
				break;
			case 4:/*按学号排序*/
				printf("请选择排序方式,值为1表示升序排序,值为2表示降序排序:");
				scanf("%d",&order);
				if(order==1) {
					Asortbynum(score,num,n,ascending);/*函数指针指向ascending*/
				} else {
					Asortbynum(score,num,n,descending);/*函数指针指向descending*/
				}
				printf("排序后的结果为 ::\n");
				Print(num,score,n);            /* 输出排序后的结果 */
				break;
			case 5:
				printf("请输入要查找的学号:");
				scanf("%ld",&xnum);            /* 输入要查找的学号 */
				flag=Search(num, score, n, xnum);   /* 调用查找函数并返回是否找到的标志 */
				if(flag<0)  printf("Not found!\n");
				break;
			case 6:
				GetDetail(score, n);	    /* 成绩统计分析,给出各成绩区段上的人数和比例 */
				break;
			case 7:
				Asortbynum(score,num,n,descending);           /* 输出之前先按学号排序 */
				Print(num,score,n);                /* 输出所有学生的学号和成绩 */
				Sum = GetSum(score, n);
				printf("总成绩= %.2f\n", Sum);   /* 计算成绩总和并输出 */
				Aver = GetAver(score, n);
				printf("平均值=%.2f\n", Aver);   /* 计算成绩平均值并输出 */
				break;
			case 0:
				printf("退出程序! \n");
				exit(0);                 /* 退出程序 */
			default:
				printf("Ierror! \n");
		}
	}
	return 0;
}

/* 函数0:Menu
   函数功能:从键盘输入操作选项
   函数参数:无参数
   函数返回值:操作选项值
*/
int Menu(void) {
	int item;
	printf("\nManagement for student scores \n");
	printf("1. Input record \n");
	printf("2. Caculate total and average of course \n");
	printf("3. Sort in descending order by score \n");
	printf("4. Sort in ascending order by number \n");
	printf("5. Search by number \n");
	printf("6. Statistic analysis \n");
	printf("7. List record \n");
	printf("0. Exit \n");
	printf("Please enter your choice(0-7): ");
	scanf(" %d", &item);
	return(item);
}
/* 函数1:ReadScore
   函数功能:从键盘输入某班学生的学号和某课程成绩,当输入成绩为负值时,输入结束
   函数参数:长整型数组num,存放学生学号;单精度实型数组score,存放学生成绩
   函数返回值:学生总数
*/
int ReadScore(long num[], float score[]) {
	int i=-1;
	printf("请输入学生的学号和成绩(成绩为负值时停止):\n");
	do {
		i++;
		scanf("%ld",&num[i]);
		scanf("%f",&score[i]);
	} while(score[i]>=0);
	return i;
}
/* 函数2-1
   函数功能:计算课程总分
   函数参数:单精度实型数组score,存放学生成绩;整型变量n,存放学生总数
   函数返回值:课程总分
*/
float GetSum(float score[], int n) {
	int i=0;
	float sum=0;
	for(i=0; i<n; i++) {
		sum+=score[i];
	}
	return sum;
}
/* 函数2-2
   函数功能:计算平均分
   函数参数:实型数组score,存放学生成绩;整型变量n,存放学生总数
   函数返回值:平均分
*/
float GetAver(float score[], int n) {
	float average=0.0;
	int i=0,sum=0;
	for(i=0; i<n; i++) {
		sum+=score[i];
	}
	average=(float)sum/n;
	return average;
}
/* 函数3
   函数功能:按总分成绩由升序或者降序排出成绩的名次
   函数参数:长整型数组num,存放学生学号;
   单精度实型数组score,存放学生成绩;
   整型变量n,存放学生人数;
   函数返回值:无
*/
void Dsortbyscore(float score[],long num[],int n,int (*compare)(int a,int b)) {
	int i=0,j=0,k=0;
	for(i=0; i<n-1; i++) {
		k=i;
		for(j=i+1; j<n; j++) {
			if((*compare)(score[j],score[k]))
				k=j;
		}
		if(k!=i) {
			swap2(&score[k],&score[i]);
			swap1(&num[k],&num[i]);
		}

	}
}
/* 函数4
   函数功能:按学号升序或者降序排序
   函数参数:长整型数组num,存放学生学号;单精度实型数组score,存放学生成绩;
			 整型变量n,存放学生人数
   函数返回值:无
*/
void Asortbynum(float score[],long num[], int n,int (*compare)(int a,int b)) {
	int i=0,j=0,k=0;
	for(i=0; i<n-1; i++) {
		k=i;
		for(j=i+1; j<n; j++) {
			if((*compare)(num[j],num[k]))
				k=j;
		}
		if(k!=i) {
			swap2(&score[k],&score[i]);
			swap1(&num[k],&num[i]);
		}
	}
}
/* 函数5
   函数功能:在学号数组中顺序查找学生的学号
   函数参数:长整型数组num,存放学生学号;单精度实型数组score,存放学生成绩;
             整型变量n,存放学生人数;长整型变量x,存放待查找学生的学号
   函数返回值:找到时,输出学生学号、成绩和成绩排名,并返回该数组元素下标;
               没找到,返回-1
*/
int Search(long num[], float score[], int n, long x) {
	int i;
	for(i=0; i<n; i++) {
		if(x==num[i]) {
			printf("该学生的学号是%d\n",num[i]);
			printf("该学生的成绩是%f\n",score[i]);
			printf("该学生的排名是%d\n",(i+1));
			return i;
			break;
		}
	}
	if(i>n) {
		return (-1);
	}
}
/* 函数6
   函数功能:统计各分数段的学生人数及所占的百分比
   函数参数:单精度实型数组score,存放学生成绩;整型变量n,存放学生总数
   函数返回值:无
*/
void GetDetail(float score[], int n) {
	int i=0,a=0,b=0,c=0,d=0,e=0;
	for(i=0; i<n; i++) {
		if(score[i]<=100&&score[i]>=90) {
			a++;
		}
		if(score[i]<=89&&score[i]>=80) {
			b++;
		}
		if(score[i]<=79&&score[i]>=70) {
			c++;
		}
		if(score[i]<=69&&score[i]>=60) {
			d++;
		}
		if(score[i]<=60&&score[i]>=0) {
			e++;
		}
	}
	printf("优秀人数:%d,占总人数:%.2f%%\n",a,(float)(a*100)/n);
	printf("良好人数:%d,占总人数:%.2f%%\n",b,(float)(b*100)/n);
	printf("中等人数:%d,占总人数:%.2f%%\n",c,(float)(c*100)/n);
	printf("及格人数:%d,占总人数:%.2f%%\n",d,(float)(d*100)/n);
	printf("不及格人数:%d,占总人数:%.2f%%\n",e,(float)(e*100)/n);
}
/* 函数7
   函数功能: 打印学生学号和成绩
   函数参数: 长整型数组num,存放学生学号;单精度实型数组score,存放学生成绩;
			  整型变量n,存放学生人数
   函数返回值:无
*/
void Print(long num[], float score[], int n) {
	int i=0;
	for(i=0; i<n; i++) {
		printf("学生的学号是%d\n 学生的成绩是%.2f:\n",num[i],score[i]);
	}
}
void swap1(long *x,long *y) { /*交换学号数据*/
	int pTemp;
	pTemp=*x;
	*x=*y;
	*y=pTemp;
}
void swap2(float *x,float *y) { /*交换成绩数据*/
	float pTemp;
	pTemp=*x;
	*x=*y;
	*y=pTemp;
}
int  ascending(int a,int b) { /*升序排序*/
	return a<b;
}
int  descending(int a,int b) { /*降序排序*/
	return a>b;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值