基于C语言的学生成绩管理系统

Guardianship

发布日期: 2021-03-12 08:52:23 浏览量: 1042
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1 系统分析

此学生成绩管理系统是为管理学生成绩数据的人员提供,为管理学生成绩数据的相关人员提供充足的信息和快捷的查询手段。该系统的编写目的是提高学生成绩管理的工作效率,使人们从乏味的数据登记和统计工作中解脱出来,保证工作的准确率。

1.1 功能需求

学生学籍管理管理系统是直接面对使用人员的,而使用人员往往对计算机并不时非常熟悉。这就要求系统能够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求系统应该尽量使用用户熟悉的术语和中文信息的界面;针对用户可能出现的使用问题,要提供足够的在线帮助,缩短用户对系统熟悉的过程。

学生学籍管理系统中涉及到的数据是学校相当重要的信息,系统要提供方便的手段供系统护人员进行数据的备份,日常的安全管理,系统意外崩溃时数据的恢复等工作。

1.2 非功能性需求

  • 正确性:不允许出现业务错误

  • 健壮性:在系统出现故障时,系统必须提供相应的数据保护措施,不能丢失 数据,并提供从新恢复正常工作的机制

  • 可靠性:除电源硬件、操作系统外不允许异常退出或崩溃

  • 性能、效率:系统处理业务时间最迟时间小于等于1秒

  • 易用性:使用简单,操作方便

  • 安全性:用户只能通过系统操作后台数据,不能够对数据库进行直接操作

  • 可扩展性:可在当前需求基础之上进行功能上的扩展

  • 兼容性:能够运行在多台主机上

  • 可移植性:可以够运行在WindowsXP以上Windows 系列操作系统平台上

1.3 用户界面

  • 采用DOS的通用图形界面,用户界面友好

  • 界面具有一致性,界面规范遵循DOS软件界面的规范

  • 提供错误信息处理

  • 提供信息提示,提示当前用户的误操作信息和指示信息

  • 提供方便的退出系统的方法

  • 用户对程序的维护,最好要有备份

2 系统设计

此系统是的设计采用模块化的设计方法,根据使用者的选择逐步调用。采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。

2.1 体系结构设计

创建结构体数组来储存学生的信息,创建一个switch函语句创建一个整体框架,case下包括各个主干功能,某些主干功能也用switch来包括分支功能,程序的各个功能都用函数表示。

2.2 数据设计

定义全局结构体方便调用,MAX_STU是最大学生数量,方便后期开通增值服务。

  1. struct Student //定义一个学生结构体
  2. {
  3. char names[30]; //姓名
  4. long long stu_id; //学号
  5. int stu_class; //班级
  6. double lesson1; //高等数学·上
  7. double lesson2; //英语视听说
  8. double lesson3; //大学计算机基础
  9. double lesson4; //软件工程导论
  10. double lesson5; //C语言程序设计
  11. double avg;
  12. }student[MAX_STU];
  13. char password_real[30] = "123456"; //在此处设置密码
  14. int now_index=0; //开始录入第now_index个学生
  15. int i; //定义整形i用来for循环
  16. double avg1=0,avg2=0,avg3=0,avg4=0,avg5=0,avg0; //为求平均做准备
  17. FILE * fp;
  18. char temp_cls; //清屏函数的临时回车选项

2.3 模块设计

模块设计分析图

3 系统实现

模块化的系统实现,参考上述模块设计图。

3.1 欢迎模块

  1. void Welcome();

介绍公司和慰问用户,使用户能够感受到软件制作团队的认真与用心。在欢迎模块中附加温馨提示,以防给使用者带来不舒适的软件市容体验,另外附加上软件的升级会员版的条件的途径。

3.2 密码模块

  1. void password_input(); //定义密码的输入

