综合实训C语言程序设计_第1页
综合实训C语言程序设计_第2页
综合实训C语言程序设计_第3页
综合实训C语言程序设计_第4页
综合实训C语言程序设计_第5页
已阅读5页,还剩13页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

综合实训1综合实训的目的综合实训是C语言程序设计教学过程中一个重要的实践性环节,是在学生学习完C语言程序设计课程后进行的一次全面的综合练习。在C语言程序设计的教学中,除了要求学生熟练掌握程序设计语言的语法,更重要的是培养学生提高程序设计分析能力、动手编程能力、自学和创新能力等。一般来讲,综合实训应该比课程教学实验复杂一些,要求所涉及的内容应该有一定的深度和广度,并更加接近现实应用。通过综合实训练习,帮助学生系统掌握该门课程的主要内容,培养学生实际分析问题、编程和动手能力。综合实训围绕课程的整体教学目标进行,设计题目具有一定的综合性和应用性。综合实训强调理论与实际相结合,将理论如何应用于实际是核心问题。要完成好综合实训,就要将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构进行比较和总结,结合设计题目进行综合性应用,达到在实践中学习知识、掌握知识、应用知识和培养能力的目的。通过综合实训,学生在下述各方面的能力应该得到锻炼:综合使用所学过的C语言程序设计知识,掌握结构化程序设计的基本思路和方法,加深对C语言基本要素和控制结构的理解。通过查阅手册和文献资料,培养系统理解、综合运用C语言知识分析问题和利用计算机求解问题的能力。利用所学的基本知识和技能,开发小型应用程序,培养数据处理的综合能力。结合课程的教学内容循序渐进地进行设计方面的实践训练,以获得软件开发的经验,并加强与其它相关课程的横向联系及其应用,为后续课程的学习和毕业设计奠定基础。及时巩固已学知识,对于给定的设计题目,考虑如何进行系统分析,建立相应的数学模型,从而提高自身的专业综合素质。熟练应用自顶而下的计算思维方法,将大问题模块化,领会结构化程序设计的精髓;培养独立思考、阅读和编写程序的能力,积累编程经验,打下良好的计算机应用基础。学习设计软件的思维方法。培养从全局考虑问题的模块化思维方法,培养设计单个模块算法的逻辑化思维方法,培养产生多种设计方案的发散性思维方法。掌握程序的局部测试与系统测试的方法,掌握在集成环境下如何设置断点进行单步调试或分块调试的方法。获得相关项目管理和团队合作等众多方面的具体经验,培养学生在项目开发中的团队合作精神、创新意识及能力。培养学生良好的程序设计风格及书写程序设计开发文档的能力。2综合实训的要求综合实训步骤的规范不但可以培养学生科学的工作方法和作风,而且还能有效地减少错误,提高工作效率。因此必须严格执行良好的实验步骤规范。综合实训的要求是:对系统进行功能模块、控制模块分析,可以加其他功能修饰,使程序更加完善、合理,画出功能模块图。采用模块化程序设计方法,程序尽量局部化和模块化。利用C语言面向过程的编程思想来完成系统的设计,突出C语言的函数特征,采用多个函数实现各个子功能。程序流程图要清晰,数据类型和数据结构要详细定义,要注意浮点运算的误差。算法要简洁明了、少使用技巧,尽量避免使用多重循环嵌套或条件嵌套结构。充分利用库函数,系统设计要实用,编程简练,输入输出操作能给用户必要的提示,功能全面可用,能够实现友好的交互。说明书、流程图要清楚,记录设计情况为编写设计说明书作好准备。源程序采用锯齿型书写格式,要求注释细致,采用较好的缩进格式,要求上机调试通过,设计报告按规定格式书写。3综合实训的过程C语言综合实训的过程主要包括5个步骤,即程序的功能分析、数据结构设计、算法分析与设计、函数设计、编码及调试等,各个步骤都有其特定的任务。3.1功能分析C语言程序设计属于结构化程序设计,采用的是自顶向下逐步细化的设计方法。功能分析就是为实现系统目标而设置的,它的任务是根据综合实训题目的描述和要求,确定程序要实现的功能,然后将这些功能分解和细化,划分成不同的层次并确定各层功能的上下级关系。3.2数据设计程序的数据设计主要包括:(1)确定程序中所用数据的数据类型。(2)确定程序中数据元素之间的关系,选择所用的数据结构,如:数组、链表等。(3)对程序中用到的结构体数据定义其结构体类型。(4)定义程序中使用的全局变量、外部变量等。(5)定义程序中通用的符号常量。3.3算法设计与分析算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。算法的设计取决于数据(逻辑)结构,算法的实现依赖于采用的存储结构。算法设计与分析的方法很多,如递推法、递归法、穷举法、迭代法等。同一个问题可选用不同的算法解决,但不同的算法对程序的执行效率影响却很大。3.4函数设计

