学生成绩管理系统

2,041 阅读6分钟

一、实验要求

1.输入、修改和显示n个学生的m门考试科目的成绩,计算总分和平均分。

2.分别按总分和学号进行排序。

3.输入学生的学号,显示该学生的姓名、各门课程的成绩。

4.将输入的学生成绩数据保存到文件中。

5.从文件中读出学生成绩数据,查询学生成绩。

6.程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性

二、实验内容

通过七个子函数分别实现七个功能:

1.  输入一个班的学生记录
2.  显示所有记录         
3.  求出全班平均成绩
4.  输出排名(分别按总分和学号排序)    
5.  输入学号显示该学生的姓名、各门课程的成绩
6.  结果存入文件chengji.txt 
7.  从文件chengji.txt中读出学生成绩数据
8.  生成可执行文件 (主函数中实现)【编译器用的DEV-C++】

缺陷

没有修改功能

三、实验步骤

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

struct Student
{
	int num;       //学号 
	char name[20]; //姓名 
	float pingshi; //平时成绩  
	float shiyan;  //实验成绩
	float kaoshi;  //考试成绩
	double zongfen;//总分 
};

/* 对函数进行声明 */
void a();          /* 输入一个班的学生记录 */
void b();          /* 显示所有记录 */
void c();          /* 求出全班平均成绩 */
void d();          /* 输出成绩与排名 */
void e();          /* 输入学号显示该学生的记录 */
void f(); 	   /* 结果存入文件chengji.txt */
void g();	   /* 从文件中读出学生成绩数据 */ 

struct Student stu[50]; //此处假定班级人数为 50 人 ,输入量比较大,若改变人数以减少输入量(对于子函数中的数值也要随之改变) 

int main()
{

	int n = 0;
	
	while(n != 8)
	{
		printf("\t计算机学生成绩管理系统\n\n");
		printf("1:输入一个班学生成绩记录\n");
		printf("2:显示所有成绩记录\n");
		printf("3:计算并输出平均成绩\n");
		printf("4:分别按总分和学号排序\n");
		printf("5: 输入学号显示该学生的记录\n");
		printf("6:结果存入文件chengji.txt\n");
		printf("7: 从文件中读出学生成绩数据\n");
		printf("8:退出系统\n\n");
		printf("输入选项代码:");
		scanf("%d",&n);
		
		while(n<1 || n>8)
		{
			printf("请按照规则输入:\n");        //判断输入的正确性 
			scanf("%d", &n);
		}
			
		switch(n)
		{
			case 1: a(); 
			
			case 2: b(); 
			
			case 3: c(); 
			
			case 4: d(); 
			
			case 5: e(); 
			
			case 6: f(); 
			
			case 7: g(); break;
			
			case 8: printf("\n*******************谢谢使用!*******************\n"); break;
			
		}	

		system("pause");      //生成可执行文件

		return 0;
	}
	getchar();
}

/*    子  函  数    */

void a()  /* 输入一个班的学生记录*/
 
{
	int i;
 
	for(i=0; i<50; i++)
 
	{   
 
		printf("请输入学号 姓名 平时成绩 实验成绩 考试成绩:");
 
		scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].pingshi,&stu[i].shiyan,&stu[i].kaoshi);   
		
	}
	for(i=0; i<50; i++)
	{
		stu[i].zongfen=0.1*stu[i].pingshi+0.3*stu[i].shiyan+0.6*stu[i].kaoshi;          //总分 
	}
	
}

void b()   /* 显示所有记录*/
 
{
	int i;
	
	printf("\n");
	printf("学号        姓名       平时成绩       实验成绩      考试成绩     总评成绩\n");
 
	for(i=0; i<50; i++)
	{
		printf("%d%14.2s%14.2f%14.2f%14.2f%14.2f\n",stu[i].num,stu[i].name,stu[i].pingshi,stu[i].shiyan,stu[i].kaoshi,stu[i].zongfen);	
	}
	
}
 
void c()   /* 求出全班平均成绩 */
{  
	int a[50];
    int i, j, k;
    double total=0;
    double ave;
    
    for(k = 0; k<50; k++)  //对数组a[50]赋初值 
    {
    	a[k] = k;
    }
    
    for(i=0; i<4; i++)
	{
		total = total+stu[i].zongfen;
	}
    ave=total/4.0;
    printf("总评平均成绩是%f\n", ave);

}

