C语言--(初级)学生成绩管理系统

本人通行工程专业,现在主要涉及的方向有单片机和人工智能方向,主要还是硬件方向,如果有相同专业爱好的小伙伴,可以加qq2441860278进行交流!
大一生活结束了,写了一个学生成绩管理端来复习C语言的期末考试,其涵盖了本学期所学习的大部分知识点。
如果有误,欢迎各位指正。

本系统的功能主要有6个,如下图:可以通过菜单栏选择不同的功能。程序每完成一项功能,能够返回起始菜单页去选择其他功能选项。C语言--(初级)学生成绩管理系统_第1张图片
话不多说,直接上代码。

#include 
#include 
#include 

//函数声明
void jisuan();//计算学生的平均分及总分,方便处理,ps:先读入再计算
void show();//显示主菜单栏
void choose();//选择不同的功能
void fileread();//从stuscore.in文件中读入学生信息和成绩
void paverage();//进行个人成绩分析
void count();//进行单科成绩分析
void sort();//按总分对学生从高到低排序
void filewrite();//将学生成绩及统计分析结果写入到文件stuscore.out
//定义一个学生结构体,包含学生信息
typedef struct
{   
	int id[11],score[4],sum;
    char name[11];
    double aver;
}stu;
//定义课程结构体,包含课程相关信息
typedef struct
{   
	int sum,max,min,num[5];
    double aver;
}course;

stu stu1[8];//放8位学生
course grade[4];//放4科目成绩
//4个科目
char *subject[4]={"数学","物理","英语","计算机"};

void main()
{
	{
	choose();
	}
}
//计算学生的平均分及总分,方便处理
void jisuan()
{
int i,j;
	for(j=0;j<4;j++)
	{	
		for(i=0;i<8;i++)
		{
			if(stu1[i].score[j]<60)	
				(grade[j].num[0])++;
			if(stu1[i].score[j]>=60 && stu1[i].score[j]<70) 
				(grade[j].num[1])++;
			if(stu1[i].score[j]>=70 && stu1[i].score[j]<80) 
				(grade[j].num[2])++;
			if(stu1[i].score[j]>=80 && stu1[i].score[j]<90) 
				(grade[j].num[3])++;
			if(stu1[i].score[j]>=90 && stu1[i].score[j]<=100) 
				(grade[j].num[4])++;
		}
	}
	for(j=0;j<4;j++)
	{	
		for(i=0;i<8;i++)
		{	
			grade[j].sum+=stu1[i].score[j];
			grade[j].aver = grade[j].sum/8.0;
		}
	}
}

void showmain()
{
    printf("\t\t\t *********************************\n");
    printf("\t\t\t *   欢迎使用学生成绩管理系统    *\n");
    printf("\t\t\t *      1.读入学生成绩           *\n");
    printf("\t\t\t *      2.个人成绩分析           *\n");
    printf("\t\t\t *      3.单科成绩分析           *\n");
    printf("\t\t\t *      4.学生成绩排序           *\n");
    printf("\t\t\t *      5.生成成绩文件           *\n");
    printf("\t\t\t *      6.结束                   *\n");
    printf("\t\t\t *********************************\n");
    printf("\t\t\t            请选择1~6:  ");   
}

void choose()
{
	int choice;
	do{
		showmain();
		scanf("%d",&choice);//输入选择
		switch(choice)
	        {
	        case 1:
	            fileread();//读入
				jisuan();//先读入再计算
	            break;
	        case 2:
	        	paverage();
	        	break;
	        case 3:
	        	count();
	        	break;
	        case 4:
	        	sort();
	        	break;
	        case 5:
	        	filewrite();
	        	break;
			case 6:
	        	printf("成功退出!\n");
	        	break;
	        default:
			    printf("input error!");
	            break;
	        }
	}while(choice!=6);
}

//读入函数
void fileread()
{	
	FILE *fp = fopen("D:/Users/123/Desktop/stuscore.in","r+");//填写文件绝对路径
    int i,j,k;
	if(fp==NULL)//判误
	{
		printf("\nopen file failed!\n");
	}
	for(i=0;i<8;i++)//循环读取8位学生信息
	{
		for(j=0;j<11;j++)	
		{
			fscanf(fp,"%1d",&stu1[i].id[j]);//读学号
		}
		fscanf(fp,"%s",&stu1[i].name);		//读姓名
		for(k=0;k<4;k++)  	
		{	
			fscanf(fp,"%d",&stu1[i].score[k]);//读分数		
		}	
	}
	printf("  \t\t\t数据读入完毕,请选择其他操作!\n");
	fclose(fp);//关闭文件
}

//
void paverage()
{
	int i,j,k;
	printf("  \t\t\t\t各学生成绩统计分析:\n");
	printf("       学号       姓名     数学   物理   英语  计算机  	 总分      平均成绩\n" );
	for(i=0;i<8;i++)
	{
		stu1[i].sum=0;
		stu1[i].aver=0;
		for(j=0;j<11;j++)
		{
			printf("%d",stu1[i].id[j]);//打印出学号
		}
		for(k=0;k<4;k++)
		{
			stu1[i].sum+=stu1[i].score[k];//求总分
		}
		stu1[i].aver=stu1[i].sum/4.0;//算平均分
	printf("%11s      %2d     %2d     %2d     %2d       %3d        %4.2f\n",\
	stu1[i].name,stu1[i].score[0],stu1[i].score[1],stu1[i].score[2],stu1[i].score[3],stu1[i].sum,stu1[i].aver);}
	printf("\t\t\t各学生成绩分析完毕,请选择其他操作!\n");
}

