《程序设计实训专题讲座.doc》由会员分享,可在线阅读,更多相关《程序设计实训专题讲座.doc(30页珍藏版)》请在金锄头文库上搜索。
1、一、 程序设计训练目的和教学要求“C程序设计训练”是在学习“C语言程序设计”课程之后进行的一个实践教学环节,程序设计训练的目的是:1进一步培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解;2针对C语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。3掌握C语言的编程技巧和上机调试程序的方法。4掌握程序设计的常用算法及模块化程序设计方法。5. 掌握项目与工程设计的基本方法。本程序设计训练是利用C语言理论和实验课中学到的编程知识和编程技巧,通过布置具有一定难度、一定编程量的程序设计训练题目,使学生通过程序设计训练掌握高级编程语言的知
2、识和编程技术,掌握程序设计的思想和方法,具备利用计算机求解实际问题的能力。二、程序设计训练的基本要求 设计步骤的规范不但可以培养学生科学的工作方法和作风,而且还能有效地减少错误,提高工作效率。因此必须严格执行良好的实验步骤规范(包括上级操作规范)。本程序设计训练的基本步骤与要求是: 1问题分析及解决方案框架确定l 充分地分析和理解问题本身,弄清要求做什么(What to do?)。l 在确定解决方案框架过程中(How to do?),考虑怎样使程序结构清晰、合理、简单和易于调试,并确定每个函数的简单功能,以及函数之间的调用关系。 2详细设计和编码 确定算法的主要流程,再此基础上进行代码设计(C
3、oding),每个明确的功能模块程序一般不超过60行,否则要进一步划分。 3上机前编写程序与检查 上机前程序检查可有效提高调试效率,减少上机调试程序时的无谓错误。 程序检查主要有两种途径:用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,把程序中的明显错误事先排除。 4上机调试程序 5完成程序设计训练报告 问题描述:题目要解决的问题是什么。 设计l 设计算法:主要算法思想,用流程图表示。l 实现注释:各项功能的实现程度。l 调试报告:调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等。 如果题目规定了测试数据,则结果要
4、包含这些测试数据和运行输出,当然还可以含其他测试数据和运行输出。三、程序设计训练的内容 见程序设计训练题目(共8题)。要求都能编写程序和运行,但验收时,15题中任抽一道题,68题中任抽一道题,并提交所抽中的两题的实验报告。四、程序设计训练安排1、课堂教学(1周,8学时)。用于讲授程序设计的方式方法,包括原问题的分析、算法设计、程序编写以及调试等,内容从基本程序设计到项目的实现,以及程序设计文档的编制方法。a) 程序设计的基本方法b) 程序代码的规范(最佳实践法)c) 工程方法论d) 项目实践2、训练辅导(2周,20学时)(8月24号下学期开学现场辅导:以2个自然班为教学班,每天2课时现场辅导,
5、每教学班一名教师配一名助教。3、测试(1周,4学时)学生从3类(见训练内容)题中,各选择一道,提前写好设计训练报告,现场编写(断网、断U盘)程序,独立完成,根据完成情况予以评分。五、考核方式与评分办法通过程序实现、总结报告和学习态度综合考评,并结合学生的动手能力,独立分析解决问题的能力和创新精神。成绩分优、良、中、及格和不及格五等。 考核标准包括: 1程序设计的正确性,程序结构是否合理、编程风格(50%)。 2学生的工作态度、动手能力、创新精神及出勤率(30%)。 3总结报告(20%)。六、程序设计报告的封面程序设计基础课程实训题 目: 院 系: 专业班级: 姓 名: 学 号: 指导老师: 七
6、、训练报告的格式一、 目的和要求二、 设计内容三、 运行环境四、 设计步骤五、 流程图六、 源代码七、 运行结果八、 总结八、部分训练题目算法分析 1、日历问题 问题描述在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。输入数据输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是1, 不必处理。
7、可以假设结果的年份不会超过9999。输出要求对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday and Saturday“。(1) 确定某年的第一天是星期几?int day(int year)/求某年的第一天是星期几long a,b;if(year=2000)a=2000-year;b=6-(a+a/4-a/100+a/400)%7; return b;else a=year-200
8、0; b=(a+1+(a-1)/4-(a-1)/100+(a-1)/400)%7+6; return b%7; (2) 求出2000年1月1日是星期几Y=day(2000)(3) 求从2000年1月1日开始逝去的天数days除以7的余数Z=days%7(4) 求days是星期几x=(y+z)%7(5) 利用字符数组输出下标x所对应的星期英文名(6) 求days的年月日Year=2000 month=1 day=1利用循环while(days)days-;day+如果day达到某月的最后一天,day=1,month+如果month=12,day=31,则year+,month=1,day=1但要
9、考虑闰年问题 2、生理周期问题描述人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23 天、28 天和33 天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时
10、间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。输入数据输入四个整数:p, e, i 和d。 p, e, i 分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是给定的时间,可能小于p, e, 或 i。 所有给定时间是非负的并且小于365, 所求的时间小于等于21252。输出要求从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。解题思路:假设从当年的第一天开始数,第x天三个高峰值同时出现,符合要求的x必须在d+1,21252之间,并且同时满足三个条件(1)(x-p)%23=0(2)(x-e)%28=0 (3)(x-i)%33=0于是可
11、以用三种方法解决问题。方法一slzq.c:(1) 设置数组m表示三个周期的长度int m3=23,28,33(2) 设置数组a表示体力、情感和智力高峰出现的时间从键盘输入a(3) 计算出三者高峰同时出现的时间ans=0; for(j=0;j3;j+) int t=M/mj; ext_gcd(t,mj); ans=(ans+t*x*aj)%M;其中:M=m0*m1*m2t=M/mi, i=0,1,2x由下面函数求出(4) 设置全局变量x,yint x,y;void ext_gcd(int a,int b) int t; if(b=0) x=1; y=0; else ext_gcd(b,a%b);
12、 t=x; x=y; y=t-a/b*y; (5) 调用ext_gcd(t,mi),求出x(6) ansd执行下面循环while(ans=d) ans+=M; (7) ans-d为所求的结果(d为给定的时间,从键盘输入)方法二slzq1.c:a0,a1,a2分别代表p,e,i,表示体力、情感、智力出现最大值的时间m0,m1,m2分别表示三个的周长M=1; for(j=0;j3;j+) M*=mj; for(j=d+1;j=M;j+) if(j-a0)%m0=0)break; for(;j=M;j=j+m0) if(j-a1)%m1=0) break; for(;j=M;j=j+m0*m1) i
13、f(j-a2)%m2=0)方法 三slzq2.cM=m0*m1*m2; for(j=d+1;j=M;j+)x=(j-a0)%m0=0; y=(j-a1)%m1=0; z=(j-a2)%m2=0; if(x&y&z)printf(“%dn”,j-d);3、约瑟夫问题问题描述约瑟夫问题:有只猴子,按顺时针方向围成一圈选大王(编号从到),从第号开始报数,一直数到,数到的猴子退出圈外,剩下的猴子再从出圈的下一个开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入,后,输出最后猴王的编号。输入数据每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 m, n =2;i-)s1=(s