在此程序的欢迎界面之后紧接着是输入密码的界面,输入密码要求输入正确的密码。输入密码的实现是将用户输入的一串字符和系统内本身定义好的字符串进行比较,用strcmp();验证时候相等,如果判断正确,通过进入系统,如果不成立,则进入循环输入状态,直到输入5次为止。累计输入5次错误则退出系统。(密码是123456)

3.3 菜单模块

  1. menu();

菜单模块的实现主要包括两部分:

  • 第一部分是通过printf();函数将菜单选项提供给用户进行选择,根据用户接下来的操作来判定下一步的操作

  • 第二部分是根据用户的选项调用已经封装好的各个功能的函数,代码如下。本功能的实现是通过switch();函数来找到与用户输入的功能序号相对应的封装函数。利用goto语句进行抛出异常。其中cls();是请屏函数,它的实现是调用windows.h头文件下的system();来实现

  1. loop_menu:scanf("%d",&menu_id);
  2. switch(menu_id) //选择菜单
  3. {
  4. case 1: stu_add();break;
  5. case 2: stu_output();cls();break;
  6. case 3: stu_find();cls();break;
  7. case 4: stu_revise();cls();break;
  8. case 5: stu_delete();cls();break;
  9. case 6: stu_subsection();cls();break;
  10. case 7: stu_fileClass();break;
  11. case 8: stu_over();cls();break;
  12. default : {
  13. fflush(stdin) ;
  14. printf("您的输入有误,请重新输入:");
  15. goto loop_menu; //循环该菜单
  16. }

3.4 录入模块

  1. stu_add();

录入模块的实现是让用户通过使用空格分隔来录入每一次代码输入的各个不同的值,然后赋予给结构体成员的不同变量。每一次输入之后,提示用户是否继续输入,如果继续输入则重复上述步骤。如果用户输入的内容不符合规定,则给出提示后加入清楚缓冲区的方法fflush(stdin);然后重新录入,直用户输入完毕后使用N\n来结束录入。在本模块中保留输入有误的提示语,并循环到上一步,使系统具有充足的容错性。

3.5 输出模块

  1. stu_output();。

输出模块首先通过if语句判断是否有学生数据的情况,当全局变量now_index数值恒等于0时代表学生数据为0,所以提示用户不能进行此操作。紧接着回到菜单。如果判断当前软件录入人数大于0,则跳过if语句的ruturn 0操作。此时紧接着调用求平均函数avg_student();来计算每个学生的平均成绩,然后调用排序函数,将学生的成绩降序排列。降序的实现是通过冒泡排序法对全局结构体成员进行降序排列,然后在输出模块的下一部分for循环顺序输出,依次实现降序输出学生成绩的目的。在最后调用avg_lesson();函数来求取没课成绩的平均成绩并在输出模块的下方输出。avg_lesson();的实现是定义全局变量总成绩,将之与当前now_index相除求取平均值并通过.2lf保留两位小数。

3.6 查找模块

  1. stu_find();

查找模块的实现的关键在于查找到对应学生的下标,通过找到下标来找到对应的学生结构体成员,并输出。查找模块首先通过if语句判断是否有学生数据的情况,当全局变量now_index数值恒等于0时代表学生数据为0,所以提示用户不能进行此操作。紧接着回到菜单。如果判断当前软件录入人数大于0,则跳过if语句的ruturn 0操作。代码进行下一步:查找之前首先查找模块分两种情况进行查找:

  1. scanf("%d",&find_index);
  2. switch(find_index)
  3. {
  4. case 1:find_id();break;
  5. case 2:find_name();break;
  6. case 3:return 0;
  7. default:
  8. {
  9. fflush(stdin);
  10. printf("您的输入有误请重新输入:");
  11. goto loop_find;
  12. }
  13. }

按学号查找find_id();通过输入的的学生序号与录入的数据中的学生相吻合时(用if条件语句进行判断),找到对应学生标号,根据学生标号找到结构体成员,然后进行下一步。

按姓名查找fin_name();将输入的学生姓名字符串和录入的所有学生数据用strcmp();相比较,但判断通过时提取对应下标到下一步。

找到下标之后,提示使用者输入要修改的成绩编号并输入成绩,通过重新赋值的做法将新值录入,旧值释放。

在该模块中附加进入候选项可以直接返回到菜单中的功能,直接用return 0;实现;

3.7 删除模块

删除模块的实现和查找模块相似,同样是查找到对应下标,然后将下标对应处成员向前补位。删除模块首先通过if语句判断是否有学生数据的情况,当全局变量now_index数值恒等于0时代表学生数据为0,所以提示用户不能进行此操作。紧接着回到菜单。判断通过后,通过将用户输入的学号存入long long型变量revise_id中。顺序循环将revise_id与录入的学生的学号对比,如果没找到则抛出异常,如果找到即当恒等于时break跳出循环,此时全局变量i就是对应下标,传i值到delete_day(int t);的参数中,删除的方法是将从下标开始的学生结构体成员向前补位,将now_index自减,此时如果使用输出函数就能顺序输出无student[i]的结构体数组,。

delete_way();的关键方法如下:

  1. void delete_way(int t)
  2. {
  3. int h;
  4. int temp_loop_num = now_index -t -1;
  5. for(h=0;h<MAX_STU-1;h++) //从删除处向前补位
  6. {
  7. student[t] = student[t+1];
  8. t++;
  9. }
  10. now_index--;
  11. }

3.8 分段模块

  1. stu_subsection()

数据的分段,是通过排序后的学生数据顺序输出,与直接输出不同的是,数据的分段还将数据在5个分段的学生统计出来并加上美化边框的处理,很容易能让用户找到对应人数。分段模块首先通过if语句判断是否有学生数据的情况,当全局变量now_index数值恒等于0时代表学生数据为0,所以提示用户不能进行此操作。紧接着回到菜单。判断通过后,依次取不同分段的人数,通过循环5次不同的次数来输出不同的人并加上对应统计数据和边框。通过5次循环,展现处用户想要的效果。

3.9 文件操作模块

文件操作的模块提供给用户4个选项:

  • 1、保存到文件中

  • 2、文件内容的展示

  • 3、打开并导入软件

  • 4、返回主菜单

通过switch()将4个选型联系起来。

3.9.1 保存到文件中

定义char型指针buffer,为了输出路径。判断并抛出文件打开的异常。如果文件不存在则自动创建该文件,将标题先输出到Student datas.txt中,再循环now_index次将各个数据输出到文件中并在dos显示屏上显示以验证是否输入正确。最后成功后将提示用户输出到文件成功,并通过getcwd();显示出路径(此函数是在头文件direct.h中).然后关闭文件。

3.9.2 展示文件的内容

展示文件的内用的原理是从头到尾以输出字符的方法依次输出到显示屏上。以只读形式打开文件后,核心代码如下

  1. char ch;
  2. while((ch=fgetc(fp)) != EOF) //一直执行到无字符
  3. {
  4. putchar(ch);
  5. }
  6. fclose(fp);
  7. return 0;
  8. }