综合性的程序一般应分为若干个程序模块,每一个模块用函数来完成一个特定的功能。为了使总体设计协调有序地进行,需要在程序编码之前,对主要的函数做出预先设计,即函数设计。首先根据功能分析,确定各项功能要使用的主要函数;然后进行函数定义,包括:函数名称、函数功能、函数参数、函数返回值类型等。有些函数之间存在调用和被调用关系,在进行函数定义时需要注意顺序问题,有的函数先定义,有的函数后定义。函数间的调用关系要明确,选择合适的函数调用方式实现调用。3.5编程及调试程序编程及调试是实现程序功能的核心阶段,需要注意以下问题:(1)综合实训具有一定的综合性,其程序通常由多个函数构成,每个函数都有独立的功能,实现特定的操作。但程序中的所有函数都是围绕实现程序的功能进行设计的。(2)在程序设计中往往根据需要确定若干模块,分别由一些函数来实现。有的函数在程序设计前的函数设计阶段就被考虑到了,而有的函数是在程序设计过程中因需要才产生的。但无论哪一个函数,都会经历由简单,到功能完善定型的过程。(3)程序设计一般以功能实现为主线,每一个函数完成相应功能之后,都要立即进行函数功能测试,直到确认函数的功能无误为止。(4)整体调试是在前期程序设计调试基础上进行的,它是程序设计的必要阶段。整体调试时需要准备一个较大规模的数据集,按照综合实训题目的功能要求,对组装完成的程序逐项进行功能测试和调试,直到满足要求。4综合实训的内容综合实训的内容共有十五组题目,每组有三道大题。每组题中的第一、二题多为应用类题目,第三题为综合类题目,涉及循环、数组、函数、链表等主要知识点。教学中可将学生每3~5人分为一小组,每小组选择其中一组题目(不同组尽量选不同题目)。每组选题后应根据题目进行进一步的任务分解,形成设计模块后再进行组内分工,建议每组设组长、副组长各一名,共同领导小组内其他成员,并向指导教师反馈实施进度。组长主要负责本组工作的组织、计划的制定、分配、实施以及进程监控与协调工作;副组长主要负责质量保证工作,包括及时发现分析、设计、编码、测试、文档建设等实施阶段的问题并及时提供协调、审查以及提交相应的解决方案、保管各类资料等。每组学生选题后针对课题依据综合实训的过程完成以下工作:(1)写出每个模块的设计思想(2)画出每个函数的流程图或N-S图(3)编写源程序(4)静态检查程序和上机调试程序,写出调试报告(5)综合程序。在完成(1)~(4)点的基础上,将每组中的三道题目,组合成一个程序(以命令菜单的方式,供用户选择每题实现的功能),并进行调试。综合实训以课题组形式组织,每名学生应有计划、有步骤地进行,设计过程中不得从事其他活动,组员应严格服从分派、协作管理。第一组1.用牛顿迭代法解方程求解任意的三次方程:ax3+bx2+cx+d=0要求a,b,c,d从键盘输入,使用循环方法编程。【编程提示】令f(x)=ax3+bx2+cx+d=((a*x+b)*x+c)*x+d。求出方程的表达式f(x)的导数f1(x)=(3*a*x+2*b)*x+c。计算曲线上的点(x0,f(x0))的切线与x轴的交点x:x=x0-f(x0)/f1(x0)任取初始点x,在循环中进行迭代:x0=xx=x0-f(x0)/f1(x0)依次继续,直至x与x0的差满足指定精度要求为止。2.万年历使用函数方法编写程序。要求当用户输入年份时能输出该年的日历,在日历上能够看出某天是星期几,可以显示任意一年任意一天,并能够知道是否是闰年等。【编程提示】用数组表示各个月份的天数;接收用户输入的年份,调用函数进行计算,算出该年之前的天数;依据输入的年份判断是否是闰年,计算该年各月的天数,并按照每排输出两个月的格式将日历存入数组。3.学生成绩管理有n个学生,每个学生有m门成绩。每个学生的m门成绩用一单链表实现,n个学生所对应n个单链表的头指针用一指针数组统一存放。要求:(1)建立该存贮结构;(2)查找第i个学生的某门课成绩;(3)删除第i个学生的某门课成绩。【编程提示】将学生当作一个结点,类型为结构体,结构体中包含学生的属性和结点指针。定义链表中学生结点的结构为:structnode{charcourse[40];/*课程名*/floatsco;/*该门课程的成绩*/structnode*link;/*指向下一课程结点的指针*/}查找某个学生的某门课的成绩,应先在指针数组中查找头指针,然后从头结点开始按课程名查找,比较课程名可用字符串比较函数strcmp()来实现。删除某个结点时,首先按课程名查找该门课对应的结点,如果没找到则输出没找到信息。如果找到则分三种情况讨论:该结点为头结点时,修改原头结点所指向的结点为新的头结点,同时更新头指针数组;该结点为中间结点时,修改该结点的前一结点的指针使其指向该结点的后一结点;该结点为尾结点时,修改原尾结点的前一结点为新的尾结点;最后释放该结点。第二组1.层叠方阵起始数放在方阵的左上角,然后从起始数开始先在同行后在同列递增,层层折叠地排列为层叠方阵。如下图为起始数是1,行数是5的层叠方阵。使用数组方法设计程序,打印输出起始数为a,行数为m(a,m从键盘输入确定)的层叠方阵。1 2 5 10 174 3 6 11 189 8 7 12 1916 15 14 13 2025 24 23 22 21【编程提示】设置变量n从a开始,依次增1。然后根据层叠方阵的特点给二维数组z[x][y]赋值。第i层(i=2,3,…,m)的起始位置为(1,i),随后列号y不变行号x递增,至x==i时转折,行号x不变列号y递减,至y==1时该层结束,每一位置递增的n赋值给z[x][y]。2.出售金鱼买买提将养的一缸金鱼分五次出售:第一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条;最后卖出余下的11条。问原来的鱼缸有几条金鱼?使用循环方法求解。【编程提示】

