《C语言综合实训题-.docx》由会员分享,可在线阅读,更多相关《C语言综合实训题-.docx(27页珍藏版)》请在优知文库上搜索。
1、C语言实训题目录综合实训选题1一简单的文本编辑器2综合实训选题2-简易计算器4综合实训选题3-工资排名6综合实训选题4一用C语言实现键盘画图7综合实训选题5模拟病人看病系统8综合实训选题6-五子棋10综合实训选题7报数游戏13综合实训选题8-学生成绩管理程序21一.功能要求:编制一个简单的单行文本编辑器程序,具有文本的插入、删除、替换功能。要求设置编辑命令如下:1 .E指定所要编辑的文件2 .Q结束编辑3 .R替换文本用R命令后继的K行正文替代原始正文中的M行到N行的正文内容;命令格式:RKMNK行正文其中K、M、N均为大于零的整数;4 .I插入文本用I命令后继的K行正文插入原始正文中的M行之
2、后;命令格式:IKMK行正文其中K、M均为大于零的整数;5 .D删除文本用D命令将原始正文中第M行到N行的正文内容删除;命令格式:DMN其中M、N均为大于零的整数;说明:程序只限于编辑较短的文本文件(Fxt),每行不超过80个字符,总行数不超过200行,正文行从0开始编号。.本设计涉及的知识点:1 .数组2 .指针和指针数组3 .文件中字符串的读出和写入4 .函数的定义5 .字符函数的使用四.设计指导:1 .需定义函数,分别实现插入、删除、替换和退出;2 .插入时,把M行以后的后移,然后在M行处插入K行;使用strcpy()函数;3 .删除时把N行后续行覆盖要M-N行;4 .替换时先把M-N行
3、的内容删除,再插入K行,以实现替换;5 .退出时提示保存,然后将修改后内容写入文件:6 .注意每个函数中对输入参数M,N,K的合理性检查。综合实训选题2-简易计算器一、功能要求设计一个简易计算器,实现四则运算二、相关知识函数选择结构循环结构将字符转换成数值三、程序要求1 .编制函数displaycalculator,显示计算器面板2 .编制函数getdata,获取计算数据3 .编制计算函数calculate4 .编制计算结果函数displayresult.四、设计指导1、显示计算器面板,只要用printf函数画出面板即可。2、获取数据的算法:输入一个字符,是运算符吗?是,表明数字输入结束。判断
4、输入的字符是数字字符吗?是,与之前的合成一个数。判断输入的字符是退格字符吗?是,去掉低位。直到字符为运算符为止。保存数据和运算符。3、思考:怎样将字符转变成数值,怎样合并成一个数。如:先输入5,再输入3,如何变成数值53?五、主程序intoperatori,operator,first,second,result;main()displaycalculator();gotoxy(2z4);first=getdata();while(operator!=27)operatorl=operator;second=getdata();calculate();displayresult();first
5、=result;)综合实训选题3-工资排名一、功能要求用结构体实现对某单位职工工资排名,按从高工资到低工资排列。二、相关知识点循环、结构体、排序方法。三、程序要求本程序首先输入某单位的职工数据(包括每个职工的工号、姓名、工资),然后根据工资由高到低(即按单调不增次序)对这些数据实行排序,排好序的数据送入磁盘文件d:test.dat中保存,同时在屏幕上显示排序彳发的内容。四、设计指导1、复习排序方法:起泡法、选择法2、数组和结构体数组的知识3、文件的基本操作一、功能要求在开发县级电网调度自动化系统的过程中,碰到一个要绘制电力系统一次接线图的问题。由于电力系统一次接线图比较复杂,图上有一些特殊的符
6、号,象变压器符号、开关符号等等,用一般的编程方法来绘制比较困难,因此,笔者用C语言开发了一个手工绘制电力系统一次接线图的键盘绘图程序,使用该程序绘制的一次接线图符合用户需求,效果良好。二、相关知识点画图的一些基本知识:如如何画直线、画圆、画矩形等。三、程序要求程序中定义了几个特殊键:V:画笔提起W:开始画图R:开始擦图S:当前图形存入文件“E”:调出已有文件Cw:画圆程序一运行,屏幕上出现一个黄色的边框来设定画图的区域,区域中间出现提起的画笔符号,当按下W键时,画笔符号变为,此时可移动方向键(上、下、左、右、左上、左下、右上、右下)来画图;当按下R“键时,画笔符号变为,此时可移动方向键来擦图;
7、在画图过程中,按下”C键,可画出一个半径为20个象素点的圆;当结束画图时,按下“S键,将画好的图形存盘;按下“E键可调出已有的图形进行编辑。一、功能要求病人到医院看病,主要重复两件事情:(1)病人到达诊室,将病历交给护士,排到等待队列中候诊。(2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。要求模拟病人等待就诊过程。二、设计方案程序采用菜单方式,其选项和功能如下:(1)排队,输入排队病人的病历号,加入到病人排队队列中;(2)就诊,病人排队多列中最前面的病人就诊,并将其从队列中删除;(3)查看队列,从队首到队尾列出所有的排队病人的病历号;(4)不再排队,余下依次就诊,从队首到队尾列
8、出所有的排队病人的病历号,并退出运行;(5)下班,退出运行。该程序共由六个函数实现:1、显示界面函数:在屏幕上显示上述五个选项。利用输出语句完成,如:printf(l)排队n);或cout*(l)排队endl;2、等待队列初始化函数:创建一个空的链队。3、入队函数:将值域为病人“病历号”的结点插入链队的队尾。4、出队函数:将等待队列的队首结点的值域即“病历号”输出,并释放该结点。5、输出队列函数:从队首到队尾将结点的值域依次输出。6、主函数:输入选项n(1、2、3、4、5),根据n值,调用函数。由于选项5为退出,故循环条件可为(n!=5),循环体:输入n值,判断n的值,若n为1,则调用入队函数
9、;若n为2,则调用出队函数;若n为3,则调用输出队列函数;若n为4,则调用输出队列函数、出队函数,并提前结束循环。三、知识储备1、队列。队列的初始化、创建一个链队、出队、入队操作。2、循环控制结构。3、函数。函数的定义、函数的调用。一、功能要求与设计指导任何一种棋类游戏其关键是对当前棋局是否有正确的评分,评分越准确则电脑的Al越高。五子棋游戏也是如此,但在打分之前,我们先扫描整个棋盘,把每个空位从八个方向上的棋型填入数组gStyle(2,15,15,8,2),其中第一个下标为1时表示黑棋,为2时表示白棋,第二和第三个下标表示(x,y),第四个下标表示8个方向,最后一个下标为1时表示棋子数,为2
10、时表示空格数,如:gStyle(1,2,2,1,1)=3表示与坐标(2,2)在第1个方向上相邻的黑棋棋子数为3gstyle(1,2,2,1,2)=4表示与坐标(2,2)在第1个方向上的最近的空格数为4在定义方向时,也应该注意一定的技巧,表示两个相反的方向的数应该差4,在程序中我是这样定义的:ConstDIR_UP=1ConstDIR_UPRIGHT=2ConstDIR.RIGHT=3ConstDIR_RIGHTDOWN=4ConstDIR_DOWN=5ConstDIR_DOWNLEFT=6ConstDIR_LEFT=7ConstDIR_LEFTUP=8这样我们前四个方向可以通过加四得到另一个方
11、向的值。如果你还是不太明白,请看下面的图:-ox*xx-图中的*点从标为(4,4),(打*的位置是空位),则:gStyle(2,4,4,1,1)=1在(4,4)点相邻的上方白棋数为1gStyle(2,4,4,1,2)=2在(4,4)点的上方距上方白棋最近的空格数为2gStyle(1,4,4,3,1)=2在(4,4)点相邻的右方黑棋数为2gStyle(1,4,4,3,2)=1在(4,4)点的右方距右方黑棋最近的空格数为3一旦把所有空点的棋型值填完,我们很容易地得出黑棋水平方向上点(4,4)的价值,由一个冲1(我把有界的棋称为冲)和活2(两边无界的棋称为活)组成的。对于而白棋在垂直方向上点(4,4
12、)的价值是一个活1,而在/方向也是活1所以,只要我们把该点的对于黑棋和白棋的价值算出来,然后我们就取棋盘上各个空点的这两个值的和的最大一点作为下棋的点。然而,对各种棋型应该取什么值呢?我们可以先作如下假设:Fn表示先手n个棋子的活棋型,如:F4表示先手活四Fn,表示先手n个棋子的冲棋型,如:F4表示先手冲四Ln表示后手n个棋子的活棋型,如:L3表示后手活三Ln,表示后手n个棋子的冲棋型,如:L3,表示后手冲三根据在一行中的棋型分析,得到如下关系:L1,=F1,L2=F2=L1F1L2F2L3,=F3,L4F4,=F4从这个关系包含了进攻和防守的关系(当然,这个关系是由我定的,你可以自己定义这些
13、关系)。对这些关系再进一步细化,如在一个可下棋的点,其四个方向上都有活三,也比不上一个冲四,所以我们可以又得到4*F3L4这个关系,同样,我们还可以得到其它的关系,如I:4*F2L3、4*L3F3.,这些的关系由于你的定法和我的定法制可能不一样,这样计算机的Al也就不一样,最后我们把分值最小的L1值定为1,则我们就得到了下面各种棋型的分值,由C语言表示为:F25=0,2,5,50,16000,(0,10,30,750,16000);L25=0,1,5,50,3750),0,10,30,150,4000);F数组表示先手,第一个下标为O时表示冲型,第二个下标表示棋子数,则F2对应F02L数组表示
14、后手,第一个下标为0时表示冲型,第二个下标表示棋子数,则L2对应F12Ok,棋型的分值关系确定好了以后,我们把每一个可下点的四个方向的棋型值相加(包括先手和后手的分值),最后选择一个最大值,并把这一点作为计算机要下的点就OK了:)。最后:1、得到最大值也许不止一个点,但在我的程序中只选择第一个最大点,当然你可以用于个随机数来决定选择哪一个最大值点,也可以对这些最大值点再作进一步的分析。2、在这个算法中我只考虑了周围有棋子的点,而其它点我没有考虑。3、可以再更进一步,用这个算法来预测以后的几步棋,再选择预测值最好的一步,这样电脑的Al就更高了4、这个算法没有考虑黑棋的禁手(双3、双四和多于五子的
15、连棋)。因为在平时我下的五子棋是没有这些禁手的。综合实训选题7.报数游戏一、功能要求n个人围成一圈,从1到n编上号,开始报数:凡是报到m的淘汰出局。若是你,你选择几号,将被最终留下。二、设计方案这是一个循环报数问题,故要找一个能循环数数的数据结构来解决。方案一:LII+I-II3II)口Jhead单循环链表解决。创建一个n个结点的单循环链表,其值域分别为1到n。从第一个结点开始报数,凡是报到m的,其值域置为O且n减1。下次数到值域为O的结点时,将其隔过去,数下一个结点,当数到m时,将该结点的值域置为O且n减1,依次进行下去,直到n为1。输出值域不为O的结点的值域,就是我们要选择的编号。方案二:双循环