最后关闭文件,输出完成。

3.9.3 将文件的内容导入到软件中

文件的导入首先需要找到对应行数file_index。通过下面的代码实现。

  1. int line = 0;
  2. for(;;) //找到共有多少行数据
  3. {
  4. if((ch = fgetc(fp)) == '\n')
  5. {
  6. line++;
  7. }
  8. if(ch == EOF)
  9. break;
  10. }

判断对应文件的’\n’找到与行数+2并-2存入到局部变量file_index中。然后㐊通过rewind(fp);将文件指针fp指向文件的开头。

通过fscanf(fp,”%[^\n]”,temp_total[0]); fgetc(fp); 将第一行的标题读取出来存入临时变量中并换行。

此时判断文件中是否录入数据,当line-2小于等于0时则代表未录入。如果判断录入数据,就循环将数据提取出来分别赋予给学生结构体数组中的成员变量。

3.10 结束系统模块

结束模块判断用户是否确认退出程序,提示用户保存数据后再进行退出,也可以选择退出程序。

4 总结

4.1 开发经验

通过对本题目的开发,体会到要掌握以下几点内容。

  • 大程序的设计风格,按“自顶向下,逐步细化,模块化”的方法进行程序设计

  • 编写主函数,并进行测试与调试。当被调函数又需要调用其他函数时,也要遵循逐步细化的原则。C语言提供丰富的库函数,编程序时要善于使用库函数,避免不必要的劳动。 定义函数时,应选好参数的个数和数据类型

  • 文件使用方法,文件使用完毕后应及时关闭