题目中所有的鱼是分五次出售的,每次卖出的策略相同:第j次卖剩下的(j+1)分之一再加1/(j+1)条。第五次将第四次余下的11条全卖了。假定第j次鱼的总数为x,则第j次留下:x-(x+1)/(j+1)。当第四次出售完毕时,应该剩下11条。若x满足上述要求,则x就是题目的解。注意:(x+1)/(j+1)应满足整除条件。3.简易通讯录使用单链表建立一个简易通讯录,要求:(1)每条记录包含姓名、,建立该存贮结构;(2)查找指定姓名的结点,若找到,返回该姓名的;(3)在指定姓名的结点之前插入一个新的结点,若表中没有该结点,则将要插入的结点插入表尾。【编程提示】将每条记录当作一个结点,类型为结构体,定义链表中记录结点的结构为:structnode{charname[40];/*姓名*/chartele[20];/**/structnode*link;/*指向下一结点的指针*/}按照姓名查找,可从头结点开始循序查找,比较姓名可用字符串比较函数strcmp()来实现。插入新结点时,如果表中没有指定结点,则将尾结点的指针指向新结点。如果表中有指定结点,则分两种情况讨论:该指定结点为头结点时,则修改新的结点的指针使其指向头结点;该结点为其他结点时,则修改新结点的指针使其指向指定结点,修改指定结点的前一结点的指针使其指向新结点。第三组1.梅森素数形如2n-1的素数称为梅森素数,这里指数n是一个素数。例如22-1=3,23-1=7都是梅森素数。使用循环设计程序,求出指数n<30的所有梅森素数。【编程提示】设置指数(2≤n<30),t=2;通过t*2求t=2n;然后用试商法判断素数。2.大赛现场统分某大奖赛有n个选手参赛,m(m>2)个评委为依次参赛的选手评判打分:最高10分,最低0分。统分规则为:每个选手所得的m个评分中,去掉一个最高分,去掉一个最低分,然后平均为该选手的最后得分。根据n个选手的最后得分从高到低排出名次表,以便确定获奖名单。使用数组方法实现程序设计。【编程提示】定义3个数组:sh[i]为第i个选手编号,f[i][j]为第j个评委给第i个选手的评分,sf[i]为第i个选手的最后得分。对第i个选手,将每个f[i][j]累加到sf[i]中,然后求最后得分sf[i]=(sf[i]-max-min)/(m-2),将n个选手的最后得分sf[i]根据冒泡法从高到低排序后输出。3.工资管理使用单链表建立一个简易工资表,要求:(1)每个结点包含职工工号、姓名、应发工资等,建立n个结点(结点数据域的值由键盘输入)构成的单链表。(2)查找指定职工工号的结点,若找到,打印其姓名和应发工资。(3)统计链表中应发工资>y的结点的个数,并对该单链表进行复制。【编程提示】定义链表中记录结点的结构为:structnode{charno[12];/*职工工号*/charname[40];/*姓名*/floatyfgz;/*应发工资*/structnode*link;/*指向下一结点的指针*/}按照工号查找结点,可从头结点开始循序查找,比较结点可用字符串比较函数strcmp()来实现。单独编写查找函数,进行结点统计时可进行调用。复制单链表时从链表头开始循环复制,直至链表尾。第四组1.满足特异条件的数列输入m和n(20>=m>=n>0)求出满足以下方程的正整数数列i1,i2,...,in,使得:i1+i2+...+in=m,且i1>=i2...>=in。例如:当n=4,m=8时,将得到如下5个数列:

5111

4211

3311

3221

2222使用数组方法编程。【编程提示】

将原题抽象为:将m分解为n个整数,且n个整数的和为m,i1>=i2>=...>=in。题目中有i1>=i2>=.....>=in,可先确定最右边in元素的值为1,然后按照条件使前一个元素的值一定大于等于当前元素的值,不断地向前推来解决问题。2.分数四则运算用函数方法对输入的两个分数进行+、-、*、/四则运算,输出分数结果。要求:(1)用函数对输入的数据进行计算,得到y/x(2)用函数对y/x进行化简,并输出结果【编程提示】对分数b/a与d/c,不管哪一种运算,其运算结果均为y/x形式。对结果y/x进行化简,约去分子分母的公因数:试用i(i=1,...,y)对y,x进行试商,若能同时整除y,x,则y,x同时约去公因数i,最后打印约简的分数。3.约瑟夫问题

这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。【编程提示】题目中30个人围成一圈,用一个循环的链来表示。可以使用结构数组来构成一个循环链。定义链表中记录结点的结构为:structnode{

structnode*nextp;

/*指向下一个人的指针(下一个人的数组下标)*/intno_out;

/*是否被扔下海的标记。1:没有被扔下海。0:已被扔下海*/}结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。这样循环计数直到有15个人被扔下海为止。第五组1.数制转换(1)将十进制整数转换为P进制数(2)将十进制小数转换为P进制数使用数组方法编写程序。【编程提示】十进制整数转换为P进制,反复除P取余,直到商为零时停止。输出结果时第一个余数最后打印输出,将每次的余数c赋值给s[m]。设置字符数组r[16],当s[k]>9时,输出相应的字符r[s[k]]。十进制小数转换为P进制方法与此类似。2.合数世纪一个世纪的100个年号全为合数(即不存在一个素数),该世纪称为合数世纪。使用循环方法编程求出最早的合数世纪。【编程提示】可先约定一个世纪区间,如[21,20000]。设置a为区间变量,b为a世纪的50个奇数年号(偶数均为合数)。用变量s统计50个奇数中合数个数,若为50,则打印a后退出循环。3.教师工作量使用单链表建立一个简易教师工作量表,要求:(1)每个结点包含职工工号、姓名、工作量等,建立n个结点(结点数据域的值由键盘输入)构成的单链表。(2)查找工作量>x的结点,打印其职工工号、姓名和工作量。(3)从链表的第i个结点开始连删len个结点,若不够len个结点,则从第i个结点开始删到表尾。【编程提示】定义链表中记录结点的结构为:structnode{charno[12];/*职工工号*/charname[40];/*姓名*/floatworkload;/*工作量*/structnode*link;/*指向下一结点的指针*/}编写查找函数,首先输入要查找记录的工作量,然后顺序查找直到尾结点,如果没找到,输出没找到信息;否则显示找到的记录。删除某个结点时,首先要找到第i个结点,然后查找后面是否有len个长度的结点,如果不够则直接将第i-1个结点变为尾结点,释放之后的所有结点;如果够则将第i-1个结点的指针指向其后len+1位置的结点,然后释放中间的结点。第六组1.勾股数(1)满足x2+y2=z2的正整数x,y,z称为一组勾股数,又称为毕达哥拉斯三元数组。用循环方法编程求出指定区间[a,b]范围内的所有勾股数组。(2)满足1/x2+1/y2=1/z2的正整数x,y,z称为一组倒立的勾股数组。用循环方法编程求出指定区间[a,b]范围内的所有倒立的勾股数组。【编程提示】(1)设勾股数x,y,z,约定x<y,设置关于x,y的循环完成穷举,应用勾股数的定义求解指定区间[a,b]的所有勾股数组。(2)倒立勾股数组中x,y不可能相等,为避免重复,设x>y>z。设置循环条件,z从a至b-2,y从z+1至b-1,x从y+1至b。将条件整理为(x*x+y*y)*z*z=x*x*y*y再编程求解。2.选美比赛在选美大奖赛的半决赛现场,有一批选手参加比赛,比赛的规则是最后得分越高,名次越低。当半决赛结束时,要在现场按照选手的出场顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,名次连续编号,不用考虑同名次的选手人数。例如:

选手序号:

1,2,3,4,5,6,7

选手得分:

5,3,4,7,3,5,6

则输出名次为:

3,1,2,5,1,3,4

请采用数组方法编程帮助大奖赛组委会完成半决赛的评分和排名工作。【编程提示】题目换种说法为:将数组A中的整数从小到大进行连续编号,要求不改变数组中元素的顺序,且相同的整数要具有相同的编号。普通的排序方法均要改变数组元素原来的顺序,显然不能满足要求。为此,引入一个专门存放名次的数组,再采用通常的算法:在尚未排出名次的元素中找出最小值,并对具有相同值的元素进行处理,重复这一过程,直到全部元素排好为止。3.商品库存管理使用单链表建立一个简易商品库存表,要求:(1)每个结点包含商品编号、名称、库存量等,建立n个结点(结点数据域的值由键盘输入)构成的单链表。(2)统计商品的库存总量。(3)在指定商品名称的结点之后插入一个新的结点,若表中无指定名称的结点,则将新结点插入到表头。【编程提示】定义链表中记录结点的结构为:structnode{charno[12];/*商品编号*/charname[40];/*名称*/floatworkload;/*库存量*/structnode*link;/*指向下一结点的指针*/}统计库存总量时,从头指针开始顺序统计,直至所有记录统计完毕。插入新结点时,如果没有找到指定结点,则将新结点的指针指向头结点。如果表中有指定结点,则将指定结点的指针赋给新结点的指针,然后修改指定结点的指针使其指向新结点。第七组1.数字菱形设计程序打印n(n<=17)行上下对称的数字空心菱形,第一行为1个1,第二行前后各为2个2,……其中n由键盘输入,样图如下图所示。使用循环方法编程。122223333334444444433333322221【编程提示】图形上下对称,应用绝对值函数e=fabs(k-d),其中k为循环变量,取1,2,…,n(n为奇数),d=(n+1)/2。每行打印x+2*e个空格和d-e个数字,除首尾两行,其余需打印中间的空格和后d-e个数字。2.自动发牌一副扑克有52张牌,打桥牌时应将牌分给四个人。请使用数组方法设计一个程序完成自动发牌的工作。要求:黑桃用S(Spaces)表示;红桃用H(Hearts)表示;方块用D(Diamonds)表示;梅花用C(Clubs)表示。【编程提示】按照打桥牌的规定,每人应当有13张牌。在人工发牌时,先进行洗牌,然后将洗好的牌按一定的顺序发给每一个人。为便于计算机模拟,将人工方式的发牌过程修改为:先确定好发牌顺序:1、2、3、4;将52张牌顺序编号:黑桃2对应数字0,红桃2对应数字1,方块2对应数字2,梅花2对应数字3,黑桃3对应数字4,红桃3对应数字5,...然后从52张牌中随机的为每个人抽牌。采用C语言库函数的随机函数,生成0到51之间的共52个随机数,以产生洗牌后发牌的效果。3.学生籍贯管理使用单链表建立一个学生籍贯信息表,每个学生信息包括:学号、姓名、籍贯。要求:(1)先建立两个有序的单链表,再将其合并成一个有序的单链表。(2)按籍贯查询输出该籍贯的所有学生。(3)删除指定学号的学生记录,并返回成功与否的标志。【编程提示】定义链表中记录结点的结构为:structnode{charno[12];/*学号*/charname[40];/*姓名*/charjg[60];/*籍贯*/structnode*link;/*指向下一结点的指针*/}合并链表时,将前一个链表最后一个结点的指针指向后一个链表的头指针。编写查找函数,首先输入要查找的籍贯,然后顺序查找结点,如果找到则显示找到的记录,之后继续向下查找直至链表结尾。删除某个结点时,可调用查找函数,如果没找到则输出没找到信息;如果找到则分三种情况讨论:该结点为头结点时,修改原头结点所指向的结点为新的头结点;该结点为中间结点时,修改该结点的前一结点的指针使其指向该结点的后一结点;该结点为尾结点时,修改原尾结点的前一结点为新的尾结点;最后释放该结点。第八组1.埃及分数分子为1的分数称为埃及分数,现输入一个真分数,请使用循环方法将该分数分解为埃及分数。如:8/11=1/2+1/5+1/55+1/110。【编程提示】

