2020-12-08




#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 30
typedef struct student                                                                    //结构体定义:学号、姓名、成绩
{                                                            
    long studentID;
	char studentName[10];
	int score[3];
}STUDENT; 
void InputScore(STUDENT stu[],int s);														 //函数声明                                            
void cd(STUDENT stu[],int n);
void pingjun(STUDENT stu[],int n);
void DescendingandAscending(STUDENT stu[],int n);
void DateNum(STUDENT stu[],int n);
void DateName(STUDENT stu[],int n);
int LinSearch(STUDENT stu[],long x,int n);
int LinSearchname(STUDENT stu[],char name[],int n);
void RateScore(STUDENT stu[],int n);
void PrintfScoreNum(STUDENT stu[],int n,float sumcorse[],float  avercorse[]);
void Printf(STUDENT stu[],int n);
void Swapnum(long *a,long *b);
void Swapsum(int*a,int *b);
void Swapscore(int *a,int *b);
void WritetoFile(STUDENT stu[],int s);
int ReadfromFILE(STUDENT stu[]);                                                           //从文件中读取成绩
main()

{
	int n,m,pos=0,i,s;
	long x=0;
	float avercorse[3]={0},averstudent[N]={0},sumcorse[3]={0},sumstudent[N]={0};
	char name[10];
	STUDENT stu[N];
		printf("▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁★★★★★▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\n");
		printf("☆☆☆☆☆☆☆☆☆☆欢迎来到学生成绩管理系统V5.0(╯▽╰)☆☆☆☆☆☆☆☆☆☆☆☆\n");
	printf("输入学生总数");                                                                //输入学生人数
	scanf("%d",&s);
	InputScore(stu,s);
	n=25+s;
	while(m!=0)
	{	
		printf("☆☆★★★★★☆☆☆☆☆★★★★★菜单栏★★★★★☆☆☆☆☆★★★★★☆☆\n"); 
		printf("◎退出程序输入0\n"); 
		printf("◎计算每门课程的总分和平均分                                             输入1\n");
		printf("◎计算每个学生的总分和平均分                                             输入2\n");
		printf("◎按每个学生的总分由高到低                                               输入3\n");
		printf("◎按每个学生的总分由低到高                                               输入4\n");
		printf("◎学号有小到大排出成绩表                                                 输入5\n");
		printf("◎按姓名在字典中的排序                                                   输入6\n");
		printf("◎按学号查询学生排名及各科考试成绩比                                     输入7\n");
		printf("◎按姓名查询学生排名及各科考试成绩比                                     输入8\n");
		printf("◎求成绩各个分段百分比                                                   输入9\n");
		printf("◎输出每个学生的全部信息                                                 输入10\n");
		printf("◎将学生信息写入文件                                                     输入11\n");
		printf("◎从文件中读取学生信息                                                   输入12\n");
		scanf("%d",&m);
		switch(m)
		{
			case 1:
					cd(stu,n);
					break;
			case 2:
					pingjun(stu,n);
					break;
			case 3:
					DescendingandAscending(stu,n,1);
					Printf(stu,n);
					break;
			case 4:
					DescendingandAscending(stu,n,2) ;
					Printf(stu,n);
					break;
			case 5:
					DateNum(stu,n);                                                          
					Printf(stu,n);
					break;
			case 6:
					DateName(stu,n);
					Printf(stu,n);
					break;
			case 7:
					{
						int j;
 				     	DescendingandAscending(stu,n,1);
						printf("***************按学号查找学生**************\n");
						printf("请输入你要寻找学生的学号:");
						scanf("%ld",&x);												//以长整形格式从键盘输入待查找的学号x
						pos=LinSearch(stu,x,n);											//查找学生
						if(pos!=-1)														//若找到,则打印其分数
						{
							printf("姓名\t高数\t大物\t计算机\t排名\n");
							printf("%-8s",stu[pos].studentName);
							for(j=0;j<3;j++)
							{
								printf("%d\t",stu[pos].score[j]);
							}
								printf("第%d名\n",pos+1);
						}
						else															//若未找到,则打印“未找到”提示信息
						printf("未找到此学生\n");
						printf("*******************************************\n");
						break;
					}

			case 8:
					{
						int j;
 						DescendingandAscending(stu,n,1);
						printf("***************按姓名查找学生**************\n");
						printf("输入你想查找的学生姓名:\n");
						scanf("%s",name);
						pos=LinSearchname(stu,name,n);
						if(pos!=-1)
						{
							printf("姓名\t高数\t大物\t计算机\t:\n");
							printf("%-8s",stu[pos].studentName);
							for(j=0;j<3;j++)
							{
								printf("%d\t",stu[pos].score[j]);
							}
						
							printf("第%d名\n",pos+1);
						
						}
						else														//若未找到,则打印“未找到”提示信息
							printf("未找到此学生\n");
							printf("*******************************************\n");
							break;
					}
			case 9:
					RateScore(stu,n);
					break;

			case 10:
					PrintfScoreNum(stu,n,sumcorse,avercorse);
					break;
			case 11:
					WritetoFile(stu,s);
					break;
			case 12:
					i= ReadfromFILE(stu);
					Printf(stu,i);
					break;
			}
	}
}
void InputScore(STUDENT stu[],int s)															/*学生成绩的数据输入*/
{
	int i,j,m=3;
	for(i=0;i<s;i++)
	{
		printf("依次输入第 %d 名学生的学号、姓名、高数、大物、计算机成绩:",i+1);
		scanf("%ld",&stu[i].studentID);
		scanf("%s",stu[i].studentName);
	for(j=0;j<m;j++)
	{
		scanf("%d",&stu[i].score[j]);
	}
	}
}

