C语言课程设计.docx
- 文档编号:6257696
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:25
- 大小:52.56KB
C语言课程设计.docx
《C语言课程设计.docx》由会员分享,可在线阅读,更多相关《C语言课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
C语言课程设计
C语言课程设计
报告
题目:
学生成绩管理系统
姓名:
学号:
班级:
专业:
学院:
指导教师:
2008年12月25日
一:
题目与要求
(一)、课程设计题目
《学生成绩管理系统》的设计与实现
(二)、课程设计目的
1、进一步掌握和利用C语言进行程设计的能力;
2、进一步理解和运用结构化程设计的思想和方法;
3、初步掌握开发一个小型实用系统的基本方法;
4、学会调试一个较长程序的基本方法;
5、学会利用流程图或N-S图表示算法;
6、掌握书写程设计开发文档的能力(书写课程设计报告);
(三)、设计内容
1、每一条记录包括一个学生的学号、姓名、3门课成绩、平均成绩。
2、输入功能:
可以一次完成若干条记录的输入。
3、显示功能:
完成全部学生记录的显示。
4、查找功能:
完成按姓名查找学生记录,并显示。
5、排序功能:
按学生平均成绩进行排序。
6、插入功能:
按平均成绩高低插入一条学生记录。
7、将学生记录存在文件score中。
8、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
(四)、设计要求
1、用C语言实现系统;
2、利用结构体数组实现学生成绩的数据结构设计;
3、系统具有增加,查询,插入,排序等基本功能;
4、系统的各个功能模块要求用函数的形式实现;
5、完成设计任务并书写课程设计报告。
6、将学生成绩信息存在文件中。
(五)、提交材料
1、课程设计报告
1)课程设计题目、内容、要求。
2)总体设计(包含几大功能模块)。
3)详细设计(各功能模块的具体实现算法——流程图)
4)数据结构设计描述,各模块(函数)的功能介绍,参数说明等。
5)调试分析(包含各模块的测试用例,及测试结果。
)
6)总结(课程设计完成了哪些功能,还有哪些地方需要改进,及通过一周的课程设计有何收获,调试程序的体会等)
二:
程序数据结构说明:
1.链表的建立模块(一次性输入,输入个数由用户决定,最大可容纳80记录,最大数可以在源程序中改)。
2.链表输出模块。
(在屏幕上显示当前链表的数据)。
3.修改模块。
4.删除模块。
5.插入模块。
6.查找模块(按姓名查找)。
7.插入模块。
8.排序模块(对记录进行排序,按平均成绩排序)。
9.清屏。
10.数据结构是这样的:
学号只能由数字字符组成,最大可以11个字符;姓名由字符组成,最大可以20个字符;三门科目分数都是整型;平均成绩是实型。
11.程序中定义了学生的容量为50个。
容量可以在源程序宏定义中改,本程序宏定义#defineN50
三:
各个模块的流程图
主菜单函数
主介面的流程图如下
清屏
显示一系列功能选项
输入n
判断n,(必须是0-9)
Y
N
W1=0
W1=1
While(w1==1)
对n多分支选择switch(n);
n=1
n=2
n=3
n=4
n=5
n=6
n=7
n=8
n=9
链表建立模块
链表输出模块
修改模块
删除模块
插入模块
查找模块
排序模块
保存模块
清屏
说明:
从该流程图中我们可以看出每个模块结构所对应的功能,从而能够清楚的了解此程序的结构网络,只需把每个模块函数写好存放在对应的模块即可,这能够大大的提高程序的可读性。
(一)、链表建立模块流程图
开辟一个新结点,并使p1,p2指向它
读入一个学生数据给p1所指的结点
head=NULL,n=0
当读入的p1->num不是零
n=n+1
N等于1?
YN
head=p1(把p1所指的结点作为第一个结点)
P2->next=p1(把p1所指的结点连接到表尾)
P2=p1(p2移到表尾)
再开辟一个新结点,使p1指向它
读入一个学生数据给p1所指的结点
表尾结点的指针变量置NULL
说明:
在此建立一个链表用于存放学生信息的结构体。
(二)、链表输出模块流程图
P=head,使p指向第一个结点
YP指向的不是尾结点N
当p指向的不是表尾
说明:
链表输出是对学生信息输出的函数根据指针P所指向的结点而输出对应的学生个人数据信息。
(三)、修改模块流程图
定义structstudents;inti,n,k,w0=1,w1,w2=0;
调用加载记录n=load();n为记录个数
清屏clrscr();
显示所有记录,让用户看哪个要修改
输入要修改的学号s.num
是否找到此学生记录stu[i]
Y
N
k=i;
s=stu[i]
提示没有找到
While(k==-1);
显示找到的记录
调用修改函数w1=modify_data(i,n);w1为保存控制值
if(w1==1)
Y
N
询问用户是否继续修改另一个
1)是2)保存返回
w0=0;
if(w2==1)
Y
N
输入w0
stu[k]=s;
W2=1;
if(w0!
=1&&w2==1)
Y
N
保存save(n);
While(w0==1);
返回主菜单
说明:
调用w1=modify_data(i,n)修改函数时,若返回值为1则表示用户在修改函数里面确认了这次修改,其中i表示第i个记录(要修改的),n表示总共有n个记录,n以便这修改函数在调用输入函数时用;若返回值不为1则不保存这次修改,但保存这次之前的修改,这由w2来控制,w2=1则表示有过用户修改确认史。
(四)、删除模块流程图
定义structstudents;inti,n,k,w0=1;
调用加载记录函数n=load();n为记录个数
清屏clrscr();
K=-1;
显示所有记录,让用户看哪个要修改
输入要修改的学号s.num
是否找到此学生记录stu[i]
Y
N
k=i;
s=stu[i]
提示没有找到
While(k==-1);
显示找到的记录k
让用户选择进行操作
1).确定删除2).要删除另一个3).直接退出
输入c
判断C的值.三分支选择
C=1
C=2
c=3
stu[k].ave=0;作删除标记,保存时则此记录不保存
W0=0;
询问用户是否继续
Y
N
W0=1;
W0!
=1;
if(w0!
=1&&c!
=3)
保存;
While(w0==1);
返回主菜单
说明:
若在让用户选择操作时选择了"3).直接退出",则不保存所有删除过的记录。
这里不同于修改模块。
stu[k].ave=0;作删除标记,保存时则此记录不保存
(五)、插入模块流程图
P1=head,p0=stud
原来的链表是空表
YN
将p0
所指的结点作为唯一结点
当p0->ave>p1->ave以及p1所指的不是表尾结点
P2指向p1位置p1向后移
一个位置
P0->ave<=p1->ave
YN
P1指向头结
Y点N
P1->next=p0p0->next=NULL(插到表尾之后)
head=p0,
p0->next=p1,
插到表头之前
P2->next=p0,p0->next=p1插到表中间
n=n+1
(六)、查找模块流程图
定义structstudents;inti,n,k,w1=1,w2,w3,w4;
调用加载记录函数n=load();n为记录个数
K=-1;
输入学生名字s.name
For(i=0;i s.name==stu[i].name Y N K=I;并显示此记录 if(k==-1) Y N 提示没有找到 询问是否继续 Y N W1=1; W1! =1; While(k==-1&&w1==1) W3=0;w4=0; if(k! =-1) Y N 让用户选择1).查找另一个 2).修改3).删除4).返回主菜单 输入w2 对w2多分支选择 W2=1 W2=2 W2=3 W2=4 调用修改函数 w3=modify_data(k,n); 显示待删除的记录,并询问是否删除 Y N W4=1; stu[k].ave=0; if(w3==1||w4==1) Y N 保存 询问是否继续 Y N W2=1; w2! =1; While(w2==1),返回主菜单 说明: 这模块是按姓名查找的,找到以后,增加了对它删除和修改功能。 而删除和修改模块都有浏览(记录信息不清楚的用户进行),或许删除和修改模块显得有点重复。 (七)、排序模块流程图 定义structstudent*p1,*q1,*p2,*q2 q1=head,p1=q1->head P1! =NULL NY Q2=p1,p2=q2->next p2! =NULL NY Q1=p1 p1=p1->next (p1后移一位) p1->ave>p2->ave NY q2=p2 p2=p2->next (p2后移一位) 交换对应的内容(注意是内容,而不是链表的地址) (八)、保存模块流程图 FILE*fp; inti; If(fp=fopen(“score.txt”,”wb”)==NULL) Y N 提示不能打开. ReturnNULL; For(i=0;i i++) if(stu[i].ave! =0) Y N 写到文件 关闭文件fclose(fp); 说明: 形参n是控制保存的个数.stu[k].ave=0;作删除标记,保存时则不保存此记录 五: 测试心得体会与分析 1.在本次设计中学到了不少知识,对C语言的理解加深了,也加强了动手能力。 其中知道了清屏函数clrscr();;按任意键可以插入getch();; getchar();的小技巧――当输入整型时可以接收过滤错误输入(如字符输入),对这个小技巧作了如下的测试: 一开始我的主菜单模块里有多分支选择,并且对用户选择(输入整型数字)作判断,若超出范围则提示用户且让用户重新选择。 但测试中发现当输入字符时(如a)就出现死循环: 关键部分源代码如下: do {printf(“Choiceyournumber(1-8): []\b\b”); scanf(“%d”,&n); if(n<1||n>9) {printf(“\nChoiceerroe! pleaseagain.”); w1=1;getchar(); } elsew1=0; } while(w1==1); 最后我测试发现加了getchar();就可以解决。 2.自定义函数中最让我感到得意的是加载函数load();它既精简又强大,每当要读文本时用这个函数既可读入数据,又可以统计记录个数。 它的返回值就是记录个数。 除全新输入模块没有到,其余的都要调用它,而且几乎都用到它的返回值。 这一函数也体现出结构化设计。 它的源代码如下: load() {FILE*fp; inti; if((fp=fopen(“score..txt”,”rb”))==NULL) {printf(“\nCannotopenfile”); returnNULL; } for(i=0;! feof(fp);i++) fread(&stu[i],sizeof(structstudent),1,fp); fclose(fp); return(i-1); } 原先我不会使用feof(fp); 缓冲文件系统函数,就用记录容量值N=50来控制for语句的结束。 写了源程序后总是觉得不好,因为容量是相对来说是一个常量,而且显示记录时也不好控制语句的结束,有时会出现没有的记录也显示出来(即显示为0)。 这时心里总是不安,我就翻开书看看...,啊! 终于被我发现了有了一个feof();函数,它可以检测文件是否到了末尾,是则返回值为“真”。 哈,太好了! 就试着去修改,运行。 哈哈成功啦! 但有点我不明白――为什么返回值是i-1,我是这样想的: 比如说有4个记录(i=0,1,2,3.共4个),当检测到文件到末尾时i为4了,因为共有4个记录,所以要返回i。 经过测试只有返回i-1时才是记录个数,这我就不明白了! 有待分析。 3.我觉得这次C语言课程设计还算成功,这程序还比较完善,我对它增加了修改模块、删除模块,而且需要用户的确认才能修改或删除。 增加了对学号输入时进行分析判断――只能输入0-9的字符,而且不允许学号雷同。 一些重要部分的选择作了判断(如主菜单里面的选择,而且加了getchar();来接收错误输入),在确保程序完善些时避免死循环。 其它次要的选择(没有必要的)则没有加判断,如果输入就会自动返回。 4.本程序有待改进的或不足有: 保存函数不能同时对全新输入模块与追加模块调用,本程序里它没有被追加模块调用。 由于本人还不熟悉用文件指针,所以不能对单个记录保存。 没有另存为功能,也没有打开其它位置文件(同类型)的功能。 我发现在结构体里的score[3]不能定义为实型,否则编译正确运行错误(当输入科目分数时,直接跳过不给输入,并提示错误。 如下由于时间关系,没有增加按其它项目的查找(如按科目1,科目2等等)。 这里只有按姓名查找。 4.各模块的测试。 对全新输入学生记录: 运行程序进入了主菜单――>选择(输入)1――>输入用户待输入记录的个数――>然后逐个输入记录――>提示成功询问是浏览还是返回,最后对每个函数调用,观察输出显示是否正确。 六: 总结 本次课程设计主要是考察我们对一些基本函数的认识以及对链表的处理。 。 在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针,链表……通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。 编程是一件很枯燥很无聊的事情,但是出于完成作业,得到学分的压力,还必须强破自己坚持下去,按照老师所说的模块化思想,分部分的进行编写。 而且编程是一件高精度、模范化的事情,稍有疏乎都会影响全局,也可能因为某一处的小的错误而导致整个程序的无法运行。 所以认真仔细就是非常重要的了。 开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。 又经过几天的努力,终于把程序完成了,尽管程序还是有很多错误和漏洞,不过还是很高兴的。 无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C语言的一次实践作业,自己进步的证明。 通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己更好地学好计算机。 附录 /************************************************************************ C语言课程设计程序参考程序 *************************************************************************/ #include #include #include #include #include #defineNULL0 #defineLENsizeof(structstudent) #defineM3/*课程数*/ #defineTC3 intn;/*学生数,用全局变量表示*/ structstudent { unsignednum;/*学号*/ charname[10];/*姓名*/ unsignedscore[M];/*分数*/ floataver;/*平均成绩*/ structstudent*next; }; /************************************************************************** 帮助函数,提示相关的操作。 *************************************************************************** voidHelp() { puts("*********************************************************"); puts("*StudentSystemCommandHelp*"); puts("*********************************************************"); puts("*L=Listallrecords*"); puts("*D=Deletearecordselectbynumber*"); puts("*A=Appendrecords*"); puts("*I=Insertrecords*"); puts("*S=Sortrecords*"); puts("*H=Showthishelpmessage*"); puts("*V=Saverecordstoafile*"); puts("*O=Loadrecorsfromafile*"); puts("*C=Clearscreen*"); puts("*Q=QuitSyestem*"); puts("*********************************************************"); puts("*制作人: 日期: 2008.12.28*"); puts("*********************************************************"); } /************************************************************************** 建立链表,即输入学生档案。 ***************************************************************************/structstudent*CreatTable(void) { structstudent*p1,*p2,*head; inti,j[M];/*定义临时变量和数组*/ charname[10]; n=0; p1=p2=(structstudent*)malloc(LEN);/*申请动态空间*/ head=NULL; p1->aver=0;/*初始化头指针和平均值*/ printf("Pleaseinputthenumberofstudent: \n"); scanf("%d",&i); p1->num=i; printf("Pleaseinputthenameofstudent: \n"); scanf("%s",name); strcpy(p1->name,name); for(i=0;i { printf("Pleaseinputthescore[%d]ofstudent: \n",i); scanf("%d",&j[i]); p1->score[i]=j[i]; p1->aver+=j[i]; } p1->aver/=M;/*求平均值*/ while(p1->num! =0)/*如果学号是0则退出建表程序*/ { n++; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(structstudent*)malloc(LEN); p1->aver=0; printf("Pleaseinputthenumberofstudent: \n"); scanf("%d",&p1->num); printf("Pleaseinputthenameofstudent: \n"); scanf("%s",name); strcpy(p1->name,name); for(i=0;i { printf("Pleaseinputthescore[%d]ofstudent: \n",i); scanf("%d",&j[i]); p1->score[i]=j[i]; p1->aver+=j[i]; } p1->aver/=M; } p2->next=NULL; return(head); } /************************************************************************** 打印链表,即输出学生档案。 ***************************************************************************/voidPrintTable(structstudent*head) { structstudent*p; inti; printf("\nNow,These%drecordare\n",n); printf("numname"); for(i=0;i printf("score[%d]",i); printf("aver"); printf("\n-------------------------------------------------------\n"); p=head; if(head! =NULL) do
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计