void d()   /* 分别按总分和学号排序 */ 
{
	int a[50];
	int i, j, k, temp, t;
	
	for(k = 0; k<50; k++)  //对数组a[50]赋初值 
    {
    	a[k] = k;
    }
	
	for(j=0; j<3; j++)
	{
		for(i=0; i<3-j; i++)
		if(stu[a[i]].zongfen > stu[a[i+1]].zongfen)
		{	
			temp = a[i];
			a[i] = a[i+1];
			a[i+1] = temp;
		}
	}
 
	printf("\n按总分排序后:\n");
 
	printf("学号     姓名      总评成绩\n");
 
	for(i=0; i<50; i++)
	{
		printf("%d%10.2s%15.2f\n",stu[a[i]].num,stu[a[i]].name,stu[a[i]].zongfen);
	}
	
	for(i = 1; i<49; i++)
	{
		for(j = i+1; j<50; j++)
		{
			if(stu[a[i]].num >stu[a[j]].num )
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	} 
	
	printf("\n按学号排序后:\n");
	
	printf("学号     姓名      总评成绩\n");
 
	for(i=0; i<50; i++)
	{
		printf("%d%10.2s%15.2f\n",stu[a[i]].num,stu[a[i]].name,stu[a[i]].zongfen);
	}
	
	printf("\n");
 
}

void e()    /* 输入学号显示该学生的记录 */
{
	int num;
	int i, k, a[50];
	
	for(k = 0; k<50; k++)  //对数组a[50]赋初值 
    {
    	a[k] = k;
    }
    
	printf("您如果想要查询某个学生的信息,请按照以下步骤进行:\n");
	
	printf("\n请输入你想要查询学生的学号:\n");
	scanf("%d", &num);
	
		for(i = 0; i<50; i++)
		{
			if(num == stu[a[i]].num)
			{
				printf("查询信息如下:\n");
				printf("%14.2s%14.2f%14.2f%14.2f%14.2f\n", stu[i].name,stu[i].pingshi,stu[i].shiyan,stu[i].kaoshi,stu[i].zongfen);	
			}
		}	
	
}
 
void f()    /* 结果存入文件chengji.txt , 保存在你的源程序所在的文件夹中*/
{
	int i;
	FILE * fp;
	fp = fopen("chengji.txt","w");   //写入磁盘的名字为chengji.txt 
 
	fprintf(fp, "学号     姓名    平时成绩    实验成绩    考试成绩   总评成绩\n");
 
	for(i=0; i<50; i++)
	{
		fprintf(fp, "%d%14.2s%14.2f%14.2f%14.2f%14.2f\n",stu[i].num,stu[i].name,stu[i].pingshi,stu[i].shiyan,stu[i].kaoshi,stu[i].zongfen);
	}
 
	printf("\n\n*******************恭喜,保存完成!*******************\n\n");
}

void g()    /* 从文件中读出学生成绩数据 */ 
{
	int i;
	FILE * in;
	char infile[10];
	
	printf("请输入读入文件的名字:\n");   //输入chengji.txt即可 
	scanf("%s", infile);
	
	if((in = fopen(infile, "r")) == NULL) //以只读的方式打开 ,等于NULL就无法打开 
	{
		printf("无法打开此文件\n");
		exit(0);
	} 
	
	printf("学生成绩数据");
	for(i=0; i<50; i++)
	{
		printf("%d%14.2s%14.2f%14.2f%14.2f%14.2f\n",stu[i].num,stu[i].name,stu[i].pingshi,stu[i].shiyan,stu[i].kaoshi,stu[i].zongfen);
	}
} 

四、实验结果

注:

代码中我假定的是50个人,由于输入量的原因,此处是假定为10个人时候的结果。

第一张图

第二张图

第三张图

第四张图

五、实验总结

编程要的是正确的结果,体会的是艰辛的过程,收获的是好心情。 首先编程的时候你不能觉得这是一个繁琐的过程,在遇到出错的时候要有信心解决,不要害怕出错,不能忽略细节,尤其是对标点以及输入输出函数,要正确使用。 其次,编程要有一个扎实的知识储备,没把课本看好,没把例题看好,不会编出正确的程序,同时,如果不多看程序,不多敲程序,不断吸收别人的编程思想,就不会编出精彩的程序。