void cd(STUDENT stu[],int n)														 /*三门课程分别的平均成绩和总成绩*/
{
	double h=0;
	int i,j;
	printf("○○○○平均成绩○○○○○○○○○○总成绩○○○○○○○○○○○○○○○○\n");
	printf("\n");
   for(i=0;i<3;i++)
	{   double f=0;
		for(j=0;j<n;j++)
		{
			f+=stu[j].score[i];
		}
	        h=f/n;
			printf("第%d门课的平均成绩%-4lf总成绩%-4lf\n",i+1,h,f);
   }
       printf("\n");
}
void pingjun(STUDENT stu[],int n)                                                      /*每个学生的平均成绩以及总成绩*/
{
	double h=0;
	int i,j;
	printf("○○○○平均成绩○○○○○○○○○○总成绩○○○○○○○○○○○○○○○○\n");
		printf("\n");
	for(i=0;i<n;i++)
	{double f=0;
		for(j=0;j<3;j++)
		{
			f+=stu[i].score[j];
		}
	        h=f/3;
			printf("%-8s平均成绩%-4lf            总成绩%-4lf\n",stu[i].studentName,h,f);
	}
		printf("\n");
}
void DescendingandAscending(STUDENT stu[],int n,int z)          /*按每个学生的总分由高到低以及由低到高输出*/
{	
	int i,j,m,t,sum[N];
	char temp[10];
	for(i=0;i<n;i++)
	{
		for(j=0;j<3;j++)
		{
			sum[i]=sum[i]+stu[i].score[j];
		}
	}
	for(t=0;t<n-1;t++)
	{
		for(m=t+1;m<n;m++)
		{	if(z==1)
			{
				if(sum[t]<sum[m])								 
				{
					 Swapsum(&sum[t],&sum[m]);
					 Swapnum(&stu[t].studentID,&stu[m].studentID);
					 Swapscore(stu[t].score,stu[m].score);
					 strcpy(temp,stu[t].studentName);
					 strcpy(stu[t].studentName,stu[m].studentName);
					 strcpy(stu[m].studentName,temp);
				}
			}
			else
			{
				if(sum[t]>sum[m])								 
				{
					 Swapsum(&sum[t],&sum[m]);
					 Swapnum(&stu[t].studentID,&stu[m].studentID);
					 Swapscore(stu[t].score,stu[m].score);
					 strcpy(temp,stu[t].studentName);
					 strcpy(stu[t].studentName,stu[m].studentName);
					 strcpy(stu[m].studentName,temp);
				}
			}
		}
	}
}
void Swapsum(int *a,int *b)															//对总成绩进行交换
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
void Swapnum(long *a,long *b)                                                      //输入学号交换学号的函数
{
	long temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
void Swapscore(int *a,int *b)                                                      //输入成绩交换成绩的函数
{
	int temp[3],i;
	for(i=0;i<3;i++)
	{
		temp[i]=a[i];
		a[i]=b[i];
		b[i]=temp[i];
	}
}
void DateNum(STUDENT stu[],int n)                                                          /*按学号由小到大排出成绩表*/
{
	STUDENT temp;
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=i;j<n;j++)
		{
			if(stu[j].studentID<stu[i].studentID)
			{
				temp=stu[i];
				stu[i]=stu[j];
				stu[j]=temp;
			}
		}
		printf(stu,n);
	}
}
void DateName(STUDENT stu[],int n)                                                    /*按姓名在字典中的排序输出成绩 */
{
	int i,j,k;
	char temp[10];
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(strcmp(stu[i].studentName,stu[j].studentName)>0)
			{
				 Swapnum(&stu[i].studentID,&stu[j].studentID);	            //交换学号
				 Swapscore(stu[i].score,stu[j].score);                      //交换成绩   
				 strcpy(temp,stu[i].studentName);                           // 交换姓名
				 strcpy(stu[i].studentName,stu[j].studentName);
				 strcpy(stu[j].studentName,temp);
			}
		}
	}
}
int LinSearch(STUDENT stu[],long x,int n)
{
	int i;
	printf("****************查找结果如下***************\n");
	for(i=0;i<n;i++)
	{
		if (stu[i].studentID==x)						//若找到则返回x在数组中的下标
			return i;
	}
		return -1;										//若循环结束仍未找到,则返回-1
}