若真分数的分子a能整除分母b,则真分数经过化简就可以得到埃及分数,若真分数的分子不能整除分母,则可以从原来的分数中分解出一个分母为b/a+1的埃及分数。用这种方法将剩余部分反复分解,最后可得到结果。2.10个小孩分糖果十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?请使用数组方法实现。【编程提示】分糖过程是一个机械的重复过程,定义一个数组存放十个小孩手中的糖数,然后按照描述将分糖的过程写成循环语句,将判断手中的糖块数是否相等写成一个函数,通过调用这个函数来作为循环条件。3.销售管理使用单链表建立一个简易销售管理表。每个记录包括:销售员代号、销售员姓名、当月销售额。要求:(1)建立n个结点(结点数据域的值由键盘输入)构成的单链表。(2)查找当月销售额最高和最低的结点,显示其销售员代号、姓名和销售额。(3)统计所有销售员的总销售额并输出。【编程提示】定义链表中记录结点的结构为:structnode{charno[12];/*代号*/charname[40];/*姓名*/floatsales;/*销售额*/structnode*link;/*指向下一结点的指针*/}编写查询函数,从第一条记录开始,将销售额赋值给最大值和最小值变量,然后用最大值和最小值变量和后面的结点顺序比较,如果结点值大于最大值变量(或小于最小值变量),则将该结点值赋给最大值变量(或最小值变量),直至循环结束。查找最大值或最小值结点过程中,可进行销售额的累加运算。第九组1.回文数打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数)。请使用数组方法实现。【编程提示】对于要判断的数n,计算出其平方后存于a,将a的每一位进行分解存到数组中,再按a从低到高的顺序将其恢复成一个数k(如n=13,则a=169且k=961),若a等于k则可判定n为回文数。2.打鱼还是晒网中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。指定日期由键盘输入,请使用循环方法实现。【编程提示】(1)计算从1990年1月1日开始至指定日期共有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。(2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除。(3)根据余数判断他是在“打鱼”还是在“晒网”;若余数为1,2,3,则他是在“打鱼”否则是在“晒网”。3.参会人员管理使用单链表建立一个简易参会人员管理表。每个记录包括:姓名、单位、房间号。要求:(1)建立n个结点(结点数据域的值由键盘输入)构成的单链表。(2)统计某指定单位的参会人员人数。(3)删除某指定房间号的参会人员的信息记录(每个房间仅住一人)。【编程提示】定义链表中记录结点的结构为:structnode{charname[40];/*姓名*/charunit[60];/*单位*/charno[6];/*房间号*/structnode*link;/*指向下一结点的指针*/}编写查询函数,从第一条记录开始,将记录中的单位字段和待比较的字符串进行比较,若相等,则统计后继续循环,直至循环结束;若不相等,继续循环直至结束。删除指定记录时,先根据输入的房间号进行查找。如果没找到指定结点,输出没找到信息。如果找到指定结点,则分三种情况讨论:该结点为头结点时,修改原头结点所指向的结点为新的头结点;该结点为中间结点时,修改该结点的前一结点的指针使其指向该结点的后一结点;该结点为尾结点时,修改原尾结点的前一结点为新的尾结点;最后释放该结点。第十组1.1~9分成1:2:3的三个3位数将1到9这九个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍。问应当怎样分法。使用数组方法实现。【编程提示】问题中的三个数之间存在数学关系,只要确定第一个三位数就可以解决问题。试探第一个三位数之后,计算出另外两个数,将其分别分解成三位数字,进行判断后确定所试探的数是否就是答案。注意:试探的初值可以是123,最大值是333。2.捕鱼和分鱼A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。C、D、E依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?使用循环方法求解。【编程提示】

根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条鱼后剩下的鱼正好分成五份,然后拿走自己的一份,余下其它的四份。假定鱼的总数为X,则X可以按照题目的要求进行五次分配:X-1后可被5整除,余下的鱼为4*(X-1)/5。若X满足上述要求,则X就是题目的解。3.图书借阅管理使用单链表建立一个简易图书借阅表。每个记录包括:图书编号、名称、借阅次数。要求:(1)建立n个结点(结点数据域的值由键盘输入)构成的单链表。(2)查找借阅次数最多和最少的图书记录,显示其编号、名称。(3)在指定图书结点之前插入一新的结点,并返回成功与否的标志。【编程提示】定义链表中记录结点的结构为:structnode{charno[40];/*编号*/charname[60];/*名称*/intnum;/*次数*/structnode*link;/*指向下一结点的指针*/}编写查询函数,从第一条记录开始,将借阅次数赋值给最大值和最小值变量,然后用最大值和最小值变量和后面的结点顺序比较,如果结点值大于最大值变量(或小于最小值变量),则将该结点值赋给最大值变量(或最小值变量),直至循环结束。插入新结点时,如果没有指定结点,则返回插入失败。如果表中有指定结点,则分两种情况讨论:该指定结点为头结点时,则修改新的结点的指针使其指向头结点;该结点为其他结点时,则修改新结点的指针使其指向指定结点,修改指定结点的前一结点的指针使其指向新结点。第十一组1.歌德巴赫猜想验证:2000以内的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以内的正偶数成立)。用函数方法实现。【编程提示】将整数分解为两部分,然后判断出分解出的两个整数是否均为素数。若是,则满足题意;否则重新进行分解和判断。判断素数的部分可写成一个函数。2.魔术师的猜牌术魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,牌面朝下。对观众说:我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?你们就看。魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,将黑桃A放在桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3。这样依次进行将13张牌全翻出来,准确无误。问魔术师手中的牌原始顺序是怎样安排的?用数组方法实现。【编程提示】采用人工倒推的方法:在桌子上放13个空盒子排成一圈,从1开始顺序编号,将黑桃A放入1号盒子中,从下一个空盒子开始对空的盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再从下一个空盒子开始对空盒子计数,顺序放入3、4、5...,直到放入全部13张牌。注意在计数时要跳过非空的盒子,只对空盒子计数。最后牌在盒子中的顺序,就是魔术师手中原来牌的顺序。3.超长正整数的加法请设计一个算法来完成两个超长正整数的加法。用链表方法实现。【编程提示】采用一个带有表头结点的环形链来表示一个非负的超大整数,如果从低位开始为每个数字编号,则第一位到第四位、第五位到第八位...的每四位组成的数字,依次放在链表的第一个、第二个、...结点中,不足4位的最高位存放在链表的最后一个结点中,表头结点的值规定为-1。定义链表结构为:structnode{intdata;/*编号*/structnode*next;/*指向下一结点的指针*/

};

