c语言学生成绩单管理系统-----综合性极强的锻炼动手实践项目!

在这里插入图片描述
设计程序实现下列功能:
1.对学生个人信息,根据姓名和学号,由小到大分别用快速排序和选择排序方法并输出所有学生的个人信息;
2能够输出所有课程的名称;.
3.输入学号或者姓名可以查询学生所选修课程、考试分数以及所学课程的平均分;
4.输入课程可以查看选修该课程的学生信息、该课程的考试成绩、以及选修人数,该课程的全班平均成绩;
5.统计所有挂科学生的个人信息、以及所挂科目的名称和成绩; .
6.其他,此部分可以自由发挥,添加若干功能。

实现代码:

#include <stdio.h>
#include <windows.h>
#include<string.h>
#include <locale.h>
#define NUM 12  //修改NUM就可以加学生数量
//设计思路:首先给各门课程、学生的姓名、学号等分别用数组进行存储,存储的顺序要保持一致。然后通过结构体来声明学生的属性分别有8门课,还有姓名、学号、平均分,再用该结构体声明一个用来存储学生的数组student[NUM],这个数组可以通过小数点获取它的属性值,例如student[0].name,这个就代表是第一位存储的学生的姓名。后面通过循环给每一位学生的每一个属性赋上我一开始用数组进行存储发值,这样就得到了每一个学生的信息。但是使用结构体进行数组赋值很麻烦,当进行排序的时候,取较大值的时候赋值,就老是出错,后来我就试了一下用结构体指针做形式参数,再用结构体声明的变量作为中间值进行比较赋值,定义成一个函数,一下子就缩减了很多代码,再也不用一个个结构体属性去赋值了,直接一个结构体学生的数组就可以进行交换了。我觉得最难的是后面两题,尤其是第四题,因为输入了中午的课程字符串不知道它的ASCII码,也不知道怎么比对进行课程索引,后来我就拿拼音充当中文算了,首先定义一个字符串数组用来存储8个课程,然后输入一个字符串,通过循环去判断,如果这个字符串和字符串数组的其中的一个相匹配,再判断当次循环学生结构体成绩的值是否等于0,如果不等于0则说明有学生选了这一门课,就打印出来。在循环里面计算分数的综合,在循环的外面计算平均值,打印课程的成绩平均值和选课人数。还有一点,关于存储学生没有选某门课程的分数由#改成0,这样计算平均分更加直接方便,后面第五题用来判断学生挂科就可以小于60分且大于0,就属于挂科。
struct student_scores{//定义学生属性
	int ID;//学号
	char name[20];//姓名
	int xiankong;//现控
	int zikong;//自控 
	int xiandai;//线代
	int gaoshu;//高数
	int dianji;//电机
	int dianlu;//电路
	int yundongkongzhi;//运动控制	
	int english;//英语
	int ave;
};
void swap(struct student_scores *p1,struct student_scores *p2)	//交换两个结构体变量
{
	struct student_scores temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

void quick_sort(struct student_scores p[],int low,int high)//递归实现快速排序
{
	int i,j;
	char x[20];
	i=low;
	j=high;
	strcpy(x,p[low].name);
	if(low<high)
	{
		while(i<j)
		{
			while(i<j && strcmp(p[j].name,x)>=0)
				j--;
			if(i < j) 
				swap(&p[i++],&p[j]);
				// num[i++]=num[j];
			while(i<j && strcmp(p[i].name,x)<=0)
				i++;
			if(i < j) 
				swap(&p[i],&p[j--]);
				// num[j--]=num[i];
		}
		strcpy(p[i].name,x);
		quick_sort(p,low,i-1);
		quick_sort(p,i+1,high);
	}
}

void main()
{
	struct student_scores student[NUM],temp;//定义一个结构体名称数组 12个学生
	char *name_all[20]={"Lei Zhenzi","Jiong Ziya","Ne Zha  ","Shen Gongbao","Jiu Weihu","Tian Zun","Tai Yi  ","Yang Jian","Huang Feihu","Zhou Wang","Li Jing ", "Tu Xingsun"};
	int id_all[NUM]={101401,100032,101674,101982,107431,100001,101009,101321,101567,108160,102456,102245};
	int xiankong_all[NUM]={0, 90,70,87,75,98,81,63,0,55,84,65};	
	int  zikong_all[NUM]= {74,0,80,46,78,0,45,62,0,62,78,94};
	int  xiandai_all[NUM]={68,82,74,0,63,0,84,0,82,0,84,54};
	int  gaoshu_all[NUM]={74,79,0,0,0,85,76,90,83,64,90,0};
	int  dianji_all[NUM]={58,88,66,79,84,82,90,0,66,51,77,0};
	int  dianlu_all[NUM]={68,70,78,85,82,94,0,62,73,0,0,83};
	int yundongkongzhi_all[NUM]={0,79,0,85,0,91,0,74,76,44,0,92};
	int english_all[NUM]={88,0,66,86,76,93,72,81,90,60,82,52};
	char *kecheng[20]={"xiankong","zikong","xiandai","gaoshu","dianji","dianlu","yundongkongzhi","yingyu"};
	int i,j;
	char xingming[20]={0};
	int key,xuehao;
	char *p;
	char a[100]={0};
	int counts=0;
	int sum=0;
	for( i=0;i<NUM;i++)//录入成绩
	{
		student[i].ID=id_all[i];
		strcpy(student[i].name,name_all[i]);
		student[i].xiankong=xiankong_all[i];
		student[i].zikong=zikong_all[i];
		student[i].xiandai=xiandai_all[i];
		student[i].gaoshu=gaoshu_all[i];
		student[i].dianji=dianji_all[i];
		student[i].dianlu=dianlu_all[i];
		student[i].yundongkongzhi=yundongkongzhi_all[i];
		student[i].english=english_all[i];
		student[i].ave=(student[i].xiankong+student[i].zikong+student[i].zikong+student[i].xiandai+student[i].gaoshu+student[i].dianji+student[i].dianlu+student[i].yundongkongzhi+student[i].english)/6;
	}
	printf("姓名\t\t学号\t\t\t课程名/分数\n");
	printf("\t\t\t\t现控\t自控\t线代\t高数\t电机\t电路\t运动控制\t英语\n");
	printf("----------------------------------------------------------------------------------------------------\n");
	for( i=0;i<NUM;i++)
	{//打印所有学生信息
	
	printf("%s\t%d\t\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\t%d \n",student[i].name,student[i].ID,student[i].xiankong,	student[i].zikong,student[i].xiandai,
			student[i].gaoshu,student[i].dianji,student[i].dianlu,student[i].yundongkongzhi,student[i].english);
	}
	printf("----------------------------------------------------------------------------------------------------\n");
	//按姓名快速排序,按学号选择排序,从小到大
	printf("快速排序法:按名字从小到大\n");
	printf("姓名\t\t学号\t\t\t课程名/分数\n");
	printf("\t\t\t\t现控\t自控\t线代\t高数\t电机\t电路\t运动控制\t英语\n");
	printf("----------------------------------------------------------------------------------------------------\n");
	quick_sort(student,0,NUM-1);
	for( i=0;i<NUM;i++)
	{//打印所有学生信息
	
		printf("%s\t%d\t\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\t%d \n",student[i].name,student[i].ID,student[i].xiankong,	student[i].zikong,student[i].xiandai,
			student[i].gaoshu,student[i].dianji,student[i].dianlu,student[i].yundongkongzhi,student[i].english);
	}
	printf("----------------------------------------------------------------------------------------------------\n");
	//按学号选择排序,从小到大
	printf("选择排序法:按学号从小到大\n");
	printf("姓名\t\t学号\t\t\t课程名/分数\n");
	printf("\t\t\t\t现控\t自控\t线代\t高数\t电机\t电路\t运动控制\t英语\n");
	printf("----------------------------------------------------------------------------------------------------\n");
	for( i=0;i<NUM-1;i++)
	{
		for(j=i+1;j<NUM;j++)
		{
			if(student[i].ID>student[j].ID)
			{
				swap(&student[i],&student[j]);
			}
		}
	}
	for( i=0;i<NUM;i++)
	{//打印所有学生信息
		printf("%s\t%d\t\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\t%d \n",student[i].name,student[i].ID,student[i].xiankong,	student[i].zikong,student[i].xiandai,
			student[i].gaoshu,student[i].dianji,student[i].dianlu,student[i].yundongkongzhi,student[i].english);
	}
	printf("----------------------------------------------------------------------------------------------------\n");
	//输入学号或姓名,输出课程名,分数,平均分
	i = 0;
	printf("请输入数字进行操作:1学号 2姓名 3查看课程 4查看挂科信息 0退出:\n");
	scanf("%d",&key);
	if(key==1)
	{
		while(key)
		{
			if(i!=NUM)
				printf("请输入学号:\n");
			scanf("%d",&xuehao);
			for( i=0;i<NUM;i++)
			{
				if(xuehao == student[i].ID)
				{
					key = 0;
					printf("姓名\t\t学号\t\t\t课程名/分数\n");
					printf("\t\t\t\t现控\t自控\t线代\t高数\t电机\t电路\t运动控制\t英语\t平均分\n");
					printf("----------------------------------------------------------------------------------------------------\n");
					printf("%s\t%d\t\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\t%d\t%d \n",student[i].name,student[i].ID,student[i].xiankong,	student[i].zikong,student[i].xiandai,
				student[i].gaoshu,student[i].dianji,student[i].dianlu,student[i].yundongkongzhi,student[i].english,student[i].ave);
				break;
				}
			}
			if(i==NUM)
				printf("该学号不存在,请重新输入:\n");
		}
	}
	else if(key==2)
	{	
		while(key)
		{
			if(i!=NUM)
				printf("请输入姓名:\n");
			scanf("%s",&xingming);
			for( i=0;i<NUM;i++)
			{
				// if(strcmp(xingming,student[i].name)==0)
				p = strstr(student[i].name,xingming);
				if(p!=NULL)
				{
					key = 0;
					printf("姓名\t\t学号\t\t\t课程名/分数\n");
					printf("\t\t\t\t现控\t自控\t线代\t高数\t电机\t电路\t运动控制\t英语\t平均分\n");
					printf("----------------------------------------------------------------------------------------------------\n");
					printf("%s\t%d\t\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\t%d\t%d\n",student[i].name,student[i].ID,student[i].xiankong,	student[i].zikong,student[i].xiandai,
				student[i].gaoshu,student[i].dianji,student[i].dianlu,student[i].yundongkongzhi,student[i].english,student[i].ave);
				break;
				}
			}
			if(i==NUM)
				printf("该学生不存在,请重新输入:\n");
		}
	}
	
	else if(key==3)
	{
		while(key)
		{		
			if(i!=NUM)
				printf("请输入课程:\n");

			scanf("%s",&a);
			for( i=0;i<8;i++)
			{
				p = strstr(kecheng[i],a);
				if(p!=NULL)
				{
					key = 0;
					counts = 0;
					sum = 0;
					switch(i)
					{
						case 0:
							printf("姓名\t\t学号\t\t课程名/分数:现控\n");
							printf("----------------------------------------------------------------------------------------------------\n");
							for(j=0;j<NUM;j++)
							{
								if(student[j].xiankong!=0)
								{	counts++;
									sum+=student[j].xiankong;
									printf("%s\t%d\t\t%d \n",student[j].name,student[j].ID,student[j].xiankong);
								}						
							}						
							break;
						case 1:
							printf("姓名\t\t学号\t\t课程名/分数:自控\n");
							printf("----------------------------------------------------------------------------------------------------\n");
							for(j=0;j<NUM;j++)
							{
								if(student[j].zikong!=0)
								{	counts++;
									sum+=student[j].zikong;
									printf("%s\t%d\t\t%d \n",student[j].name,student[j].ID,student[j].zikong);
								}						
							}							
							break;
						case 2:
							printf("姓名\t\t学号\t\t课程名/分数:线代\n");
							printf("----------------------------------------------------------------------------------------------------\n");
							for(j=0;j<NUM;j++)
							{
								if(student[j].xiandai!=0)
								{	counts++;
									sum+=student[j].xiandai;
									printf("%s\t%d\t\t%d \n",student[j].name,student[j].ID,student[j].xiandai);
								}						
							}							
							break;
						case 3:
							printf("姓名\t\t学号\t\t课程名/分数:高数\n");
							printf("----------------------------------------------------------------------------------------------------\n");
							for(j=0;j<NUM;j++)
							{
								if(student[j].gaoshu!=0)
								{	counts++;
									sum+=student[j].gaoshu;
									printf("%s\t%d\t\t%d \n",student[j].name,student[j].ID,student[j].gaoshu);
								}						
							}							
							break;
						case 4:
							printf("姓名\t\t学号\t\t课程名/分数:电机\n");
							printf("----------------------------------------------------------------------------------------------------\n");
							for(j=0;j<NUM;j++)
							{
								if(student[j].dianji!=0)
								{	counts++;
									sum+=student[j].dianji;
									printf("%s\t%d\t\t%d \n",student[j].name,student[j].ID,student[j].dianji);
								}						
							}							
							break;
						case 5:
							printf("姓名\t\t学号\t\t课程名/分数:电路\n");
							printf("----------------------------------------------------------------------------------------------------\n");
							for(j=0;j<NUM;j++)
							{
								if(student[j].dianlu!=0)
								{	counts++;
									sum+=student[j].dianlu;
									printf("%s\t%d\t\t%d \n",student[j].name,student[j].ID,student[j].dianlu);
								}						
							}							
							break;
						case 6:
							printf("姓名\t\t学号\t\t课程名/分数:运动控制\n");
							printf("----------------------------------------------------------------------------------------------------\n");
							for(j=0;j<NUM;j++)
							{
								if(student[j].yundongkongzhi!=0)
								{	counts++;
									sum+=student[j].yundongkongzhi;
									printf("%s\t%d\t\t%d \n",student[j].name,student[j].ID,student[j].yundongkongzhi);
								}						
							}							
							break;
						case 7:
							printf("姓名\t\t学号\t\t课程名/分数:英语\n");
							printf("----------------------------------------------------------------------------------------------------\n");
							for(j=0;j<NUM;j++)
							{
								if(student[j].english!=0)
								{	counts++;
									sum+=student[j].english;
									printf("%s\t%d\t\t%d \n",student[j].name,student[j].ID,student[j].english);
								}						
							}							
							break;
					}					
					printf("----------------------------------------------------------------------------------------------------\n");
					printf("选修该课程人数:%d\t全班平均分:%d\n\n",counts,sum/counts);
					break;
				}				
			}
			if(i==NUM)
				printf("该课程不存在,请重新输入:\n");

		}

	}
	else if(key==4)
	{	
		counts=0;
		printf("姓名\t\t学号\t\t挂科课程名/分数:现控\n");
		printf("----------------------------------------------------------------------------------------------------\n");
		for( i=0;i<NUM;i++)
		{
			if(student[i].xiankong<60&&student[i].xiankong>0)
			{
				counts++;
				printf("%s\t%d\t\t%d\n",student[i].name,student[i].ID,student[i].xiankong);			
			}							
		}
		printf("----------------------------------------------------------------------------------------------------\n");
		printf("线控挂科人数:%d\n\n",counts);
		
		counts=0;
		printf("姓名\t\t学号\t\t挂科课程名/分数:自控\n");
		printf("----------------------------------------------------------------------------------------------------\n");
		for( i=0;i<NUM;i++)
		{
			if(student[i].zikong<60&&student[i].zikong>0)
			{
				counts++;
				printf("%s\t%d\t\t%d\n",student[i].name,student[i].ID,student[i].zikong);			
			}							
		}
		printf("----------------------------------------------------------------------------------------------------\n");
		printf("自控挂科人数:%d\n\n",counts);
		
		counts=0;
		printf("姓名\t\t学号\t\t挂科课程名/分数:线代\n");
		printf("----------------------------------------------------------------------------------------------------\n");
		for( i=0;i<NUM;i++)
		{
			if(student[i].xiandai<60&&student[i].xiandai>0)
			{
				counts++;
				printf("%s\t%d\t\t%d\n",student[i].name,student[i].ID,student[i].xiandai);			
			}							
		}
		printf("----------------------------------------------------------------------------------------------------\n");
		printf("线代挂科人数:%d\n\n",counts);
		
		counts=0;
		printf("姓名\t\t学号\t\t挂科课程名/分数:高数\n");
		printf("----------------------------------------------------------------------------------------------------\n");
		for( i=0;i<NUM;i++)
		{
			if(student[i].gaoshu<60&&student[i].gaoshu>0)
			{
				counts++;
				printf("%s\t%d\t\t%d\n",student[i].name,student[i].ID,student[i].gaoshu);			
			}							
		}
		printf("----------------------------------------------------------------------------------------------------\n");
		printf("高数挂科人数:%d\n\n",counts);
		
		counts=0;
		printf("姓名\t\t学号\t\t挂科课程名/分数:电机\n");
		printf("----------------------------------------------------------------------------------------------------\n");
		for( i=0;i<NUM;i++)
		{
			if(student[i].dianji<60&&student[i].dianji>0)
			{
				counts++;
				printf("%s\t%d\t\t%d\n",student[i].name,student[i].ID,student[i].dianji);			
			}							
		}
		printf("----------------------------------------------------------------------------------------------------\n");
		printf("电机挂科人数:%d\n\n",counts);
		
		counts=0;
		printf("姓名\t\t学号\t\t挂科课程名/分数:电路\n");
		printf("----------------------------------------------------------------------------------------------------\n");
		for( i=0;i<NUM;i++)
		{
			if(student[i].dianlu<60&&student[i].dianlu>0)
			{
				counts++;
				printf("%s\t%d\t\t%d\n",student[i].name,student[i].ID,student[i].dianlu);			
			}							
		}
		printf("----------------------------------------------------------------------------------------------------\n");
		printf("电路挂科人数:%d\n\n",counts);
		
		counts=0;
		printf("姓名\t\t学号\t\t挂科课程名/分数:运动控制\n");
		printf("----------------------------------------------------------------------------------------------------\n");
		for( i=0;i<NUM;i++)
		{
			if(student[i].yundongkongzhi<60&&student[i].yundongkongzhi>0)
			{
				counts++;
				printf("%s\t%d\t\t%d\n",student[i].name,student[i].ID,student[i].yundongkongzhi);			
			}							
		}
		printf("----------------------------------------------------------------------------------------------------\n");
		printf("运动控制挂科人数:%d\n\n",counts);
		
		counts=0;
		printf("姓名\t\t学号\t\t挂科课程名/分数:英语\n");
		printf("----------------------------------------------------------------------------------------------------\n");
		for( i=0;i<NUM;i++)
		{
			if(student[i].english<60&&student[i].english>0)
			{
				counts++;
				printf("%s\t%d\t\t%d\n",student[i].name,student[i].ID,student[i].english);			
			}							
		}
		printf("----------------------------------------------------------------------------------------------------\n");
		printf("英语挂科人数:%d\n\n",counts);
	}
	else
		return;
	//输入课程名称,输出该课程的成绩和平均分

}

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值