void count()
{
	int i,j;
	printf("  \t\t\t\t单科成绩统计分析:\n");
	printf("	  课程   最高分    最低分  平均分   不及格   及格   中等   良好   优秀\n");
	for(i=0;i<4;i++)
	{
		grade[i].min = 100;
		grade[i].max = 0;
		for(j=0;j<8;j++)
		{	
			if(stu1[j].score[i]>grade[i].max)
				grade[i].max=stu1[j].score[i];
			if(stu1[j].score[i]<grade[i].min)	
				grade[i].min=stu1[j].score[i];
		}
	}

	for(i=0;i<4;i++)
	{	
		printf("	%6s     %2d      %2d       %4.2f    %2d      %2d     %2d     %2d     %2d\n",\
			subject[i],grade[i].max,grade[i].min,grade[i].aver,grade[i].num[0],grade[i].num[1],grade[i].num[2],grade[i].num[3],grade[i].num[4]);
	}	
	printf("  \t\t\t单科成绩分析完毕,请选择其他操作!\n");
}

//交换函数,注意形参必须为指针,不然无法交换(文末解释)
void Swap(stu *a,stu *b)
{
    stu temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
//排序
void sort()
{
	int i,j;
	for (j = 0; j < 8; j++)
			{
				for (i = 0; i < 8; i++)
				{
					if (stu1[i+1].sum > stu1[i].sum)//按照总分由高到低排序
					{
						Swap(&stu1[i+1],&stu1[i]);
					}
				}
			}
	printf("\t\t\t\t\t学生成绩排序:\n");
	printf("       学号       姓名     数学   物理   英语  计算机  	 总分      平均成绩 名次\n" );
	for (i = 0; i < 8; i++)
	{
		for(j=0;j<11;j++)
		{
			printf("%d",stu1[i].id[j]);//打印出学号
		}	
		printf("%11s      %2d     %2d     %2d     %2d       %3d        %4.2f   %2d\n",\
			stu1[i].name,stu1[i].score[0],stu1[i].score[1],stu1[i].score[2],stu1[i].score[3],stu1[i].sum,stu1[i].aver,i+1);
	}
	printf("  \t\t\t成绩排序完毕,请选择其他操作!\n");
}

void filewrite()
{	
	int i,j;
	FILE *fp;
	fp=fopen("D:/Users/123/Desktop/stuscore.out","w+"); 
	fprintf(fp,"\t\t\t\t\t学生成绩排序:\n");//写入格式
    fprintf(fp,"       学号       姓名     数学   物理   英语  计算机  	 总分      平均成绩 名次\n" );
	for (i = 0; i < 8; i++)//
	{
		for(j=0;j<11;j++)
		{
			fprintf(fp,"%d",stu1[i].id[j]);//写入学号
		}	
		fprintf(fp,"%11s      %2d     %2d     %2d     %2d       %3d        %4.2f   %2d\n",\
			stu1[i].name,stu1[i].score[0],stu1[i].score[1],stu1[i].score[2],stu1[i].score[3],stu1[i].sum,stu1[i].aver,i+1);//写入学生成绩相关信息
	}
	fprintf(fp,"  \t\t\t\t单科成绩统计分析:\n");
	fprintf(fp,"  课程   最高分  最低分  平均分   不及格   及格   中等   良好  优秀\n");
	for(i=0;i<4;i++)
	{	
		fprintf(fp,"%6s    %2d     %2d     %4.2f     %2d       %2d      %2d     %2d     %2d\n",\
			subject[i],grade[i].max,grade[i].min,grade[i].aver,grade[i].num[0],grade[i].num[1],grade[i].num[2],grade[i].num[3],grade[i].num[4]);//写入成绩排序
	}	
	fclose(fp);
	printf("\t\t\t已将成绩成功输入到文件,请选择其他操作!\n");
} 

C语言--(初级)学生成绩管理系统_第2张图片C语言--(初级)学生成绩管理系统_第3张图片C语言--(初级)学生成绩管理系统_第4张图片C语言--(初级)学生成绩管理系统_第5张图片

C语言--(初级)学生成绩管理系统_第6张图片C语言--(初级)学生成绩管理系统_第7张图片
我们分析一下其中的交换顺序函数,首先形参必须为指针,因为形参在函数运行结束后会释放分配的内存,值传递(传递的只是一份副本)导致无法交换,应该为地址传递。
因此定义一个结构体变量(中间变量),对传进来的地址进行指针运算,得到实际的变量,对其进行交换。
再解释下为什么会将计算分数封装成函数。首先使程序模块化,思路更清晰。其次是如果将其写在函数内部,若对函数进行多次调用,则数据会出现重复计算的情况。

今天的分享就到这了,大家晚安!

你可能感兴趣的:(笔记)