按照此数据结构,可以从两个表头结点开始,顺序依次对应相加,求出所需要的进位后代入运算。第十二组1.要发就发“1898--要发就发”。请将不超过1993的所有素数从小到大排成第一行,第二行上的每个数都等于它右肩上的素数之差。编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假设存在的话,又有几种这样的情况?

第一行:2

3

5

7

11

13

17......1979

1987

1993

第二行:1

2

2

4

2

4......

8

6用函数方法实现。【编程提示】假设第一行中的素数为n[1]、n[2]、n[3]....n[j]...第二行中的差值为m[1]、m[2]、m[3]...m[j]...。其中m[j]为:m[j]=n[j+1]-n[j]。则第二行连续j个数的和为:SUM=m[1]+m[2]+m[3]+...+m[j]=(n[2]-n[1])+(n[3]-n[2])+(n[4]-n[3])+...+(n[j+1]-n[j])=n[j+1]-n[1]由此题目就变成了:在不超过1993的所有素数中是否存在这样两个素数,它们的差恰好是1898。若存在,则第二行中必有所需整数序列,其和恰为1898。由分析可知,因为任意素数与2的差一定为奇数,所以不用考虑2。2.谁是窃贼公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。在回答公安人员的问题中:甲说:“乙没有偷,是丁偷的。”乙说:“我没有偷,是丙偷的。”丙说:“甲没有偷,是乙偷的。”丁说:“我没有偷。”请根据这四人的答话判断谁是盗窃者。用循环方法实现。【编程提示】假设A、B、C、D分别代表甲乙丙丁四个人,变量的值为1代表该人是窃贼。由题目已知:四人中仅有一名是窃贼,且这四个人中的每个人要么说真话,要么说假话,而由于甲、乙、丙三人都说了两句话:“X没偷,X偷了”,故不论该人是否说谎,他提到的两人中必有一人是小偷。故在列条件表达式时,可以不关心谁说谎,谁说实话。这样,可以列出下列条件表达式:

甲说:”乙没有偷,是丁偷的。”

B+D=1

乙说:“我没有偷,是丙偷有。”

B+C=1

丙说:“甲没有偷,是乙偷的。”

A+B=1

丁说:“我没有偷。”