int LinSearchname(STUDENT stu[],char name[],int n)
{
	int i;
	printf("****************查找结果如下***************\n");
	
	for(i=0;i<n;i++)									
	 {
		 if(strcmp(name,stu[i].studentName)==0)
			   return i;								//若找到则返回x在数组中的下标
	 }
	 return -1;											//若循环结束仍未找到,则返回-1
}
void RateScore(STUDENT stu[],int n)
{
	
	int i,a,b,c,d,e,j;
	float rate1,rate2,rate3,rate4,rate5;
	printf("*****************成绩各分段占比****************\n");
	for(j=0;j<3;j++)
	{
		a=0;b=0;c=0;d=0;e=0;
		for(i=0;i<n;i++)
		{
			if(stu[i].score[j]>=90&&stu[i].score[j]<=100)		//计算每个分数段的人数
			a++;
			if(stu[i].score[j]>=80&&stu[i].score[j]<90)
			b++;
			if(stu[i].score[j]>=70&&stu[i].score[j]<80)
			c++;
			if(stu[i].score[j]>=60&&stu[i].score[j]<70)
			d++;
			if(stu[i].score[j]>=0&&stu[i].score[j]<60)
			e++;	
			rate1=(float)a/n;									//求得各个分数段的人数占比
			rate2=(float)b/n;
			rate3=(float)c/n;
			rate4=(float)d/n;
			rate5=(float)e/n;
		}
		switch(j)												//输出结果
		{
			case 0:
			printf("高数成绩:\n");
			printf("\t优秀人数:%d    所占百分比:%.2f%%\n",a,rate1*100);
			printf("\t良好人数:%d    所占百分比:%.2f%%\n",b,rate2*100);
			printf("\t中等人数:%d    所占百分比:%.2f%%\n",c,rate3*100);
			printf("\t及格人数:%d    所占百分比:%.2f%%\n",d,rate4*100);
			printf("\t不及格人数:%d 所占百分比:%.2f%%\n",e,rate5*100);
			break;
			case 1:
			printf("大物成绩:\n");
			printf("\t优秀人数:%d   所占百分比:%.2f%%\n",a,rate1*100);
			printf("\t良好人数:%d   所占百分比:%.2f%%\n",b,rate2*100);
			printf("\t中等人数:%d   所占百分比:%.2f%%\n",c,rate3*100);
			printf("\t及格人数:%d   所占百分比:%.2f%%\n",d,rate4*100);
			printf("\t不及格人数:%d 所占百分比:%.2f%%\n",e,rate5*100);
			break;
			case 2:
			printf("计算机成绩:\n");
			printf("\t优秀人数:%d   所占百分比:%.2f%%\n",a,rate1*100);
			printf("\t良好人数:%d   所占百分比:%.2f%%\n",b,rate2*100);
			printf("\t中等人数:%d   所占百分比:%.2f%%\n",c,rate3*100);
			printf("\t及格人数:%d   所占百分比:%.2f%%\n",d,rate4*100);
			printf("\t不及格人数:%d 所占百分比:%.2f%%\n",e,rate5*100);
			break;
		}
	}
	printf("*********************************************\n");
}

