C语言课程设计报告示例
课程设计和调试过程规范化要求
1) 需求分析
分析系统功能需求以及用户操作流程。
2) 概要设计
在需求分析的基础上,确定系统总体框架(系统功能结构图)。
3) 详细设计
定义数据存储结构,并设计实现系统功能的具体算法,画出各算法的工作流程图。
4) 代码设计
根据所设计的算法,定义相应函数分别实现系统的各子功能模块,同时由主程序提供友好的用户界面,使用户可通过选择主菜单来调用课程设计中要求完成的各个功能模块,子程序执行完后还可以返回到主菜单,继续选择其他功能执行。源程序要求书写规范,结构清晰。重点函数的重点变量,重点功能部分均要求给出清晰的程序注释。
5) 程序调试
程序编译、链接成功后,自己设计实现程序功能的一组或多组测试数据,并严格按照此测试数据进行测试,然后分析测试结果。如果程序不能正常运行或结果不正确,则需对程序进行单步调试,在调试过程中认真查找算法实现中存在的问题,并加以分析和改正。如果程序能够基本正确地运行,可考虑增加若干基本的容错功能(如避免用户操作错误时程序出现死循环等) ;另外尽量对现有算法给出改进方案,并比较不同算法之间的优缺点。
课程设计报告及书写内容要求课程设计任务完成后,每位同学必须独立书写一份课程设计报告。课程设计报告的内容应包括以下部分:
1)需求分析。包括设计题目、设计要求以及系统功能需求分析;
2)概要设计。包括系统总体设计框架和系统功能模块图;
3)详细设计。包括主要功能模块的算法设计思路以及对应的工作流程图;
4)主要源程序代码。包括存储结构设计说明,以及完整源程序清单;
5)调试分析过程描述。包括测试数据、测试输出结果,以及对程序调试过程中存在问题
的思考(列出主要问题的出错现象、出错原因、解决方法及效果等) ;
6)测试结果。列出所有功能的运行界面,并作文字说明。
7)总结。包括课程设计过程中的学习体会与收获、对 C 语言和本次课程设计的认识以及自己的建议等内
容。
8)源代码。完整的 c 语言代码。
二O一七?二O—八学年第二学期
信息工程学院
课程设计报告书
课程名称:高级语言程序设计
班级:
学号:
姓名:
薛海燕
指导教师:
二O—八年六月
目录
1.题目 (4)
2.功能 (4)
3.要求 (4)
4.设计内容 (4)
4.1 主函数MAIN () ................................................ 4..
4.2 初始化函数STUDENT * INIT () (4)
4.3 菜单选择函数INT MENU _SELECT(); (4)
4.4输入记录函数STUDENT * CREATE() (5)
4.5 显示记录函数VOID PRINT(STUDENT * HEAD ) (5)
4.6查找记录函数VOID SEARCH(STUDENT * HEAD ) (5)
4.7删除记录函数STUDENT * DELETE(STUDENT * HEAD ) (6)
4.8排序函数STUDENT * SORT(STUDENT * HEAD ) (7)
4.9插入函数STUDENT * INSERT(STUDENT * HEAD ,STUDENT * NEW) (7)
4.10保存数据到文件函数VOID SAVE (STUDENT * HEAD ) (8)
4.11从文件读数据函数STUDENT *LOAD () (8)
5.调试分析 (9)
6.测试结果 (9)
7.总结 (12)
8.源代码 (12)
1.题目
《学生成绩管理系统》的设计与实现
2.功能
(1)每一条记录包括一个学生的学号、姓名、3 门成绩、平均成绩。
(2)输入功能:可以一次完成无数条记录的输入。
(3)显示功能:完成全部学生记录的显示。
(4)查找功能:完成按姓名查找学生记录,并显示。
(5)排序功能:按学生平均成绩进行排序。
(6)插入功能:按平均成绩高低插入一条学生记录。
(7)保存功能:将学生记录保存在任何自定义的文件中,如保存在:c:\score。
(8)读取功能:将保存在文件中的学生记录读取出来。
(9)有一个清晰美观界面来调用各个功能
3.要求
(1)整个系统均用 C 语言实现;
(2)利用指针、链表来实现学生成绩的数据结构设计;
(3)系统具有输入、显示、查询、删除、排序、插入,保存、读取基本功能;
(4)系统的各个功能模块都用函数的形式来实现;
(5)可以将学生成绩信息保存在文件中。
(6)可以将学生信息从文件中读取出来。
4.设计内容整个系统除了主函数外,另外还有10 个函数,实现八大功能:输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。各个函数的详细设计说明分别如下:
4.1主函数main()
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
4.2初始化函数STUDENT *init()
这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使head的值为
NULL 。比如:没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
4.3菜单选择函数int menu_select();
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择,中间还显示系统当前的时间。等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!
4.4输入记录函数STUDENT *create()
这是一个无参函数,用来执行第学生成绩记录的输入,当学生为0时停止输入,函数结
束后,带回一个指向链表头的指针head。
算法:先声明一个首节点head,并将head-〉next设为NULL。每输入一个数据就声明一
个新节点P,把p->next设为NULL,并且链接到之前列表的尾端。
N-S流程图如图1所示。
head=NULL
for(;)
4.5显示记录函数void print(STUDENT *head)
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。
算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后
再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。
N-S流程图如图2所示。
图2
4.6查找记录函数void search(STUDENT *head)
这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进
行查找,并显示所查找到的记录。
算法:采用线性查找法往下一个节点查找。输入所要查找的学生的学号S,设一个指针
变量p,先指向第一个结点,当strcmp(p->name’s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。
N-S流程图如图3所示。
3
4.7删除记录函数STUDENT *delete(STUDENT *head)
这是一个有参函数,形参为“链表头的指针”,先输入要删除的学生记录的学号,找到后显示该学生信息,等确认后便可按“Y”进行删除。
算法:从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的
那个学号。如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,
直到遇到表尾为止。
N-S流程图如图4所示。
p仁head;
输入入要删除的学号s
当(strcmp(p1->num,s))&& p1 != NULL
p2=p1 p1=p1- >next
head=p1- >next p2->n ext=p1- next 的信息“
(删除头结点)
图4按照学号删除学生信息流程图
4.8排序函数STUDENT *sort(STUDENT *head)
这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序, 还可以显示名次。
N-S流程图如图5所示。
temp=head->next,head->next=NULL
当temp!=NULL 时
t=temp ;temp=temp->next ;p仁head; p2=head; 当t->average
当p1!=NULL
i++ ;p1->order=i ;p1=p1->next ;
输出“排序成功”
图5按照平均分降序排序流程图
4.9插入函数STUDENT *insert(STUDENT *head,STUDENT *new)
这是一个有参函数,形参有两个,一个是“链表头的指针”,一个是“待插入指针”,按照原来成绩平均分的高低进行插入,插入后会重新进行排序,并返回。
算法:先将学生的成绩按平均分由高分到低分进行排序,再插入一个新生的结点,要求按平均分的高低顺序插入。先用指针变量p0指向待插入的结点,p1指向第一个结点。如
果pO->average
移,并使p2指向刚才p1所指的结点。重复以上的步骤,直到pO->average>=p1->average
为止。这时将p0指向的结点插到p1所指结点之前。但是如果p1所指的已是表尾结点,则
p1就不应后移了。如果p0->average比所有结点的average都小,则应将p0所指的结点插到链表末尾。如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将p0的值
赋给p2->,使p2->next指向待插入的结点,然后将p1的值赋给p0->next,使得p0->next 指向p1指向的变量。如果插入位置为第一个结点之前,则将p0赋给head,将p1赋给p0-
>next。如果要插到表尾之后,应将p0赋给p1->next,NULL赋给p0->next。最后再调用排
序的函数,将学生成绩重新排序.
N-S流程图如图6 所示
6
4.10保存数据到文件函数void save(STUDENT *head)
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。
N-S流程图如图7所示。
7
4.11从文件读数据函数STUDENT *load()
这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。
N-S流程图如图8所示。
8
5调试分析
(1)刚开始没有那个初始化函数,程序运行后,没有输入任何数据就试得去执行显示功能,结果显示的是一些乱码!加入初始化函数后,这种现象也随之消失。
(2)刚开始执行输入函数,按学号顺序输入十个学生的成绩,输完后执行显示功能,学生成绩记录是按学号的反顺序显示的,试着在其中增加一些语句,希望能把学号按正常
顺序显示,但暂时没有成功,所以在输入成绩时只能按学号反顺序输入,最后就按学号正常顺序输出了。
(3)刚开始时,先把成绩按平均分排序,再插入一个学生的成绩,执行显示功能,虽
然插入的学生的成绩能正常插入,但该学生的名次为0。后来,在插入成绩之后,调用排
序函数,把所有成绩重新排序一次。
(4)在输入函数中设了一个无限循环,可以输入无数个学生的成绩信息,当学号为0 的时候则停止输入。
(5)输入太多个学生的成绩时,屏幕显示不能控制为一页一页显示,所以为了方便起见,不要输入太多记录,十七左右为最佳。
(6)在没有输入任何信息的情况下,去执行排序功能,最后显示有一个记录,学号、姓名为空白,成绩都为0,名次为1。
(7)在输入选项时不能输入字母,否则会死循环,建议不要乱输字母。
*************** 这里写自己的调试过程,可以贴图并配以文字分析
*****************
6?测试结果
(1)主函数非法输入测试
如图9所示为主函数非法输入测试。
选釋你晏谡行的骡作(17): ghfhfgkylhy
辘人u 含有养法宇荷「运重訴请一口
请逢择畑费三二的饌作(「町:1 现在谓毡昵提示进特书購电人库
活錯人鱼吃A 举的兰旨匡吠* ?上)
图9主函数非法输入测试
(2)登记入库测试如 图10所示登记入库界面。
图11列出了图书馆中的所有藏书,表示,登记入库成功,高等数学数的现存量。
t?
叫匸痔啓日琦童¥蔽书 '~O D kxM -?
泡N 舜知NX%X i-
- = YWrri“kX 屈 *4 kXKkMM
? -4 > t 号 宰越 件香 00它C 由E 00G00 0QGQ0 1112?2 舅雜 -2 3M5G 再初坡卷 匡傕哼 理碍列讣也界讣氓眉 辛弭衲 tpTIII 爺带錯也 符幵耀 tp ;?4M 置卡皆-;丄-逼彩打; j- ,-; .;?, :tp^6S6黑決汴伫 主陀 tp^MS 致慚期试 t-ziflj | 十护5弱^:1< lL.lv +.: ,出?上孝耳:再 輻盛 图11图书馆所有藏书一览 (3) 读者登录数据测试 如图12,为读者登陆测试界面。 t t fe 輸 fe .s -K F 亠 I- 压 J= r F 3窄豈生 7底 畳 <負豎登登入库的人库的 A 轲书 .入库的: 盒库的; 71 书籍的书?(GR):tp33*fH 书詹篩书岛:因书馆管理系 统 還的击版社卅囂机学院 {焉他出整壬期(站TB 血刀: 「焉仕輩呈H5 21Q0 书肯书 1.7 思版日期 JB 存量S?Tft tp3$呐国右背肯斑莅我 互黃鬲 -SAlvS 2193 H J 5 2 5 k- 5 z M- 4 Z 2 4^ ?H441H2 启总择化爵喝F 的熒作(I-*) jkhklFyjhghjg Q0O 2010.09 12 油鸵H.丄氏讨 20D9 €B. 12 ■r "~i-- ; : : :■ /■ 2BT6 02.33 ①窑'丸学 20IQ 03 2) 祜卸舟学 2G1 0.05 12 卄訐机李陆 2100 计王礼:㈡宅 2G1C 12.31 图12读者登陆数据测试 (4) 借书操作测试 如图13所示。如借书成功,现存量减少。 OQL # ^r :k& ■ r 4- - oo 图1414 (5) 还书操作测试 如图15所示。选中需要还的高等数学书,还书成功,高等数学现存量重新变成 25。 15 图16显示读者的借书情况中少了高等数学。 16 7总结 *************** 这里写自己的心得体会,比如拿到题目之后如何一步一步实现的?收获的经验是什么?程序中哪部分是碰到的难点?如何解决这个难题的?以后怎样做才能提 高程序设计课程的学习效果?***************** 8源代码 *************** 将C语言代码复制到这里***************** 《高级语言程序设计课程设计》评分标准