资讯详情

成绩管理系统

**

绩效管理系统

**

目录 1、问题定义 1 2、系统设计 1 2.1 总体设计 1 2.2 详细设计 3 2.2.1数据结构设计 3 2.2.2 主控main()函数执行过程 3 2.2.输入记录模块 4 2.2.4查询记录模块 4 2.2.5更新记录模块 4 2.2.6.统计记录模块 5 2.2.8函数功能描述 5 3、系统实现 8 3.1 编码 8 3.1.1 程序预处理 8 3.1.2 主函数main() 9 3.1.3 主菜单界面 11 3.1.4 表格形式显示记录 13 3.1.查询学生记录 14 3.1.6 输入数据,增加学生记录 15 3.1.7.删除学生记录 17 3.1.8 修改学生记录 19 3.1.9 统计学生成绩 20 3.1.10 排序学生记录 21 3.1.11 存储学生记录 23 3.1.12 中学生记录阅读文件 24 3.2 测试与调试 26 3.2.1 概述 26 5、归纳总结 32 5.1 开发经验 32 5.2 培训中遇到的问题及解决方案 32 5.3 设计中仍存在的缺点 32 5.4 感受和体验 32 6、参考资料 33

学生成绩管理系统

本主题的设计目的是培养学生的基本编程能力,了解管理信息系统的开发过程,熟悉C语言文件的各种基本操作。本程序涉及结构、文件等知识。通过本程序的培训,学生可以对C语言的文件操作有更深入的了解,掌握文件存储结构的原则,为进一步开发高质量的管理信息系统奠定坚实的基础。

1、问题定义

创建学生成绩管理系统。假设系统中的每个学生记录只包括学号、姓名、数学成绩、英语成绩,C语言成绩、总分、排名等信息。如下图所示,选择任何菜单后,都可以实现相应的功能。

在问题定义阶段,应考虑问题的可行性和需求分析,然后进入开发阶段,完成系统设计和系统实现的任务。

2、系统设计

2.1 总体设计 采用模块化程序设计方法,按照一定的原则将大任务分为小任务,然后分别设计小任务。需要注意的是,划分的模块应该相对独立但相关,易于理解。任务的划分可以通过模块化层次结构图(即模块图)进行分析,一般从上到下进行上层为主模块,下层为上层模块的逐步详细描述。 成绩管理系统需要文件实现,如图2所示.由以下五个功能模块组成: ? 输入记录模块。完成将数据存储到文件中的工作。记录可以从以二进制形式存储的数据文件中读取,也可以从键盘逐个输入学生记录。学生记录由学生的基本信息和成绩信息字段组成。当从数据文件中读取记录时,即将记录复制到文件中。 ? 查询记录模块。完成在文件中查找符合相关条件的学生记录。在这个成绩管理系统中,用户可以根据学生的学号或姓名在文件中搜索。如果找到学生的记录,返回指向学生记录的指针。否则,返回一个值NULL空指针,打印未找到学生记录的提示信息。 ? 更新记录模块。完成学生记录的维护。在这个绩效管理系统中,它修改、删除、插入和排序学生记录,并将修改后的数据存储到源数据文件中。 ? 统计记录模块。统计总分 ? 输出记录模块。一是实现学生记录的存盘,即将记录写入数据文件;二是以表格的形式在屏幕上打印记录信息。

2.2 详细设计

2.2.1数据结构设计 ? 学生成绩信息结构