void PrintfScoreNum(STUDENT stu[],int n,float sumcorse[],float avercorse[])
{
	int i,j,k;
	printf("*****************学生各类信息****************\n");
	printf("学号\t姓名\t高数\t大物\t计算机\t\n");
	for(i=0;i<n;i++)
	{	
		printf("%ld\t",stu[i].studentID);												//输出学生学号
		printf("%-8s",stu[i].studentName);												//输出学生姓名
		for(j=0;j<3;j++)																//输出学生各科成绩
		{
			printf("%d\t",stu[i].score[j]);
		}
		printf("\n");
	}
	for(j=0;j<3;j++)																	//计算每门课程的总分
	{
		for(i=0;i<n;i++)
		{
			sumcorse[j]=sumcorse[j]+stu[i].score[j];
		}
		avercorse[j]=sumcorse[j]/n;														//计算每门课程的平均分
	}
		printf("高数  总成绩和平均成绩分别是:%.2f\t%.2f\n",sumcorse[0],avercorse[0]);	//输出每门课程的总分与平均分
		printf("大物  总成绩和平均成绩分别是:%.2f\t%.2f\n",sumcorse[1],avercorse[1]);
		printf("计算机总成绩和平均成绩分别是:%.2f\t%.2f\n",sumcorse[2],avercorse[2]);
		printf("*********************************************\n");
}
void Printf(STUDENT stu[],int n)                                                                       /*成绩打印函数*/
{
	int i,j;
	for(i=0;i<n;i++)
	{
		printf("%ld\n",stu[i].studentID);
		puts(stu[i].studentName);
		printf("各科成绩: 高数\t 大物\t 计算机\t\n:");
		for(j=0;j<3;j++)
		{
			printf("%d\t",stu[i].score[j]);
		}
		printf("\n");
	}
}
void WritetoFile(STUDENT stu[],int s)                                                                      /*成绩读取*/
{
	FILE *fp;
	int i,j;
	if((fp=fopen("student.txt","a"))==NULL)					
	{
		printf("failure to open student.txt!\n");
		exit(0);
	}
for(i=0;i<s;i++)
{
	fprintf(fp,"%10ld%8s",stu[i].studentID,stu[i].studentName);
    for(j=0;j<3;j++)
	{
		 fprintf(fp,"%4d",stu[i].score[j]);
	}
	fprintf(fp,"\n");
}
	fclose(fp);
}
int ReadfromFILE(STUDENT stu[])                                                                            /*成绩写入*/
{
	FILE *fp;
	int i,j;
	if((fp=fopen("student.txt","r"))==NULL)				//判断文件是否成功打开
	{
		printf("failure to open student.txt!\n");
		  exit(0);
	}
	for(i=0;!feof(fp);i++)								//把文件中的数据写入结构体中
	{
		fscanf(fp,"%10ld",&stu[i].studentID);			
		fscanf(fp,"%8s",&stu[i].studentName);
		for(j=0;j<3;j++)
			fscanf(fp,"%4d",&stu[i].score[j]);
	}
	fclose(fp);											//关闭文件
	return i-1;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值