4.2 实训中遇到的问题及解决方法

在这次的实训中,主要遇到的问题是编译环境的不同对程序也不同。该函数未定义的错误中。后来经过老师的指导,终于找到了根源,就是把“clrscr()”改为“system(“cls”)”就可以了。

4.3 设计中尚存的不足之处

关于这次的程序,也有挺多不足的地方。首先,我觉得程序还不够完善,有些地方甚至有点乱;其次,有些地方好像功能有点重复了;最后,就是该程序界面不够美观大方。

上传的附件 cloud_download 基于C语言的学生成绩管理系统.7z ( 1.53mb, 65次下载 )
error_outline 下载需要10点积分

keyboard_arrow_left上一篇 : 基于JAVA语言的学生选课信息管理系统 基于JSP和MySQL开发的酒店管理系统的设计与实现 : 下一篇keyboard_arrow_right



跳跳虎
2021-03-20 10:14:33
报错
跳跳虎
2021-03-20 10:19:16
--------------------Configuration: 541713460329_苏一恒 - Win32 Debug-------------------- Compiling... 541713460329_苏一恒.c C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(35) : error C2632: 'long' followed by 'long' is illegal C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(177) : error C2143: syntax error : missing ';' before 'type' C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(181) : error C2065: 'find_index' : undeclared identifier C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(205) : error C2143: syntax error : missing ';' before 'type' C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(206) : error C2143: syntax error : missing ';' before 'type' C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(207) : error C2143: syntax error : missing ';' before 'type' C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(208) : error C2632: 'long' followed by 'long' is illegal C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(208) : error C2143: syntax error : missing ';' before 'type' C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(211) : error C2065: 'revise_id' : undeclared identifier C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(220) : error C2065: 'if_exit' : undeclared identifier C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(230) : error C2065: 'm' : undeclared identifier C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(253) : error C2065: 'j' : undeclared identifier C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(259) : error C2065: 'k' : undeclared identifier C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(309) : error C2632: 'long' followed by 'long' is illegal C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(356) : error C2143: syntax error : missing ';' before 'type' C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(366) : error C2065: 'stu_s' : undeclared identifier C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(366) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(366) : error C2105: '++' needs l-value C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(371) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(374) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(378) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(378) : error C2105: '++' needs l-value C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(383) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(387) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(387) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(391) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(391) : error C2105: '++' needs l-value C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(396) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(399) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(399) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(399) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(403) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(403) : error C2105: '++' needs l-value C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(408) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(411) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(411) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(411) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(411) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(415) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(415) : error C2105: '++' needs l-value C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(420) : error C2109: subscript requires array or pointer type C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(500) : error C2143: syntax error : missing ';' before 'type' C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(512) : error C2065: 'file_index' : undeclared identifier C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(522) : error C2143: syntax error : missing ';' before 'type' C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(523) : error C2065: 'ch' : undeclared identifier C:\Users\Administrator\AppData\Local\Temp\Rar$DIa0.868\541713460329_苏一恒.c(634) : error C2632: 'long' followed by 'long' is illegal 执行 cl.exe 时出错. 541713460329_苏一恒.obj - 1 error(s), 0 warning(s)
白日梦
2021-06-24 23:14:06
好厉害

发送私信

你又不吃胡萝卜怎么能说它不好吃呢

16
文章数
17
评论数
最近文章
eject