2022年《学生成绩管理系统》C语言课程设计 .pdf
湖南文理学院课程设计报告课程名称:计算机软件技术基础学院:电气与信息工程学院专业班级:自动化 06102 班姓名:王康学号: 200615010201 指导教师 : 朱明旱完成时间: 2008年 5 月 8 日报告成绩 : 评阅意见:评阅老师:评阅时间:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 21 页 - - - - - - - - - 学生成绩管理系统C语言课程设计一、 设计要求1) 收集资料,全面分析课题,分解问题,形成中体编程思路;2) 深入分析各个小问题,编写个部分程序模块;3) 对于设计中用到的关键函数,要联系实际问题进行具体介绍;4) 上机调试,确保程序能正确运行;二、 设计目的:1) 通过设计,了解 C语言的实际运用,加强对C语言的重视;2) 通过设计,强化 C语言的基本运用及C语句的准确掌握;3) 通过设计,掌握设计软件一般方法,了解软件设计的一般思路;4) 通过设计,锻炼撰写报告的水平。三、 课题分析:编写一个学生成绩管理系统的C程序,包括以下功能:1) 学号段查询功能;2) 输入功能;3) 添加功能、修改功能;4) 成绩处理功能等5) 可实现数据输入、数据显示、数据插入、数据访问、数据保留、数据更新等存储功能,以及各学科平均分、最高分、最低分的提取等数据处理功能。该程序运行相对只能化,可通过学号比较来插入数据、根据姓名查找数据以及更新数据。其操作简单,查找方便,修改迅速,普遍适合学校学生成绩管理,可大大减少人工管理的工作量,提高工作效率。四、 定义数据结构及相关解释:1) 在学生成绩管理系统中,各模块功能系统之间构成的数据结构关系为非线性数据结构的树结构。2) 树结构:每一个结点只有一个前件,称为父结点。没有前件的结点只有一个,称为树的根结点,简称树的根。在学生成绩管理系统中的数据结构图中“图书馆管理程序”为根;在树结构中,每一个结点都可以有多个后件,他们都称为该结点的子结点,没有后件的结点称为叶子。例如,在学生成绩管理系统中的数据结构图中“查看数据”、 “ 通过比较学号来插入数据” 、 “ 通过姓名查找查看数据” 、 “ 通过姓名查找来更新数据” 、 “ 保名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 21 页 - - - - - - - - - 留数据”以及求各学科的“平均分、最高分、最低分”为“学生成绩管理系统”的子结点,也是该树结构的叶子。五、 软件的模块划分:根据对学生成绩管理系统功能分析的情况,可将学生成绩管理系统做如下模块划分:1)main( ) 主函数 - 学生成绩管理系统程序主函数;2)print( ) 打印函数 - 设置学生成绩管理系统界面;3)cin( ) 数据输入函数 - 数据多格式输入;4)cindata( ) 其他数据继续输入函数;5)lookdata( ) 查看数据函数 - 查看已保存的数据;6)insert( ) 插入数据的函数 - 通过比较学号来插入数据;7)find( ) 查看数据的函数 - 通过姓名查找查看数据;8)update( ) 更新数据的函数 - 姓名查找来更新数据;9)save( ) 保留数据函数 - 储存处理后的数据;10)caverage(); 求各学生语文平均分、最高和最低分成绩的函数;11)maverage(); 求各学生数学平均分、最高和最低分成绩的函数;12)eaverage(); 求各学生英语平均分、最高和最低分成绩的函数;13)comaverage(); 求各学生计算机平均分、最高和最低分成绩的函数注:(2)(13)为自定义功能函数, 通过 main()主函数调用实现其功能。六、 程序流程设计:根据学生成绩管理系统功能分析绘制流程图:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 21 页 - - - - - - - - - 注:其他功能的流程图可参照“其他数据输入”的流程图绘制。初始界面开始passwords 功能选择用户信息输入其他数据插入数据查找查看数据查找更新数据保留数据显示或打印数据求学生语文平均分求学生计算机平均分求学生数学平均分求学生英语平均分空操作返回主程序流程图,学生成绩管理系统操作流程。其他数据输入姓名学号性别成绩语文数学英语计算机其他数据输入过程选择继续输入返回名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 21 页 - - - - - - - - - 七、 各功能模块编写内容详细情况及调试:1) 数据类型的定义。在定义数据类型时,由于学生成绩管理信息需要由不同类型的数据反映出来。如:姓名、性别都需要用char 型数据,而学号和成绩则需要用int型数据,并且每位同学的以上信息都需要一次性输入,所以采用结构体类型定义。如:typedef struct student /*定义结构体 */ char nameMAX; - 定义 char 型姓名int numMAX; - 定义 int 型学号char sexMAX; - 定义 char 型性别int chinese; - 定义 int 型语文成绩int mathematic; - 定义 int 型数学成绩int english; - 定义 int 型英语成绩int computer; - 定义 int 型计算机成绩struct student *next; - 结构体指针stu; 说明:在定义结构体类型和变量时,可采用先定义结构体类型再定义结构提变量,也可同时定义结构体类型和变量,还可以直接定义结构提变量。上例中的定义方式为同时定义结构体的类型和变量。结构体定义的格式如下:2)函 数 的 命名和库函数的使用。A. 函数命名是遵循标识符的命名规则,并且要尽量做到顾名思义的效果。如:lookdata( )为查看数据函数。B. 库函数使用时要提前声明(#include 等)用到的函数必须包括在库函数或者已自定义的函数中,否则编译出错。C. 函数调用时要注意形参和实参数据类型的对应。struct结构体名 类型标识符成员名;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 21 页 - - - - - - - - - 3) 函数结构和功能实现。A. 数据输入函数“ cin( )”B. 查看数据函数“ lookdata( )”C. 插入数据的函数“ insert( )”D. 查看数据的函数“ find( )”E. 更新数据的函数“ update( ) ”F. 保留数据函数“ save( )”注:以上的六个功能函数为学生成绩管理系统的输入、读取、修改等主要功能函数,其中主要运用字符串比较,定义指针变量,输入输出等多种函数和操作实现其对外界输入内容进行处理功能以及防止出错的备份功能。G. 管理系统中的各个模块函数的功能实现基本都依靠与以上三中函数类似的编辑方法编写。主要通过以下结构实现对应功能。for 循环结构 对使用者输入内容与内部资料内容进行核对。switch 选择结构 对使用者所选择的项目进行判断并调用对应的函数。if-else 选择结构 配合 for 循环核对内容的正确与否选择对应的操作。while 、do-while 循环结构 条件判断并进行对应的操作。H. 具体功能函数源程序的编辑内容见后文的图书馆管理系统源程序。八、 源程序内容及调试结果。1)源程序(原始密码是 123456):#includestdio.h #includestddef.h #includestddef.h #includestring.h #define MAX 10 typedef struct student /*定义结构体 */ char nameMAX; /*姓名 */ int numMAX; /* 学号 */ char sexMAX; /*性别 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 21 页 - - - - - - - - - int chinese; /*语文 */ int mathematic; /* 数学 */ int english; /*英语 */ int computer; /*计算机 */ struct student *next; /*结构体指针 */ stu; stu *head; /*头指针 */ void print() /*显示或打印函数*/ system(cls); printf(tttScore Manage Systemn); /*成绩管理系统*/ printf(Enter Recordt); /* 输入数据 */ printf(Displayt); /*显示 */ printf(Insertt); /*插入数据 */ printf(Questt); /*访问数据 */ printf(Updatet); /*以前数据 */ printf(Savet); /*保留数据 */ printf(Fresht); /*更新数据 */ printf(Chinese Averaget); /*语文平均成绩*/ printf(Math Averaget); /*数学平均成绩 */ printf(English Averaget); /*英语平均成绩*/ printf(Computer Averaget); /*计算机平均成绩*/ printf(Quittn); /*退出 */ void cin(stu *p1) /*输入相关数据的函数*/ printf(Enter name:n); scanf(%s,&p1-name); printf(Enter num:n); scanf(%d,&p1-num); printf(Enter sex:n); scanf(%s,&p1-sex); printf(Enter score:n); printf(Enter chinese:n); scanf(%d,&p1-chinese); printf(Enter math:n); scanf(%d,&p1-mathematic); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 21 页 - - - - - - - - - printf(Enter English:n); scanf(%d,&p1-english); printf(Enter Computer:n); scanf(%d,&p1-computer); stu *cindata() /*其他数据是否继续输入的函数*/ stu *p1,*p2; int i=1; char ch; p1=(stu *)malloc(sizeof(stu); head=p1; while(i) cin(p1); printf(Do you Want to Continue?yes or no); /*是否继续输入数据*/ ch=getchar(); ch=getchar(); if(ch=n|ch=N) i=0; p1-next=NULL; else p2=p1; p1=(stu *)malloc(sizeof(stu); p2-next=p1; return(p1-next); stu *lookdata(stu *p1) /*查看数据的函数*/ while(p1!=NULL) printf(Num:%dt,p1-num); printf(Name:%st,p1-name); printf(Sex:%st,p1-sex); printf(n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 21 页 - - - - - - - - - printf(Chinese:%dt,p1-chinese); printf(Math:%dt,p1-mathematic); printf(English:%dt,p1-english); printf(Computer:%dt,p1-computer); printf(n); p1=p1-next; return p1; void insert() /*通过比较学号来插入数据的函数*/ stu *p1,*p3,*p2; char ch; p1=head; p3=(stu *)malloc(sizeof(stu); p3-next=NULL; if(head=NULL) head=p3; return; cin(p3); while(p1!=NULL&(p1-numnum) /* 通过学号的比较来插入*/ p2=p1;p1=p1-next; if(p2=head) p3-next=head; head=p3; return; p3-next=p1; p2-next=p3; find(stu *p2) /*通过姓名查找查看数据的函数*/ char name20; int b=0; printf(Enter the name of the student you want to find:); /*通过姓名查看*/ scanf(%s,name); while(p2!=NULL) if(strcmp(name,p2-name)=0) printf(The data you want has be foundn); printf( Name:%st,p2-name); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 21 页 - - - - - - - - - printf(Num:%dt,p2-num); printf(sex%st,p2-sex); printf(n); printf(Chinese:%dt,p2-chinese); printf(Math:%dt,p2-mathematic); printf(English:%dt,p2-english); printf(Computer:%dt,p2-computer); printf(n); b=1; else if(b=0) printf(sorry not find data!); p2=p2-next; if(b=1) print(); printf(Find onen); else print(); printf(Not findn); void caverage() /*求各学生语文平均分、最高和最低分成绩的函数*/ stu *p1; int i; float max=0.0,min=200.0; float sum=0.0,aver=0; p1=head; if(p1=NULL) printf(not data!); else for(i=0;p1!=NULL;i+,p1=p1-next) sum+=p1-chinese; aver=sum/i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 21 页 - - - - - - - - - p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(maxchinese) max=p1-chinese; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(minp1-chinese) min=p1-chinese; printf(Chinese Average:%f,aver); printf(Chinese Max:%f,max); printf(Chinese Min:%f,min); void maverage() /*求各学生数学平均分、最高和最低分成绩的函数*/ stu *p1; int i; float max=0.0,min=200.0; float sum=0.0,aver=0; p1=head; if(p1=NULL) printf(not data!); else for(i=0;p1!=NULL;i+,p1=p1-next) sum+=p1-mathematic; aver=sum/i; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(maxmathematic) max=p1-mathematic; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(minp1-mathematic) min=p1-mathematic; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 21 页 - - - - - - - - - printf(Mathe Average:%f,aver); printf(Mathe Max:%f,max); printf(Mathe Min:%f,min); void eaverage() /*求各学生英语平均分、最高和最低分成绩的函数*/ stu *p1; int i; float max=0.0,min=200.0; float sum=0.0,aver=0; p1=head; if(p1=NULL) printf(not data!); else for(i=0;p1!=NULL;i+,p1=p1-next) sum+=p1-english; aver=sum/i; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(maxenglish) max=p1-english; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(minp1-english) min=p1-english; printf(English Average:%f,aver); printf(English Max:%f,max); printf(English Min:%f,min); void comaverage() /*求各学生计算机平均分、最高和最低分成绩的函数*/ stu *p1; int i; float max=0.0,min=200.0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 21 页 - - - - - - - - - float sum=0.0,aver=0; p1=head; if(p1=NULL) printf(not data!); else for(i=0;p1!=NULL;i+,p1=p1-next) sum+=p1-computer; aver=sum/i; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(maxcomputer) max=p1-computer; p1=head; for(i=0;p1!=NULL;i+,p1=p1-next) if(minp1-computer) min=p1-computer; printf(Computer Average:%f,aver); printf(Computer Max:%f,max); printf(Computer Min:%f,min); update(stu *p2) /*通过姓名查找来更新数据*/ char name10; /*p2 为指向结构体struct student 的指针 */ int b=0; printf(Enter The Name); /*输入姓名 */ scanf(%s,name); while(p2!=NULL) if(strcmp(name,p2-name)=0) printf(Find you datan); scanf(Name:%s,p2-name); scanf(Num:%s,p2-num); scanf(Sex:%s,p2-sex); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 21 页 - - - - - - - - - scanf(Chinese:%d,p2-chinese); scanf(Math:%d,p2-mathematic); scanf(english:%d,p2-english); scanf(Computer:%d,p2-computer); printf(Success!); b=1; else if(b=0) printf(Sorry not Find data!); p2=p2-next; if(b=0) print(); printf(Sorry not Find data!); else print(); printf(Finish!); save(stu *p2) /*保留数据函数*/ FILE *fp; char file10; printf(Enter file name); /*输入文件名 */ scanf(%s,file); fp=fopen(file,w); while(p2!=NULL) fprintf(fp,%s,p2-name); fprintf(fp,%s,p2-num); fprintf(fp,%s,p2-sex); fprintf(fp,%d,p2-chinese); fprintf(fp,%d,p2-mathematic); fprintf(fp,%d,p2-english); fprintf(fp,%d,p2-computer); p2=p2-next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 21 页 - - - - - - - - - fclose(fp); char password7=123456; /*定义初始密码*/ void main() /*主函数 */ int choice; stu *p2; char s8; int flag=0,i; /*标志项 */ int n=3; do printf(Enter password:n); scanf(%s,s); if(!strcmp(s,password) /*进行密码匹配验证*/ printf(PASSnnn); flag=1; break; else printf(Error Enter again:n); n-; while(n0); if(!flag) printf(you have Enter 3 times!); /*输入密码超过了3 次! !*/ exit(0); /*自动退出 */ /*密码验证成功后进入的界面*/ printf(tttn); /*操作界面 */ printf(ttWelcom to the Misn); printf(Author:-tClass:-tNum:-n); /* 作者,班级和号码*/ printf(Adress:HGn); /*地址 */ printf(%n); printf(ttEnter OP:n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 21 页 - - - - - - - - - printf(nnnn); printf(=tt=n); printf(=tt=n); printf(ttEnter the MIS yes or non); /* 问进入系统与否*/ scanf(%d,&choice); if(choice=n|choice=N) exit(1); print(); while(1) printf(Enter choice:); scanf(%d,&i); if(i13) printf(Enter num from 1 to 13:n); /*再从 1-13 中进行选择 */ exit(1); switch(i) case 1: p2=cindata(); /*其他数据是否继续输入的函数*/ break; case 2: p2=lookdata(head); /*查看数据的函数*/ break; case 3: insert(); /*通过比较学号来插入数据的函数*/ break; case 4: find(head); /*通过姓名查找查看数据的函数*/ break; case 5: update(head); /*通过姓名查找来更新数据*/ break; case 6: save(head); /*保留数据函数*/ break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 21 页 - - - - - - - - - case 7: print(); /*显示或打印函数*/ break; case 8: caverage(); /*求各学生语文平均分、最高和最低分成绩的函数*/ break; case 9: maverage(); /*求各学生数学平均分、最高和最低分成绩的函数*/ break; case 10: eaverage(); /* 求各学生英语平均分、最高和最低分成绩的函数*/ break; case 11: comaverage(); /*求各学生计算机平均分、最高和最低分成绩的函数*/ break; case 12: ; /*空操作 */ case 13: exit(1); /*退出 */ break; scanf(%d,&i); 2) 程序运行过程:A. TC的调试和运行:TC 程序在运行前首先要设置其路径,这样才能调用库函数,一般TC默认的路径为C:TC,但如果用户拷贝的TC没有装载在 C盘下,则 TC将无法寻找到路径,必须重新调试其路径。调试方法如下(以装载在C盘为例) :打开 TC编辑页面,找到Options 选项,将 Directories中的所有更改为,然后点 Save options.修改后 TC就可以成功的调用库函数文件了。B. 程序模块化检验:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 21 页 - - - - - - - - - 根据之前需要,将程序划分为多个模块,然后将每个模块单独编写,每个模块可以单独编写一个程序来检测。例如:在学生成绩管理系统中的“学生成绩输入模块”可根据以下方式,先单独定义一个 main( ) 函数,看其是否符合要求的功能。#includestdio.h #includestddef.h #includestddef.h #includestring.h #define MAX 10 typedef struct student char nameMAX; int numMAX; char sexMAX; int chinese; int mathematic; int english; int computer; struct student *next; stu=kang,01,g,61,71,81,91,wang,02,b,62,72,82,92; main() struct student *p; for(p=stu;pname,p-num,p-sex,p-chinese,p-mathematic,p-english,p-computer); 注:功能调试时多实验几个数值,以免其通用性不强。C. 程序运行结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 21 页 - - - - - - - - - 注:系统运行输入密码。当输入的密码为 123456 (初始密码)与系统中存储的一致时, 系统直接进入开始界面:进入后就可输入拥护的信息,包括班级、姓名。进入功能选择界面,拥护可根据需要选择相应的序号。如选择3项功能。则出现以下界面:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 21 页 - - - - - - - - - 九、 用到的库函数简介A. 输入输出函数 printf 形式: printf(char *format,args, ) 按 format指向的格式字符串所规定的格式、将输出表列args 的值输出到标准输出设备; scanf 形式: scanf(char *format,args,)从标准输入设备按gormat 指向的格式字符串所规定的格式,输入数据给args 所指向的单元; fopen 形式: fopen(char *filename,char *mode)以 mode指定的方式打开名为filename 的文件; fclose 形式: fclose(file *fp)关闭 fp 所指的文件,释放文件缓冲区。B. 字符串函数 strcmp 形式: strcmp(char *s1,char *s2) 对 s1 和 s2 所指字符串进行比较,s1s2 返回正数。C. 动态分布函数和随机函数 malloc 形式: malloc(unsigned size)分配 size 字节的存储区。十、 实习心得体会。经过短短一星期的计算机软件技术实习,我对计算机编程培养了浓厚的兴趣,以前总认为 C语言很枯燥,但当我看到了用C语言做出的学生成绩管理系统 、 黑白棋游戏系统 、 图书馆管理系统后,我才真正感受到了C 程序设计的灵活和神奇。仅仅大小不到 3M的一个 TC环境居然能通过源程序的运行作出那么多的以前觉得很神秘的软件程序。让我真正学到了计算机的有用和学习编程的必要性。在编写和读程序的过程中,我对C语言的很多细小环节有了更深入的了解,具体如下:1)函数定义是要做到顾名思义是很重要的,他对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。2)分析函数先从 main() 函数入手。 Main() 函数是 C源程序编译时的开始,从main()名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 21 页 - - - - - - - - - 函数开始读函数可将其他函数的功能理解得更透彻。3)在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。4)我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行处理的函数,起功能我都有所了解。十一、参考文献1)张继温、谭浩强、唐永炎编,C 语言程序设计教程,高等教育出版社, 1998年 9月。2)全国计算机等级考试二级教程C 语言程序设计,高等教育出版社, 1998 年 9月。3)全国计算机等级考试二级教程公共基础知识,高等教育出版社, 2004 年版。4)朱振元等编数据结构(面向对象语言描述) ,清华大学出版社, 2004 年 2 月。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 21 页 - - - - - - - - -