1、程序设计综合训练 C语言版指导书第一章 综合训练介绍1.1 综合训练目的程序设计综合训练是在学习完程序设计基础课程后开设的一门实践性课程。要求学生以个人为单位,在教师指导下,综合运用所学过的C语言程序设计知识,掌握结构化程序设计的基本思路和方法,发挥自学能力和查找资料的能力,解决稍微复杂的结构化程序设计问题,加深对所学知识的理解和掌握,增强学生运用理论课所学知识分析问题、解决实际问题的能力,通过本课程的实践,为以后的程序开发打下良好的基础。综合训练的目的和要求:(1) 使学生巩固和加强C语言程序设计课程的理论知识。(2) 使学生掌握C语言的基本概念、语法、语义和数据类型的使用特点。(3) 使学
2、生掌握C语言程序设计的方法和编程技巧,能正确使用C语言编写程序。(4) 进一步理解和运用结构化程序设计的思想和方法,学生利用流程图或N-S图表示算法。(5) 使学生掌握调试程序的基本方法及上机操作方法。(6) 掌握书写程序设计开发文档的能力,使学生学会撰写综合训练总结报告。综合训练的思想和方法还可以作为学生做毕业设计时的参考资料。(7) 通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。为学生以后的程序开发打好基础。(8) 初步掌握开发一个小型实用系统的基本方法:结合实际应用的要求,使综合训练既覆盖知识点,又接近工程实际需要。通过激发学习兴趣,调动学生主动学习的积极性,并引导他们根
3、据实际编程要求,训练自己分析问题的能力和编程能力,养成良好习惯。(9) 培养学生的创新能力和创新思维方式。学生可以根据指导书和相关文献上的参考算法,自己设计出相应的应用程序,也可以根据自己的兴趣、爱好、特长,或者以前已经接触过的内容,自行确定综合训练课题。(10) 培养学生良好的程序设计风格。在实际编程中,为了提高编程质量,对空行、空格和注释均有要求。学生在综合训练书写代码时,应该严格按要求处理,以便建立良好的程序设计风格和习惯。1.2 设计环境及语言(1) 硬件:PC机,不低于CPU为PIII,内存为128,4G硬盘,其他硬件与此相匹配。(2) 软件:操作系统为Windows2000或Win
4、dows XP,设计语言为Turbo C3.0或Visual C+集成开发环境。1.3步骤(1) 需求分析 从软件使用者处获得用户需求,确定课题开发应具备的功能;(2) 系统结构设计 将整个系统功能分块,考虑各个功能模块应具备的功能,模块间的联系,划分成不同的子系统进行设计(确定各模块函数名称);(3) 数据设计 根据问题描述,设计系统中的数据类型、数据存储方式;(4) 代码设计 在上述3个阶段的基础上完成主程序算法设计和各模块算法设计;(5) 代码实现 编程实现;(6) 软件调试和测试 使用事先设计好的测试用例、对编制的程序进行测试,发现存在错误(包括潜在的问题),加以修改,完善;(7) 撰
5、写文档 完成设计文档和综合训练报告。1.4 综合训练提交材料l 电子版的所有.c文件、.h文件和电子稿的综合训练报告。文件放在建立的文件夹中,文件夹统一命名:学号_姓名,通过网络课堂提交。l 综合训练报告 内容包括:(1) 课题设计内容、具备的功能;(2) 模块(函数)的划分、各模块(函数)的功能(用Visio画出功能模块图);(3) 采用的自定义的数据类型;(4) 程序设计过程、调试中过程中所用的测试用例、程序运行的结果(用Visio画出主流程图);(5) 在综合训练中遇到的问题和解决的方法,还没有能解决的问题;(6) 通过综合训练的体会、收获。l 综合训练报告要求:所用的纸张大小统一为A4
6、 幅面;设计完毕后应装订成册,封面用学院编制综合训练统一封面,封面内容完整准确填写,报告格式见撰写规范。1.5 基本要求(1) 综合训练采取每人一题,可任选一题进行设计;(2) 可以选择老师提供的参考选题,也可以自选,如果自选,将自选题目的详细内容以及实现要求跟老师交流,老师同意后可采用。(3) 要求利用结构化程序设计方法以及C语言的编程思想来完成系统的设计。(4) 要求有欢迎界面、菜单、文件操作、数据使用数组、结构体、链表均可,键盘操作或鼠标操作均可。(5) 模块化程序设计:要求在设计的过程中,按功能定义函数或书写多个文件,进行模块化设计、各个功能模块用函数的形式来实现。(6) 学生所选课题
7、必须上机通过,并获得满意的结果。(7) 程序书写风格:锯齿形书写格式。1.6 教学安排综合训练属于研究型、创新型、自主型学习。学生可以根据自己的兴趣、爱好、特长,或者以前已经接触过的内容,自行确定综合训练课题。也可完成老师提供的参考课题。具体安排如下:1. 讲解分析任务、明确要求(1学时)2. 确定课题(1学时)3. 查阅资料(4学时)4. 自学相关知识(4学时)5. 制定方案(8学时)6. 程序设计(18学时)7. 测试,运行,回答老师提出的问题(2学时)8. 撰写综合训练文档,提交综合训练报告及软件(2学时)1.7 考核办法标准优:按要求完成所有选题任务,有完整的符合标准的文档,文档有条理
8、、文笔通顺,格式正确,其中有总体设计思想的论述,有正确的流程图,程序完全实现设计方案,设计方案先进,软件可靠性好;良:完成80%以上选题任务,有完整的符合标准的文档,文档有条理、文笔通顺,格式正确;有完全实现设计方案的软件,设计方案较先进;中:完成60%以上选题任务,有完整的符合标准的文档,有基本实现设计方案的软件,设计方案正确;及格:完成50%以上选题任务,有完整的符合标准的文档,有基本实现设计方案的软件,设计方案基本正确;不及格:完成的题目数不到4题,没有完整的符合标准的文档,软件没有基本实现设计方案,设计方案不正确。)对于不能按时完成综合训练报告的同学,一律不予给定成绩,不能给予相关学分
9、。本次综合训练报告必须独立完成。如发现纯属抄袭他们设计方案者一律不予评定为不及格。19第二章 综合训练参考课题2.1 学生成绩管理系统2.1.1 参考课题内容及知识点“学生成绩管理系统”通过建立、修改、删除、查询、排序、显示学生成绩等信息功能,具体要求掌握的技术有:(1) 结构、枚举类型的定义与使用;(2) 数组的定义使用;(3) 程序的三种基本控制流程的综合、灵活运用;(4) 普通指针和数组指针的定义和使用;(5) 各类函数的定义和调用;(6) 文件的输入/输出;(7) 程序的调试。2.1.2 功能要求每个学生的信息为:学号、姓名、性别、联系电话、语文、数学、外语三门单科成绩,考试平均成绩。
10、学生信息处理:(1) 新增学生信息。输入学号、姓名、联系电话,三门功课成绩,计算总成绩并显示,同时按输入顺序存入文件中。(提示:先把学生信息读入数组,然后按提示输入每科成绩,计算平均成绩,平均成绩=(语文+数学+外语)/3,计算平均成绩最后把学生记录写入一个文件中)(2) 插入(修改)学生信息。(提示:要求学号不重复,若学号已经存在,让重新输入,无重复学号则将插入的学生其他信息输入,计算总成绩并显示,把该记录插入数组,然后把插入后信息写入文件中)(3) 删除学生信息。输入学号,根据学号删除该学生信息。(提示:输入将删除学生学号,读出该学生信息,要求对此进行确认,以决定是否删除,若是则删除该学生
11、信息并把删除后的信息写入文件中)(4) 显示全部学生信息。(提示:打开文件,显示该文件的学生信息)(5) 根据学号查询学生信息:输入学号,查找该生并显示学生数据。(提示:输入要查询的学生学号,若存在,读出该学生信息,否则,给出提示信息,无此记录)(6) 学生信息排序:一、根据学号排序学生数据。(提示:学生信息可先在数组中排序,排序后再写到文件中。)二、根据总成绩排序学生数据。(7) 备份学生信息。(提示:要求输入文件名,按此文件名建立文件,并把所有学生信息写入该文件)(8) 退出。结束程序运行。(9) 密码设置。密码正确可使用系统,错误三次不让使用系统,为保证密码的安全,可对密码进行加密,加密
12、算法自行设计。(提示:设置密码成功后密码加密写入文件,核对密码时读取并解密)2.1.3 设计要求(1) 在Turbo C3.0或Visual C+控制台应用程序方式下设计课题。(2) 系统必须提供简单、易操作的人机界面。(3) 程序应具有一定的健壮性。即程序必须具有必要的检查和出错处理,如在新增学生数据时检查输入的学号是否相同;修改数据时,保证数据学号不重复,删除、查询学生时检查输入的学号是否存在等。(4) 设计的程序要求完成2.1.2节(1)-(8)规定的功能。(5) 选做2.1.2(9)。2.1.4 参考课题部分设计1)设计student结构类型,成员为char no5 学号char na
13、me8姓名char gender2性别int score43门课程成绩及总成绩3)设计下列函数void init();/初始化,文件不存在,则建立,同时记录下文件中的记录数int get_menu_choice()/接受菜单选择void menu()/菜单响应void show_menu();/显示菜单FILE *file_operate(char *mode);/文件操作void Delete(FILE *fp);/删除记录void Alter(FILE *fp);/修改记录信息void Show();/显示打印所有的信息void Save();/备份信息到文件void Find();/查找
14、记录的函数void Sort(); /按学号从小到大选择排序,并显示,存盘void Input(FILE *fp);/向通讯录中增加记录int Inputoneperson(int i);/向数组增加一条记录void set_psw();/设置密码void psw_check()/密码验证/下面函数为了简化部分工作从上面函数中划分出来的功能void exchange(int i,int j);/交换两个人的所有信息void PrintTitle();/打印头信息void clear();/清屏void Showoneperson(int i);/显示打印一个人的信息int CheckNumbe
15、r(char *pNumber,int);/检查学号是否存在,存在返回序号,不存在返回-1void Inputfile(int i,FILE *fp);/把下标为i的记录写入文件void Readfile(int i,FILE *fp);/读一条记录从文件 4)设计主函数main(),运行后,屏幕显示功能菜单*1.显示数据|2.删除数据3.查询数据|4.输入数据5.修改数据|6.备份数据7.设置口令|8.数据排序0.退出*用户输入选择后,程序运行相应的处理函数Show()、Delete(FILE *fp)、Find()、Input(FILE *fp)、Alter(FILE *fp)、Save(
16、)、set_psw()、Sort()。其中参数为FILE *fp的该模块有数据改动,数据改动后及时写入文件。运行主函数main(),调用Init()函数,从文件student.txt中读取学生数据,得到信息总数total(全局变量)。然后等待用户输入选项,进行相应处理。设计除main()主函数、Init()函数、menu()、Show_menu()、get_menu_choice()、clear()、Input(FILE *fp)、Inputoneperson(int i)、FILE *file_operate(char *mode)、CheckNumber(char *pNumber,int
17、 j)、Show()、Showoneperson(int i)、Readfile(int i,FILE *fp)函数之外的其他函数。2.1.5 参考课题部分源程序#include stdio.h#include stdlib.h#include string.h#define MAX 500#define M 3 /课程门数struct Student/学生记录结构char no10;/学号char name10;/姓名char gender4;/性别int scoreM+1;/三门功课,scoreM为总成绩;int total;/记录人数struct Student studentsMAX;
18、/定义studentsMAX为全局变量/*/void Init();/初始化,文件不存在,则建立文件void exchange(int i,int j);/交换两个人的所有信息void Sort(); /按编号从小到大选择排序,并显示存盘int get_menu_choice();/接受菜单选择void Show_menu();/显示菜单void menu();/菜单响应void PrintTitle();/打印头信息void clear();/清屏FILE *file_operate(char *mode);/文件操作void Alter(FILE *fp);/修改一条记录信息void De
19、lete(FILE *fp);/删除一条记录void Showoneperson(int i);/显示打印一个人的信息void Show();/显示打印所有的信息void Save();/保存信息到文件void Find();/查找记录的函数int CheckNumber(char *pNumber,int);/输入的编号是否重复int Inputoneperson(int i);/向数组增加一条记录void Input(FILE *fp);/向通讯录中增加记录void set_psw();/设置密码void psw_check();/密码验证void Inputfile(int i,FILE
20、 *fp);/把下标为i的记录写入文件void Readfile(int i,FILE *fp);/读一条记录从文件/*/void Show_menu()printf(n n);printf(t 欢迎使用通讯录n);printf(t*n);printf(t1.显示数据|2.删除数据n);printf(t3.查询数据|4.输入数据n);printf(t5.修改数据|6.备份数据n);printf(t7.设置口令|8.数据排序n);printf(t0.退出n);printf(t*n);int get_menu_choice()/接受菜单选择int sel;doprintf(nPlease Inpu
21、t Your Choice(0-8):);scanf(%d,&sel);if(sel8)puts(Input error,Please Input Your Choice(0-8):);while(sel8);return sel;void clear()/清屏system(pause);system(cls);void PrintTitle()/显示表头printf(-);/学生设计void Init()/文件不存在,则建立文件int i;FILE *fp;total=0;if(fp=fopen(student.txt,rb)=NULL)/打开文件失败,表示文件不存在fp=fopen(stu
22、dent.txt,a);/新建文件menu();/调用菜单else/如果原来文件存在了for(i=0;feof(fp)=0;i+)/获取总人数Readfile(i,fp);total=i;/总人数fclose(fp);FILE *file_operate(char *mode)/文件操作char choice;FILE *fp;dofflush(stdin);if(fp=fopen(student.txt,mode)=NULL)puts(File operation failure.);puts(Try again(y/n)?);scanf(%c,&choice);while(choice=y
23、|choice=Y);if(choice=n|choice=N)exit(1);/出现异常退出return(fp);void Showoneperson(int i)/显示一条记录int j;printf(%s,studentsi.no);printf(t%s,studentsi.name);printf(t%s,studentsi.gender);for(j=0;jM+1;j+)printf(t%d,studentsi.scorej);printf(n);void Show()/显示所有记录int i;printf(There %d Record:n,total);PrintTitle();
24、for(i=0;itotal;i+)Showoneperson(i);void menu()while(1)Show_menu();switch(get_menu_choice()case 1: Show();clear();break;case 2: Delete(file_operate(r);clear();break;case 3: Find();clear();break;case 4: Input(file_operate(a);/增补,如果文件不存在则创建一个clear();break;case 5: Alter(file_operate(rb);clear();break;ca
25、se 6: Save();clear();break;case 7: set_psw();clear();break;case 8: Sort();clear();break;case 0:printf(欢迎你使用本程序!n);clear();exit(0);/程序正常退出int CheckNumber(char *pNumber,int j)int i;for(i=0;itotal;i+)/找到,跳出循环if(strcmp(studentsi.no,pNumber)=0&i!=j)break;if(i=0)printf(Number repeated.n);return 0;elsestrc
26、py(studentsi.no,no_temp);printf(Name(less than 12 characters):);scanf(%s,&studentsi.name);printf(Gender:);scanf(%s,&studentsi.gender);printf(n语文t数学t英语n);for(j=0;jM;j+)scanf(%d,&studentsi.scorej);sum=sum+studentsi.scorej;studentsi.scoreM=sum/M;clear();/清屏PrintTitle();/打印头部Showoneperson(i);/打印添加的这条信息r
27、eturn 1;void Readfile(int i,FILE *fp)/从文件fp中读一条记录int j;fscanf(fp,%10s ,&studentsi.no);fscanf(fp,%10s ,&studentsi.name);fscanf(fp,%4s ,&studentsi.gender);for(j=0;jM+1;j+)fscanf(fp,%4d ,&studentsi.scorej);void Input(FILE *fp)int i=total;/从此增加char choice=y;doif(Inputoneperson(i)/记录无重复,写入文件total+;/记录总增加
28、1Inputfile(i,fp);i+;printf(Input continue(y/n)?);scanf( %c,&choice);while(choice=y|choice=Y);fclose(fp);int main()Init();/system(cls);/psw_check();/clear();menu();return 0;void psw_check()/密码验证/学生设计void set_psw()/设置密码/学生设计void Alter(FILE *fp)/修改记录/学生设计void exchange(int i,int j)/记录交换/学生设计void Sort()
29、/按编号从小到大选择排序,并显示存盘 /学生设计void Delete(FILE *fp)/删除记录/学生设计void Find()/查询记录/学生设计void Save()/备份信息/学生设计void Inputfile(int i,FILE *fp)/把下标为i的记录写入文件/学生设计2.1.6 参考课题程序运行截图程序运行结果图示:未设置密码前,先让设置密码:图2-1 密码设置密码正确后菜单显示:图2-2 程序运行后的菜单显示显示记录数和所有记录情况:图2-3 “1.显示数据”界面图2-4 “2.删除数据”界面图2-5 “3.查询数据” 界面输入数据界面,输入后可选择是否继续输入:图2-
30、6 “4.输入数据” 界面图2-7 “5.修改数据” 界面备份完成后,在相应文件夹里面会生成以此为命名的文件,并把student.txt里面的内容都复制过去。图2-8 “6.备份数据” 界面图2-9 “8.数据排序”界面2.2 通讯录管理系统2.2.1参考课题内容及知识点“通讯录管理系统”通过建立、修改、删除、查询、排序、显示通讯信息等功能,系统重点训练学生对C语言的综合应用能力,具体要求掌握的技术有:(1) 结构、枚举类型的定义与使用;(2) 数组的定义使用;(3) 链表的定义及使用(4) 程序的三种基本控制流程的综合、灵活运用;(5) 普通指针和数组指针的定义和使用;(6) 各类函数的定义
31、和调用;(7) 文件的输入/输出;(8) 程序的调试。2.2.2 功能要求系统必须至少提供以下几种操作:(1) 提供对通讯录的建立、修改、追加记录、删除记录等基本功能;(2) 提供查询记录的功能;(3) 提供显示记录的功能;(4) 提供保存信息的功能;(5) 提供按通讯录编号排序或者按姓名排序的功能(编号自动生成唯一); (6) 提供将通讯录分类的功能;(7) 提供打印通讯录的功能。2.2.3 设计要求(1) 在Turbo C3.0或Visual C+控制台应用程序方式下设计课题。(2) 系统必须提供简单、易操作的人机界面。(3) 程序应具有一定的健壮性。即程序必须具有必要的检查和出错处理,如
32、在新增通讯记录时检查输入的姓名是否相同;修改数据时,保证姓名不重复,删除、查询信息时检查输入的姓名是否存在等。(4) 设计的程序要求完成2.2.2节(1)-(5)规定的功能。(5) 选做2.2.2(6)-(7)。2.3 俄罗斯方块游戏2.3.1 参考课题内容及知识点俄罗斯方块是比较传统的游戏,其操作简单。主要包括:产生并显示各种形状的“方块”,实现“方块”的移动、旋转、下落以及落后底部“方块”的处理。系统操作遵守游戏的基本规则,实现游戏的简单功能。游戏基本规则为表示旋转“方块”,表示左移“方块”,表示右移“方块 ,空格表示直接下落,ESC表示退出游戏。具体要求掌握的技术有:(1) 数组一位数组
33、可看成是一个线性表或一个向量;二维数组可以看成是一个线性表:它的每个数据元素又是一个线性表;同理,一个三维数组可以用其数据元素为二维数组的先行表来定义。(2) 全局变量全局变量可以为本文件中其他函数所共用。它的有效范围从定义变量位置开始到本源文件结束。全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就会影响到其他函数,相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道,从函数得到一个以上的返回值。(3) 函数的嵌套调用C语言不能嵌套定义函数,但可以嵌套
34、调用函数。也就是说,在调用一个函数的过程中,又调用另一个函数。(4)图形技术见第二章2.3.2 功能要求系统用C语言实现传统的俄罗斯方块游戏,必须提供以下几种功能:(1) 游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在多种不同的的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。(2) 游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、快速下移,自由下落、旋转功能,以及行满消除行的功能。(3) 游戏显示更新功能。当游戏方块左右移动、下落、旋转时,要清除
35、先前的游戏方块,用新坐标重绘游戏方块。当消除满行时,要重绘游戏底板的当前状态。(4) 游戏速度分数更新功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给游戏玩家计算游戏分数。比如,消除一行加10分。当游戏分数达到一定数量之后,需要给游戏者进行等级上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。(5) 游戏帮助功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。2.3.3 设计要求(1) 在Turbo C3.0或Visual C+控制台应用程序方式下设计课题。(2) 系统必须提供简单、易操作的人机界面。(3) 程序应具有一定的健壮性。设计的程序要求完成2.3.2节(1)-(5)规定的功能。.忽略此处.(4)