struct student { 
          char num[30];//学号     int zhuanye;     //专业     int banji;      //班级  char name[30];    //姓名  int  cyuyan;           //C语言成绩  int  shuxue;           ///数学成绩     int  yingyu;          //英语成绩     float zongfen;      //总分    }; 

结构体struct student它将用于存储学生的基本信息,作为文件的数据域。为了简化程序,只有三个成绩。 2.2.2 主控main()函数执行流程 成绩管理系统的主流如图2所示.2.先输出选择目录,再根据目录选择。 若选1,则调用input(stu)执行输入操作的函数; 若选2,则调用output(stu)执行输出操作的函数; 若选3,则调用lookfor(stu)函数,执行查询学生信息的操作; 若选4,则调用modify(stu)修改学生信息的函数; 若选择5,则调用delete_student(stu)删除学生信息的函数; 若选6,则调用order(stu)学生信息操作排序函数; 若选7,则调用fileread(stu)函数,执行读取文件中学生的信息操作; 若选8,则调用filewrite(stu)函数,执行将学生记录到数据文件中的操作; 若选9,则输出:感谢您使用学生信息管理系统,请关闭程序; 调用system(“pause)函数输出:继续按任何健康执行;关闭程序。 2.2.输入记录模块 输入记录模块主要实现数据存储struct student stu[N]中。当记录从数据文件中读取时,调用fread(&stu[j],sizeof(struct student),1,fp);文件读取函数,执行从文件中读取学生成绩记录信息struct student stu[N] 中间操作,操作在fileread(stu)执行函数,也就是说,当绩效管理系统进入选择7时,操作将执行。如果文件中没有数据,系统将提示文件打开错误,程序无法执行,学生信息无法操作。如果用户应该选择1,调用input(stu)函数,输入学生记录,即完成数据存储struct student stu[N]添加操作。值得一提的是,这里的字符串和值分别通过函数实现,在函数中完成输入数据任务,判断数据的条件,直到满足条件,大大降低了代码的重复和冗余,符合模块化程序设计的特点。 2.2.4查询记录模块 查询记录模块主要实现了在struct student stu[N]根据学号或姓名查找符合相关条件的学生记录。查询函数lookfor(stu)通过字符函数比较已存储的学生信息,找出要查看的学生,输出到屏幕上。遵循模块化编程的原则。 2.2.5更新记录模块 该模块主要实现了学生记录的修改、删除和排序。由于学生记录以结构形式存储,这些操作都在结构函数中struct student stu[N]完成。以下是三个功能模块。 ① 修改记录。该操作需要结构体函数struct student stu[N]修改中成员的值。 第一步:使用函数strcmp( ),比较stu[j]num与xh,若相等返回值为0,则进行下一步。 第二步:再次确认是否修改。 第三步:选择要修改的课程,利用switch()函数修改成绩。 ② 删除记录。该操作完成删除指定学号或姓名的学生记录。 第一步:利用函数switch() 判断是利用学号还是姓名查找学生记录。 第二步:利用 for () 循环进行删除。 ③ 排序记录。有关排序的算法很多,如冒泡排序、插入排序等。我采用了选择排序的方法。 2.2.6统计记录模块 通过stu[count].zongfen=stu[count].cyuyan+stu[count].shuxue+stu[count].yingyu;计算出总成绩。 2.2.7输出记录模块 当把记录输出至文件时,调用filewrite(stu)函数,将已输入的学生信息写入文件。当把记录输出至屏幕时,调用output(stu)函数,将结构体函数struct student stu[N]中 的学生记录信息以表格的形式在屏幕上打印出来。 2.2.8函数功能描述  system( ) 函数原型:int system(char *command) system( ) 函数是C函数库stdlib.h、process.h中的一个函数。system(“pause”)可以实现冻结屏幕,便于观察程序的执行结果;system(“cls”)可以实现清屏操作。而调用color函数可以改变控制台的前景色和背景, 调用system(“mode con cols=列数 lines=行数”)函数可以调节控制台的宽度和高度。 例如: system(“pause”); //程序暂停  system(“cls”); //清屏语句 system(“mode con:cols=150 lines=30”) //调节控制台的宽度和高度 system(“color 1b”) //调节控制台的背景和字体颜色 用 system(“color1b”) 其中color后面的1是背景色代号,b是前景色代号。各颜色代码如下: 0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色 A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色 F=亮白色  goto point1 实现输入错误次数过多,程序跳转重新开始  fflush(stdin); 函数原型:int fflush(FILE *stream) fflush(stdin)功能: 清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件。  switch (choice) //根据选择,调用不同的函数来完成不同的任务 函数原型:switch ( 常量表达式 ) { case 常量1 :语句; case 常量2 :语句; case 常量3 :语句; … case 常量n:语句; default :语句; } switch (choice) 功能:根据选择,调用不同的函数来完成不同的任务  return(); return;的作用相当于break;用于中断循环的作用; return 0;则是return的另一种用法,专用于返回值非void的函数返回其值。  do-while do-while 循环语法 格式: do { 循环体; } while (条件表达); //条件表达,可以引用外传感器返回值。 以上循环将先运行一次,因为经过第一次do循环后,当检查条件表达式的值时,其值为 不成立时而会退出循环。保证了至少执行do{ }内的语句一次。 在本程序中实现返回控制台的操做和提示输入位数为一确定数。  for(单次表达式;条件表达式;末尾循环体) { 中间循环体; } 在本程序中实现循环控制输出的个数。  strcmp(stu[j].num,xh)0) 函数原型:extern int strcmp(const char *s1,const char *s2); 当s1<s2时,返回为负数; 当s1s2时,返回值= 0; 当s1>s2时,返回正数。 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。 在本程序中实现通过字符函数对已存入的学生信息进行比较,找出要查看的学生  FILE *fp; FILE *fp 是声明,声明fp是指针,用来指向FILE类型的对象。*fp是指向文件结构体的指针变量,通过fp可找到存放某个文件信息的结构变量,根据这个结构变量的信息找到该文件,实施对文件的操作。fp通常被成为一个指向文件的指针。  fread(&stu[j],sizeof(struct student),1,fp); fwrite(&stu[j],sizeof(struct student),1,fp); 函数原型:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ; 参 数:buffer用于接收数据的内存地址,size要读的每个数据项的字节数,单位是字节,count要读count个数据项,每个数据项size个字节.,stream输入流。 在本程序中实现写入文件和读取文件。  主函数main() 整个成绩管理系统控制部分,其详细说明可参考图二。 完成在上述系统设计后,即可着手进行系统实现的工作,开始程序代码的编写。

3、系统实现

3.1 编码 3.1.1 程序预处理 包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。

#include"stdio.h" //标准的输入输出函数文件头部说明
#include"math.h" //数学出函数文件头部说明
#include"ctype.h" //字符函数文件头部说明
#include"string.h" //字符串函数文件头部说明
#include"stdlib.h" //通过该函数头部里的函数,改变控制台的背景和颜色
#include"windows.h" //头文件声明,下文用到了改变控制台的宽度和高度
#define N 1000 //宏定义说明
struct student
{ 
        