A+B+C+D=1其中丁只说了一句话,无法判定其真假,表达式反映了四人中仅有一名是窃贼的条件。3.大赛计分排行榜使用单链表建立一个大赛计分排行榜。每个记录包括:挑战者的姓名、成绩、名次。要求:(1)按名次顺序建立n个结点(结点数据域的值由键盘输入)构成的单链表。(2)显示分数的排行榜,统计大赛的平均得分。(3)按名次大小将某一挑战者的记录插入到链表中。【编程提示】定义链表中挑战者结点的结构为:structnode{charname[40];/*姓名*/floatsco;/*成绩*/intno;/*名次*/structnode*link;/*指向下一结点的指针*/}显示分数的排行榜需要从头结点开始循环显示,循环显示的同时可进行得分求和。插入结点时,首先要查找相应的位置,如果名次为第1名则插入到表头,直接修改该结点的指针使其指向原头结点;如果名次为最后一名则插入到表尾,修改原尾结点的指针使其指向当前结点;如果在两个结点之间,则修改前一结点的指针使其指向该结点,修改该结点的指针使其指向后一结点。第十三组1.分数比较比较两个分数的大小。用函数方法实现。【编程提示】

将分数通分后比较分子的大小,比较分子的部分可写成函数进行调用。2.波松瓦的分酒趣题法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:某人有12品脱的啤酒一瓶,想从中倒出6品脱,但他没有6品脱的容器,仅有一个8品脱和5品脱的容器,怎样倒才能将啤酒分为两个6品脱呢?用函数方法实现。【编程提示】将12品脱酒用8品脱和5品脱的空瓶平分,可以抽象为解不定方程:

8x-5y=6其意义是:从12品脱的瓶中向8品脱的瓶中倒x次,并且将5品脱瓶中的酒向12品脱的瓶中倒y次,最后在12品脱的瓶中剩余6品脱的酒。用a,b,c代表12品脱、8品脱和5品脱的瓶子,求出不定方程的整数解,按照不定方程的意义则倒法为:

abca

倒酒的规则如下:1)按a->b->c->a的顺序;2)b倒空后才能从a中取3)c装满后才能向a中倒3.计算机设备管理使用单链表建立一个简易计算机设备管理表。每个记录包括:计算机设备编号、名称、单价、数量、金额。要求:(1)建立n个结点(结点数据域的值由键盘输入)构成的单链表。(2)查找设备编号为x的结点,若找到,打印其名称、单价和数量。(3)计算金额=单价*数量后,将金额添加到结点相应的数据域中,并对该单链表进行复制。【编程提示】定义链表中记录结点的结构为:structnode{charno[12];/*设备编号*/charname[40];/*名称*/floatdj;/*单价*/intnum;/*数量*/floatjine;/*金额*/structnode*link;/*指向下一结点的指针*/}按照编号查找结点,可从头结点开始循序查找,比较结点可用字符串比较函数strcmp()来实现。利用公式求出金额后,将结果循环赋值给结点中的数据项。复制单链表时从链表头开始循环复制,直至链表尾。第十四组1.计算分数的精确值使用数组方法精确计算M/N(0<M<N<=100)的值。如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数位的序号)。【编程提示】将商存放在一维数组中,数组的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中....,依次类推。进行除法运算时,每次求出商的第一位后,将余数乘以10,再计算商的下一位,重复以上过程,当某次计算后的余数为0时,表示M/N为有限不循环小数。当某次计算后的余数与前面的某个余数相同时,则M/N为无限循环小数,从该余数第一次出现之后所求得的个位数就是小数的循环节。2.搬山游戏设有n座山,计算机与人为比赛的双方,轮流搬山。规定每次搬山的数目不能超过k座,谁搬最后一座谁输。游戏开始时,计算机请人输入山的总数n和每次允许搬山的最大数k。然后请人开始,等人输入了需要搬走的山的数目后,计算机马上打印出它搬多少座山,并提示尚余多少座山。双方轮流搬山直到最后一座山搬完为止。计算机会显示谁是赢家,并问人是否要继续比赛。若人不想玩了,计算机便会统计出共玩了几局,双方胜负如何。使用循环方法实现。【编程提示】计算机参加游戏时应遵循下列原则:1)当:剩余山数目-1<=可移动的最大数k时计算机要移(剩余山数目-1)座,以便将最后一座山留给人。2)对于任意正整数x,y,一定有:

0<=x%(y+1)<=y在有n座山的情况下,计算机为了将最后一座山留给人,而且又要控制每次搬山的数目不超过最大数k,它应搬山的数目要满足下列关系:

(n-1)%(k+1)如果算出结果为0,即整除无余数,则规定只搬1座山,以防止冒进后发生问题。3.校运动会项目管理使用单链表建立一个校运动会项目管理表。每个记录包括:学院名称、比赛项目、名次。要求:(1)建立n个结点(结点数据域的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论