	char num[30];//学号
    int zhuanye;     //专业
    int banji;      //班级
	char name[30];    //姓名
	int  cyuyan;           //C语言成绩
	int  shuxue;           //数学成绩
    int  yingyu;          //英语成绩
    float zongfen;      //总分
   };
//****************************************函数的声明********************************************
void input(struct student stu[N]);     //输入函数
void output(struct student stu[N]);     //各类用户自定义函数的声明
void lookfor(struct student stu[N]);    //查询函数
void modify(struct student stu[N]);     //修改函数
void order(struct student stu[N]);     //排序函数
void delete_student(struct student stu[N]);   //删除函数
void xuehao(struct student stu[N]);    //自定义通过学号方式删除学生信息函数 
void xingming(struct student stu[N]);   //自定义通过姓名方式删除学生信息函数
void fileread(struct student stu[N]);	//读取文件信息函数定义
void filewrite(struct student stu[N]);   //写入文件函数定义
int  count=0;;
struct student t;
3.1.2 主函数main()
main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。详细分析可参考图2。
main() 
{ 
        
    struct student stu[N];  
	int choice;
	int sum;
	system("mode con:cols=150 lines=30");        //调节控制台的宽度和高度
	 system("color 1b");      //调节控制台的背景和字体颜色
	 sum=0;
point1: 
	do 
	{ 
        	printf("\t\t\t\t\t\t\t -------------------------------------------------\n");
	    printf("\t\t\t\t\t\t\t + 学生成绩管理系统 +\n");
     	printf("\t\t\t\t\t\t\t -------------------------------------------------\n");
	     printf("\t\t\t\t\t\t\t\t\t ***************\n");
	      printf("\t\t\t\t\t\t\t\t\t1、添加学生信息\n");
        	printf("\t\t\t\t\t\t\t\t\t2、浏览学生信息\n");
	         printf("\t\t\t\t\t\t\t\t\t3、查询学生信息\n");
	           printf("\t\t\t\t\t\t\t\t\t4、修改学生信息\n");
            	printf("\t\t\t\t\t\t\t\t\t5、删除学生信息\n");
	             printf("\t\t\t\t\t\t\t\t\t6、排列学生信息\n"); 
                  printf("\t\t\t\t\t\t\t\t\t7、读取文件学生\n");					//从文件读取
	               printf("\t\t\t\t\t\t\t\t\t8、保存到文件\n");					 //保存到文件
	                printf("\t\t\t\t\t\t\t\t\t9、退出系统\n");   
	                 printf("\t\t\t\t\t\t\t\t\t***************\n"); 
	                  printf("\t\t\t\t\t\t\t请输入你的选择:\n");
	               scanf("%d",&choice);
	fflush(stdin);       //清除输入缓冲区
	if (choice>9||choice<=0)
	{ 
        
	sum++;
	if (sum>=5)
	{ 
        
	printf("输入错误次数过多,程序将重新开始\n");
	system("pause");        //程序暂停
	system("cls");   //清屏语句
	goto point1;
	}
	}
	switch (choice)       //根据选择,调用不同的函数来完成不同的任务
	{ 
        
	case 1:input(stu);break;       //自定义输入函数 
	case 2:output(stu);break;       //自定义输出函数
	case 3:lookfor(stu);break;      //自定义查询学生信息函数
	case 4:modify(stu);break;      //自定义修改函数
	case 5:delete_student(stu);break;  //自定义删除函数
	case 6:order(stu);break;           //排序函数的定义
	case 7:fileread(stu);break;	     //读取文件信息函数定义
	case 8:filewrite(stu);break;    //写入文件函数定义
	case 9:printf("感谢你使用学生信息管理系统,请关掉程序!!!\n");system("pause");break;
	default:printf("无效的选择!!!请重新输入!!!\n");break;
	}
	}while (choice!=9);
	printf("the program is over!!!\n");
	 return 0;
}
3.1.3 主菜单界面
用户进入成绩管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用。
point1: 
	do 
	{ 
        	printf("\t\t\t\t\t\t\t -------------------------------------------------\n");
	    printf("\t\t\t\t\t\t\t + 学生成绩管理系统 +\n");
     	printf("\t\t\t\t\t\t\t -------------------------------------------------\n");
	     printf("\t\t\t\t\t\t\t\t\t ***************\n");
	      printf("\t\t\t\t\t\t\t\t\t1、添加学生信息\n");
        	printf("\t\t\t\t\t\t\t\t\t2、浏览学生信息\n");
	         printf("\t\t\t\t\t\t\t\t\t3、查询学生信息\n");
	           printf("\t\t\t\t\t\t\t\t\t4、修改学生信息\n");
            	printf("\t\t\t\t\t\t\t\t\t5、删除学生信息\n");
	             printf("\t\t\t\t\t\t\t\t\t6、排列学生信息\n"); 
       printf("\t\t\t\t\t\t\t\t\t7、读取文件学生\n");	//从文件读取
	    printf("\t\t\t\t\t\t\t\t\t8、保存到文件\n");		//保存到文件
	                printf("\t\t\t\t\t\t\t\t\t9、退出系统\n");   
	                 printf("\t\t\t\t\t\t\t\t\t***************\n"); 
	                  printf("\t\t\t\t\t\t\t请输入你的选择:\n");
	               scanf("%d",&choice);
	fflush(stdin);       //清除输入缓冲区
	if (choice>9||choice<=0)
	{ 
        
	sum++;
	if (sum>=5)
	{ 
        
	printf("输入错误次数过多,程序将重新开始\n");
	system("pause");        //程序暂停
	system("cls");   //清屏语句
	goto point1;
	}
	}
	switch (choice)       //根据选择,调用不同的函数来完成不同的任务
	{ 
        
	case 1:input(stu);break;       //自定义输入函数 
	case 2:output(stu);break;       //自定义输出函数
	case 3:lookfor(stu);break;      //自定义查询学生信息函数
	case 4:modify(stu);break;      //自定义修改函数
	case 5:delete_student(stu);break;  //自定义删除函数
	case 6:order(stu);break;           //排序函数的定义
	case 7:fileread(stu);break;	     //读取文件信息函数定义
	case 8:filewrite(stu);break;    //写入文件函数定义
	case 9:printf("感谢你使用学生信息管理系统,请关掉程序!!!\n");system("pause");break;
	default:printf("无效的选择!!!请重新输入!!!\n");break;
	}
	}while (choice!=9);
	printf("the program is over!!!\n");
	 return 0;
3.1.4 表格形式显示记录
由于记录显示操作经常进行,所以将这部分由独立的函数来完成,减少代码的重复。它将显示文件中存储的学生记录,内容为student结构中定义的内容。
void output(struct student stu[N])     //自定义输出函数
{ 
        
	int j;
	system("cls");
  if (count==0)
	{ 
        
	printf("当前已存学生信息为0个\n");
	return;
	}
	for (j=0;j<count;j++)
	{ 
        
	printf("学号\t\t姓名\t\t专业\t\t班级\t数学\t英语\tC语言\t\t总分\n");
	for (j=0;j<count;j++)           //for循环控制输出的个数
	{ 
                                    
	printf("%s\t",stu[j].num);
	printf("%s\t\t",stu[j].name);
    if (stu[j].zhuanye==1)  printf("计算机科学\t");
    	else
         printf("网络工程\t");      
	printf("%d\t",stu[j].banji);
	printf("%d\t",stu[j].shuxue);
	printf("%d\t",stu[j].yingyu);
	printf("%d\t\t",stu[j].cyuyan);
    printf("%f\t\t\n",stu[j]. zongfen);
	}
	}
}
3.1.5查询学生记录
当用户执行此查询任务时,系统会提示用户进行查询字段的选择,即按学号或姓名进行查询。若此学生记录存在,则会打印输出此学生记录的信息。void lookfor(struct student stu[N])                   //自定义查询学生信息函数
{ 
        
	int j,flag=0;
	char xh[25];
	system("cls");
    if (count==0)
	{ 
        
	printf("当前已存学生信息为0个,无法查询!!!\n");
	return;
	}
	else
	{ 
        
	printf("请输入你想要查看的同学学号\n");
	scanf("%s",&xh);
	fflush(stdin);  //清除缓冲区
	for (j=0;j<count;j++)
	{ 
        
	if (strcmp(stu[j].num,xh)==0)       //通过字符函数对已存入的学生信息进行比较,找出要查看的学生
	{ 
        
	printf("学号\t\t姓名\t\t专业\t\t班级\t数学\t英语\tC语言\t\t总分\n");
	printf("%s\t",stu[j].num);
	printf("%s\t\t",stu[j].name);
    if (stu[j].zhuanye==1)  printf("计算机科学\t");
    	else
         printf("网络工程\t");      
	printf("%d\t",stu[j].banji);
	printf("%d\t",stu[j].shuxue);
	printf("%d\t",stu[j].yingyu);
	printf("%d\t\t",stu[j].cyuyan);
    printf("%f\t\t\t\n",stu[j]. zongfen);
	}
	if(j==count)
	printf("很抱歉,没有你所需要的学生信息\n");
}

	}

	}
3.1.6 输入数据和增加学生记录
在此成绩管理系统中,要求用户输入的只有字符型和数值型数据,所以设计了下面这个函数来单独处理,并对输入的数据进行检验。
void input(struct student stu[N])      //自定义输入函数
{ 
        
	int len;
	system("cls");
    printf("请添加要输入学生的信息\n");
	do { 
        
	printf("请输入由10位数字组成的学生学号\n");   //do-while循环应用,提示输入位数为一确定数
	scanf("%s",&stu[count].num);
	len=strlen(stu[count].num); //计数
	}while(len!=10);
	printf("请输入所需要的专业代号:1、计算机科学 2、网络工程\n");  //采用如此方法解决了专业输入难问题
	scanf("%d",&stu[count].zhuanye);
    printf("请输入对应的学生班级号码:1、18511 2、18514 \n");
	scanf("%d"

标签: 1270s2tc接近传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台