程序结构论文(共11篇)
程序结构论文 篇1
摘要:介绍PLC几种典型的程序结构,为PLC的用户和国产PLC厂家提出了选择PLC程序结构的建议。
关键词:PLC,程序结构
所有PLC的用户程序都由主程序、子程序(S7-300/4 0 0称为功能和功能块)和中断程序组成。实际上不同的P L C的程序结构有很大的区别,程序结构的好坏,与程序的可移植性、可复用性、程序封装能力有很大的关系。程序结构是设计或选择一个理想的P L C产品首先应考虑的最重要的问题。
1 几种典型的PLC程序结构
国内流行的三菱FX系列,西门子S7-200、S7-300/400系列分别代表了3种不同的程序结构。此外还应注意IEC 61131-3标准规定的程序结构,下面分别讨论它们的特点。
1.1 三菱FX系列的程序结构
FX系列的用户程序由主程序、子程序和中断程序组成。在每个扫描循环周期,C P U都要调用一次主程序。主程序可以调用子程序,小型控制系统可以只有主程序。
中断程序用于快速响应中断事件。在中断事件发生时,C P U将停止执行当时正在处理的程序或任务,去执行用户编写的中断程序。执行完中断程序后,继续执行被暂停执行的程序或任务。
FX的子程序和中断程序没有局部变量,子程序没有输入、输出参数,程序模块之间没有清晰的接口,难以对外部隐藏程序模块内部的代码,从而实现模块化编程。
1.2 西门子S7-200的程序结构
S7-200的程序组织单元(Program Organizational Unit,简称为POU)包括主程序、子程序和中断程序。输入I、输出Q、变量存储器V、内部存储器位M、定时器T、计数器C等属于全局变量,所有的P O U都可以使用它们。每个P O U均有自己的局部变量,局部变量只能在它所在的POU中使用。
子程序的4种局部变量:
(1)临时变量TEMP是暂时保存在局部数据堆栈中的局部变量。只有在调用P O U时才能使用它的临时变量,P O U执行完后,不再保存临时变量的值。主程序和中断程序只有临时变量。
(2)输入参数IN的值由调用它的POU提供。
(3)输出参数O U T用来将功能的执行结果返回给调用它的P O U。
(4)IN_OUT是输入_输出参数,其初始值由调用它的P O U传送给子程序,并用同一变量将子程序的执行结果返回给调用它的P O U。
使用具有输入、输出参数和局部变量的子程序,易于实现结构化编程,对于长期生产同类设备或生产线的厂家尤为有用。这些厂家的编程人员为设备的各组件或工艺功能编写了大量的通用的子程序。即使不知道子程序的内部代码,只要知道子程序的功能和输入、输出参数的意义,就可以通过程序之间的调用快速“组装”出满足不同用户要求的控制程序,就好像用数字集成电路芯片组成复杂的数字电路一样。子程序的输入、输出参数是实现结构化编程的必要条件。
子程序和中断程序如果没有局部变量,只能使用全局变量。将这样的子程序和中断程序移植到别的项目时,需要重新统一分配它们内部使用的全局变量的地址,以保证不会出现地址冲突。当程序很复杂,子程序和中断程序很多时,这种重新分配全局变量地址的工作量非常大,也很容易出错。
如果子程序和中断程序有局部变量,并且在它们内部只使用局部变量,不使用全局变量,因为与其他P O U没有地址冲突,不需作任何改动,就可以将这样的子程序和中断程序移植到别的项目中去。
1.3 西门子S7-300/400的程序结构
S7-300/400将子程序分为功能(FC)和功能块(FB)。S7-300/400的共享数据块可供所有的逻辑块使用。
功能是用户编写的没有固定的存储区的程序块,类似于S7-200的子程序。其输入、输出参数和临时变量存储在局部数据堆栈中,功能执行结束后,不再保存这些数据。可以用全局变量来存储那些在功能执行结束后需要保存的数据,但是会影响功能的可移植性。功能的局部变量中的返回值实际上属于输出参数。
功能块是用户编写的有自己的存储区(背景数据块)的程序块,功能块的局部变量包括临时变量、输入/输出参数和静态变量。临时变量存储在局部数据堆栈,其他局部变量存放在调用功能块时指定的背景数据块中。功能块执行完后,背景数据块中的数据不会丢失,但是不会保存局部数据堆栈中的数据。
1.4 IEC 61131-3的程序结构
IEC 61131-3是PLC的编程语言标准,对应的国家标准为GB/T 15969.3-2005。IEC 61131-3是世界上第一个,也是至今为止唯一的工业控制系统的编程语言标准。I E C61131-3有三种POU:程序、功能块和功能。
(1)功能:是有多个输入参数和一个输出参数(返回值)的P O U,返回值的名称与功能的名称相同,需要定义返回值的数据类型。调用具有相同输入值的功能总是返回相同的结果。在一个功能内,可以调用另外的功能,但是不能调用功能块或程序。功能可定义的局部变量有VAR和输入参数VAR_INPUT。
IEC 61131-3定义了一系列标准的功能和功能块。
(2)功能块:是带有多个输入/输出参数和内部存储单元的P O U,功能块的返回值与其内部存储单元的值有关。功能块内可以调用别的功能块或功能,但是不能调用程序。
在调用功能块之前,必须在要调用功能块的P O U中,为每次调用声明功能块的实例,操作系统将为每次调用分配功能块专用的存储区(类似于S7-300/400的背景数据块)。
(3)程序:项目中至少必须有一个程序,可以在程序中调用功能和功能块,程序有局部变量。
1.5 S7-300/400与IEC 61131-3程序结构的区别
(1)S7-300/400的功能可以有多个输出参数,返回值也属于输出参数。IEC 61131-3的功能只有一个返回值。
(2)在声明IEC 61131-3的功能块的实例时,自动分配用于保存功能块局部变量的专用存储区,用户程序不能直接访问该存储区。
S7-300/400的功能块的局部变量(不包括临时变量)保存在它的背景数据块中。其他逻辑块可以访问背景数据块中的变量,但是由此带来一些问题。如果需要多次调用同一个功能块来控制同一类型的被控对象,每次调用都需要指定一个背景数据块,但是这些背景数据块中的变量可能又很少,这样在项目中就出现了大量的背景数据块“碎片”。可以使用多重背景来减少背景数据块的数量。但是需要增加一个用来管理多重背景的功能块。
背景数据块使程序结构复杂化,但是实际上别的P O U一般并不需要访问背景数据块,它的优点很难发挥出来。这可能是IEC 61131-3没有完全采用S7-300/400的程序结构的原因之一。
(3)S7-300/400的功能块的局部变量有临时变量和静态变量,IEC 61131-3的功能块的内部变量VAR相当于S7-300/400的静态变量。
(4)S7-300/400将数据区划分为数据块来使用,数据块的大小与数据块中定义的变量的数据类型和变量的个数有关。在访问数据块时,需要指定数据块的编号和数据块内部的地址。IEC 61131-3的程序结构中没有数据块。
2 对PLC程序结构的建议
2.1 对PLC用户的建议
(1)小型控制系统可以选用类似F X系列程序结构的PLC。
(2)要求较高时可以选用类似S7-200程序结构的PLC。
(3)系统较大、对程序的可移植性要求较高时,可选用S7-300/400,或其他采用IEC 61131-3程序结构的PLC。
2.2 对国产PLC厂家的建议
(1)鉴于局部变量与子程序的输入、输出参数的重要作用,建议小型PLC至少采用类似于S7-200的程序结构,子程序有输入、输出参数,子程序和中断程序有局部变量。
其缺点是子程序没有专用的存储区,如果在执行完子程序后有需要保存的数据,不能使用子程序的临时局部变量,只能使用全局变量来储存它们。
(2)最好采用IEC 61131-3的程序结构。
S7-300/400或IEC 61131-3的程序结构比较理想,其功能块内部可以全部使用局部变量,不使用全局变量,具有良好的可移植性。
相对而言,IEC 61131-3的程序结构比较简单,但是其功能只有一个输出变量(返回值)。
建议采用IEC 61131-3的程序结构,但是功能可以有多个输出参数。
程序结构论文 篇2
这堂课用时53分钟,比正常上课时间略长8分钟。知识讲解环节停留时间较长,重点讲解For循环结构的格式及执行过程。与教材不同之处,我引入同心圆的范例,这是借鉴广州教材。之前学生学习过画一个圆,那么画十个圆又如何画呢?用十个circle语句吗?这时引入循环结构,让学生观察这十个circle语句的相同与不同之处,学生回答:圆心点相同,半径不同,半径之间差额相同。这时在PPT上指出初值、终值和步长,学生就很容易理解。接着列出For循环语句的格式,根据格式让学生做填空,变量、初值、终值、步长、循环语句、下一个变量等,为了加深对该语句的理解,我再引入流程图,强调循环控制条件和循环变量。流程图的理解仅仅停留在图上,循环变量如何变化,它对循环体有什么影响,通过一个人物情景游戏,很好地演绎了这个过程。接着又显示一段有错误的循环语句,让学生找出其中的问题,并修改。在知识运用和知识延伸环节都是围绕画圆,通过改变circle语句中坐标和半径,绘制更多丰富图形,而这里的关键就是要引导学生用好支架,深层思考循环变量对坐标和半径的改变。同时循环体也从执行一个语句延伸到执行两个语句。知识迁移是运用循环思想解决数学问题。
不足之处,没有控制好上课时间,有部分的讲解过于拖沓。知识运用环节,绘制更丰富的图形,应该依据学生的掌握情况,适当删减,给学生留更多上机实践的时间。另外,有部分学生的学习状态没有得到关注,小组的作用并没有发挥出来。希望在以后的课堂上有所改进。
从效果上来看,学生最后来完成教学评价表,全班55个学生填写评价表,评价指标有7项,全部掌握的学生达41人次,掌握4项以上的10人,不熟练掌握的.4人。全部掌握的比率达75%,这个数字很鼓舞人心。信息学竞赛培训我做了很多年,给选拔出来的优等生讲循环结构,都要相当时间来讲解和消化。而这堂课,利用最近发展区的原理来进行教学设计,在一个程度较好的班级,就能达到这样的效果,是很让人高兴的。再次证明,走教学研究之路,必将事半功倍。
程序结构论文 篇3
“小学体育体验学习教学程序”的基本结构
第一步:入情激趣
就是创设情境,激发情趣。
这个环节是课堂教学的开端,是体验学习的起始阶段。恰当的导入,不但提出了本课的学习目标、学习内容,而且能集中学生学习的注意力,激发学生的学习兴趣,在生理上、心理上为参与本课学习形成最佳的预备状态。入情激趣的方法有很多,如启发谈话、实物演示、小品表演、讲故事、学格言、猜谜语、唱儿歌、看图片、做小游戏……不管用什么方法,都要紧扣学习目标,同时做到有趣。
第二步:自主体验
就是主体体验,尝试练习。
这一步是学生主体亲身经历的阶段,这是体验学习的第一过程。其主要任务是学生通过自主参与体验身体练习活动的过程,初步感知运动技术技能。学习主体通过尝试身体练习的体验活动,感知运动的技术技能,发现疑难、提出问题,为进一步学习做好准备,也为教师的教学提供了客观的依据。因此,教师要从以下几方面进行:
1.提出明确的学习要求,为学生创造良好的自主体验学习活动的氛围,出示学生自主体验学习活动的提纲或思考题。自主练习提纲(问题)设计的如何,是教学成败的关键,教师要注重学习重点的落实、学习难点的突破。
2.组织学生主体参与尝试练习体验学习活动,并有针对性地进行指导。尽可能地为学生提供种各种学习活动的材料(如游戏、图片、模型、影像等),使学生在自主尝试练习的体验学习活动过程中能运用各种感官观察事物,获得新知。同时教师可以简明地介绍体验学习的方式,以便学生预先知道自己应当以何种方式、何种心态去参与学习。
第三步:反思观察
就是反思观察,探究练习。
这一步是亲历知识技能形成的过程,是体验学习的重要环节。通过对同伴或小组主体体验学习行为的观察,反思知识技能形成的规律,体验、探究、发现知识技能形成的过程,积极参与探究知识技能身体练习活动,并表露自己的情感,建构自己的认知体系。这一步教师一般要从以下两方面进行:
1.教师可以把自己看见的体验学习活动中学生的表现作为一个信息反馈,请表现优秀的学生或小组进行展示,引导学生认真观察,反思自己與同伴的差异,寻求获取知识技能的策略。
2.科学合理地设计问题,引领学生体验、探索、发现知识技能形成的过程,让学生成为知识技能的探究者、发现者。
第四步:释疑明理
第五步:应用实践
就是应用实践,巩固练习。
这一环节是巩固发展体验学习成果,运用所学的技术技能指导身体练习活动实践的阶段。通过应用实践,验证了获得运动知识技能的正确性,加深了对运动技术技能的理解,进一步提升学生的运动技术技能水平。一方面培养了学生应用知识的能力,另一方面通过应用实践体验活动发展了学生的基本活动能力,增强了学生的体质。这一步教师要做到:
1.精心选择与主教材有密切联系的游戏或素质练习实践活动,并注意内容的科学性、趣味性。
2.指导学生积极参与应用实践活动。
第六步:恢复总结
就是恢复身心,总结分享。
这一步是整堂课的最后一个环节,使本堂课的教学重点进一步得到强化。教学中不能省掉这部分的内容而仓促下课,否则不仅会影响课的效果,也会影响下一节课的进行,甚至会影响学生的身体健康。本环节是提升学习方法与能力的重要环节,是养成学生良好学习习惯形成终身体育意识的重要途径。这一步教师要:
1.根据上一环节的教材内容、活动情况,合理地安排恢复身心的放松运动。
2.组织学生用简洁明了的语言再现本课的教学重点、难点,归纳学习心得,评价自己的学习行为,提倡学生鼓励式的讨论,尊重每个人的想法,共同分享体验学习的成果,提出今后的行动方向。
《选择结构程序》教学设计 篇4
山东教育出版社出版的《初中信息技术》第二章第二节。
●●设计思想
算法与程序设计是普通高中信息技术课程中选修模块之一, 本模块旨在使学生进一步体验算法思想, 能从简单问题出发, 设计解决问题的算法, 并能初步使用一种程序设计语言编制程序实现算法解决问题。本节课的目标就是促进学生对问题解决方法和思想的理解与掌握, 从而提升学生的问题解决能力。对于高二的学生来说, 他们对事物的分析、思考、解决的能力都达到了一定的水平, 在教师的引导下, 有能力进行自我探究, 如果用一种贴近生活的例子来学习的话, 那么学生会比较感兴趣。所以对于本节课的学习我采用了“支架式”的教学策略, 即把复杂的学习任务加以分解, 以便把学习者的理解逐步引向深入。在讲课的时候采用课本上的例题, 因为这个例子在前面提到过, 学生学习起来比较容易, 而且这是一道关于一元二次方程的数学题, 数学课上也已经学过, 对其算法也很熟悉, 而且还可以让他们真正体验到程序设计的好处, 让知识学有所用, 保持他们继续学习的欲望。
●●学习目标
1.知识和技能
(1) 知道程序设计的类型。
(2) 掌握vb中程序设计结构中的选择结构。
(3) 学会运用选择语句编写简单的程序。
2.过程与方法
(1) 结合数学问题学习选择结构。
(2) 采用启发式的学习方法。
3.情感态度与价值观
(1) 通过趣味性的内容, 保持高涨的学习兴趣, 体验成功的喜悦。
(2) 感受设计的美感, 培养学生的团队协作精神。
●●教学重点
掌握选择结构程序设计的格式。
●●教学难点
对于编写程序代码的理解。
●●教学准备
硬件设备:多媒体网络教室
软件设备:《算法与程序设计》课本
●●学习过程
(一) 课前组织教学
1.课代表组织学生进机房, 填写上机记录。
2.教师指出本节学习内容, 让学生阅读课本, 预习本节41-44页的内容。
设计意图:培养良好的学习习惯。
(二) 数学问题, 导入主题, 引起兴趣
教师:我们在数学课上已经学过了怎样求一元二次方程的顶点坐标, 现在一起复习下怎么求一元二次方程的顶点坐标。
学生:x=-b/ (2*a) , y= (4*a*c-b*b) / (4*a)
教师:我们上一节课已经编写了这样一个程序, 现在我们再试着运行一下。 (教师演示程序) 当教师输入a=0时, 程序提示是错误的。为什么?
学生:a=0时方程不是一元二次方程。
老师:对了, 但我们上节课编写程序时是不是没有考虑到这点呢?这就说明我们编写的程序还不完整, 考虑的方面还不是很全面, 这节课我们就把这个程序进一步地完善。怎么样才能使程序更加完善?
学生: (几分钟思考通过看书上的内容对他们也有所启发) 加上一条选择语句。
老师:非常好, 那我们现在就看看怎样编写有选择语句的程序。
设计意图:通过上节课的程序作为导入本节课的内容, 既复习了上节课的内容又给学生以启发思考, 激发他们的学习热情, 引起他们的注意力。
(三) 基本知识学习
老师:编写程序首先要学习书写语句, 语句又是由一个一个的表达式组成的, 那么我们现在就看怎么运用表达式书写程序吧。
1.怎样写条件表达式和逻辑表达式 (老师举例讲解) 。
2.正确选择语句的书写格式。
两种格式。第一种:if条件表达式 (或逻辑表达式) then
语句序列 (一条或多条语句) end if
第二种:if条件表达式 (或逻辑表达式) then
语句序列1
else
语句序列2
end if
(四) 学生自主实践
老师:现在我们知道了编程的一些要求及如何写条件语句, 那大家就自己动脑修改一下我刚才演示的程序吧。
一元二次方程顶点坐标程序的“计算”按钮对应的程序代码如下:
private sub command1_click ()
a=val (Text1.text)
b=val (Text2.text
c=val (Text3.text
m=-b/ (2*a)
n= (4*a*c-b*b) / (4*a)
Text4.text=m
Text5.text=n
End sub
设计意图:给学生自由发挥的空间, 提高他们的自主学习能力。
(五) 教师评价总结
通过巡视发现学生在修改程序时的一些问题, 及时给予纠正, 对于学生中编写得比较好的程序及时给予表扬。
设计意图:教师对学生的表现的评价很重要, 学生从中能知道自己的不足, 并能及时改掉, 对于他人的长处能虚心学习。
(六) 提出新问题让学生思考
根据本节课的例题, 给掌握比较快的学生提出进一步的思考:怎样求一元二次方程的最大值和最小值。学生根据自己的思路试着编写程序后再和课本上的例题对照查看其不同之处。
设计意图:进一步了解条件语句更为复杂的内容条件语句的嵌套。
(七) 本节课总结
通过本节课的学习基本掌握了条件语句的使用, 希望大家在以后的学习中碰到类似的问题能够举一反三, 灵活处理。
设计思路:让每节课都有一个好的开始和好的结束, 让同学们都有所收获, 期待下一节课的学习。
●●教学反思
1.对于课堂的两极分化现象, 我采取了小组合作的方式, 基础好的帮助基础差的, 共同解决问题。
2.程序设计知识的学习关键是要调动起学生的积极性, 充分发挥他们的潜能, 使学生成为学习的主体。
3.对于学习中的重点难点应避免采用纯理论的讲解方式, 要适当地运用一些鲜活的实例。
4.根据课堂特点, 做好课堂小结也极为重要, 把各个知识点融会贯通。
程序结构论文 篇5
课题:
教学目的: 教学重点: 教学难点: 第五章 选择结构程序设计
1、掌握实现选择结构的两种语句、一个运算符
2、学会编写选择结构的程序
if-else语句、switch语句、条件运算符
嵌套if-else语句中的if与else匹配问题
步骤一 复习引导
上一次课已经介绍了程序基本结构之一,但在大多数情况下都要用到选择结构。
步骤二 讲授新课
在C语言中实现选择结构的控制语句主要有if语句、switch语句
一、条件语句
1、if语句的三种形式
语法1:if(表达式)语句;如:#include
if(ch>‟a‟&&ch<=„z‟)ch+=„A‟-‟a‟;
putchar(ch);}
语法2:if(表达式)语句1;
else
语句2; 如:#include
main()
{ int a,b;
scanf(“%d%d”,&a,&b);
if(a>b)printf(“max=%dn”,a);
else printf(“max=%dn”,b);
}
语法3:if(表达式1)语句1;
else if(表达式2)语句2;
else
if(表达式3)语句3;
„„
else 语句n+1;
例如:从键盘上输入字符,判别其分类:控制符、数字、大写字母、小写字母、其他字符。#include “stdio.h” main(){ char c;c=getchar();if(c< 32)printf(“This is a control character.n”);
else if(c>=„0‟&&c<=„9‟)printf(“This if a digit.n”);
else if(c>=„A‟&&c<=„Z‟)printf(“This is a capital letter.n”);
else if(c>=„a‟&&c<=„z‟)printf(“This is a small letter.n”);
else
printf(“This is an other charater.n”);说明:
1、三种形式的 if 语句中,if 关键字后均为表达式(逻辑表达式、关系表达式、赋值表达式、变量等);
如:if(a=5)语句;
if(b)语句;
2、if 语句中,条件表达式必须用括号括起来,在语句后必须加分号;
满足条件需执行一组语句时,该组语句必须用{ }括起来; 如:if(a+b>c&&b+c>a&&a+c>b)
{ s=0.5*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(“area=%6.2fn”,area);
}
else
printf(“It is not a trilateral.”);
3、if 语句嵌套时,else 总是与它最靠近的if 匹配;
如:有一数学函数:x<0时,y=-1;x=0时,y=0;x>0时,y=1 编写程序,输入x的值,输出相应y的值 main(){ int x,y;
scanf(“%d”,&x);
if(x<0)y=-1;
else if(x= =0)y=0;
else y=1;
printf(“x=%d,y=%dn”,x,y);}
说明:因为if 语句执行时总是简单地测试其中作为条件的“表达式”的值是0还是非0,便可利用这种特性来简化程序设计。如对于:
if(expression!=0)
完全可用
if(expression)来代替;
同理:
if(!exp)语句;等价于:if(exp= =0)语句; 二、三目条件运算符及其表达式
1、条件运算符:?:
2、格式:e1?e2:e3
3、语义:判e1的值,为1时计算e2,否则计算e3;
如:max=(a>b)?a:b 等价于 if(a>b)max=a;
else max=b;
4、说明:
1)条件运算符的结合方向自右至左
如:a>b?a:c>d?c:d 等价于 a>b?a:(c>d?c:d)若int a=1,b=2,c=3,d=4;则表达式的值为________ 例:输入一个正整数i,输出第i个英文字母,若i大于26则输出一个„*‟。#include
scanf(“%d”,&i);
i=(i<=26)?(i-1+‟a‟):‟*‟;
putchar(i);} 2)条件运算符的优先级仅高于逗号运算符与赋值运算符;
3)只有当if语句的真假均只执行一个赋值语句且给同一变量赋值时,才能用条件表达式取代;
如:if(a>b)max=a;
else max=b;思考:int x=1,y=0;x-->(y+x)?5:25>y++?‟1‟:‟2‟的值是______
三、switch 语句
语法1:switch(表达式)
{ case C1:语句序列1;
case C2:语句序列2;
……
case Cn:语句序列n;
default:语句序列n+1;
} 语法2:switch(表达式)
{ case C1:语句序列1;break;
case C2:语句序列2;break;
……
case Cn:语句序列n;break;
default: 语句序列n+1;break;
} 其中:
switch后括号中的表达式可以为任何类型;
C1至Cn 是常量表达式,一般是整数或字符,与switch中表达式的取值对应; default可缺省,当表达式e的值不是C1到Cn的情况。
注意两种语法的执行顺序!
例:switch(grade)
{ case „A‟: printf(“85~100n”);break;
case „B‟: printf(“70~84n”);break;
case „C‟: printf(“60~69n”);break;
case „D‟: printf(“<60n”);break;
default: printf(“errorn”);break;
}
允许多个case共用一个执行语句 例:switch(ch){ case „0‟: case „1‟: case „2‟: case „3‟: case „4‟: case „5‟: case „6‟: case „7‟: case „8‟:
case „9‟:digit++;break;
case „ „: case „t‟: case „n‟: white++;break;
default: character++;}
break语句只能跳出一层,内外层情况常可相同; 如:
int x=1, y=0;switch(x){ case 1: switch(y)
{case 0: printf(“**1**n”);break;
case 1: printf(“**2**n”);break;
}
case 2: printf(“**3**n”);} 运行结果为:**1**
**3**
五、程序举例
例:求ax2+bx+c=0方程的根。分析:
(1)a=0,不是二次方程。
(2)b2-4ac=0,有两个相等的实根。(3)b2-4ac>0,有两个不等的实根。(4)b2-4ac<0,有两个共轭的复根。N-S图:P102
步骤三 课堂小结
1、两种选择语句:if-else、switch语句,注意选择条件的描述;
2、在编写程序过程中,注意分支的作用范围,及复合语句的运用。
步骤四 布置作业
1、上机作业(第五章课后练习):5.5、5.6
程序结构论文 篇6
关键词:Visual Basic 6.0;结构化;程序设计
Visual Basic 6.0是编程入门者容易掌握和使用的编程语言。VB虽然采用面向对象的编程方法,但是在具体的过程内部,仍然要用到结构化程序设计的方法来对其流程进行控制。结构化程序设计中共有三种结构:顺序结构、选择结构、循环结构,这三种结构贯穿了编程语言学习的始终。所有的复杂程序都可以由这三种结构通过组合、嵌套来完成。
一、常见问题解析
在选择结构的讲解过程中,有不少学生说,教师讲课能听懂,流程图和例题也可以看懂,就是一到了自己上機编写程序代码的时候就不知所措了,特别是编写具体作业的程序代码,测试运行的时候就经常出错,得不到正确结果,而且又找不到毛病。
要提高学生编程的正确率和准确性,需要:(1)教师要使用一些灵活的方法进行授课,了解学生的盲点和编程误区,及时进行点拨,帮助学生理解各种语句的执行流程,尤其是选择语句和循环语句,从而让学生顺利掌握重点和难点。(2)需要学生对Visual Basic语法规则和常用保留字熟悉,养成做好注释等良好的编程习惯。(3)需要学生能构建好语言框架,熟练掌握算法运用,并形成专业的编程思维。
二、在VB6.0中讲解结构化程序设计的方法
1.流程图的运用
VB的重点在思路、算法、编程构思和程序实现上,流程图是一种用图形来表示算法和解题思路的描述方法,对于初学者来说非常重要。它直观形象、容易理解,学生通过流程图可以掌握程序的走向,构建好程序的基本框架,这样就能把平时的知识如语法、函数、对象、事件等组织起来编出程序,从而达到正确的结果。
2.边讲边练,理论与实践相结合
上课时多和学生互动,每讲完一个小知识点后必须让学生自己动手做出来(上机操作),这样,每一个知识点学生都可以各个击破,然后教师可以把相关的知识点进行综合讲解和分析,让学生把所学的内容统一于结构化程序设计的主题。如果45分钟教师都在讲解,然后下节课再让学生上机操作的话,效果会很不理想。
3.养成良好的编程习惯
学生刚开始学习VB,要打好基础,需要留意每一个细微的小规则或习惯,好的习惯可以为以后编程省下很多麻烦。细节决定成败,注意每一个细节,养成良好的编程习惯,虽然一开始会有些烦琐,但可以为以后的编程省去很多查错和调试的时间,可以说磨刀不误砍柴工。
养成良好的编程习惯,尤其要注意:(1)多做注释。变量要加注释,程序构思也要有说明,这样不仅可以增强程序的可读性,还可以在编写注释时,进一步理清思路,查找到程序设计的缺陷和出现的漏洞,及时进行弥补和纠错。(2)机房安装VB的同时要装上MSDN(就是帮助),学生对函数、语法等的使用方法和功能有疑问时,可以自己获得帮助。
4.掌握调试程序的方法,学会运用系统的断点调试功能
在代码中设置断点是常用的一种调试方法。断点是告诉VB挂起程序执行的一个标记,当程序执行到断点处即暂停程序的执行,进入中断模式,此时可以在【代码】窗口中查看程序内变量、属性的值。
学生在自己完成作业时,程序编好了,经常出现结果不正确,一运行就崩溃的情况,学生不知道在哪里出了问题,或者精确到哪一句,就可以在可疑的几句上设置断点,逐步执行。
当执行到断点所在的语句时,把鼠标移到当前语句的变量上,就会显示出此变量的值,学生通过观察这些值的变化,就能发现程序设计的错误和漏洞,进而改正错误。应该注意的是显示的变量的值是没有执行完当前语句的值,而不是执行完语句后变量的值。
5.示例和作业要贴合实际
为了让学生更好地掌握程序设计方法,教师示例和作业的安排要巧妙而合理,可以:(1)尽可能结合学生的实际情况,找他们感兴趣的话题和内容进行示范并安排作业,以此激发他们的学习兴趣。(2)示例和作业的安排要循序渐进。(3)示例和作业要有较强的针对性,可应用的语句和最优的语句要明确。
6.同一问题使用多种语句实现
在VB6.0中,使用程序设计处理某一问题时,可以让学生用多种不同语句来编程,如选择结构可以用if嵌套语句,多分支控制结构Select Case语句,还可以用Iif函数;需要用到循环结构的时候,可以使用For循环,Do循环,While循环,甚至GoTo语句。这样学生把各个语句的共同点和不同点都掌握了,在以后的编程中就会选择最合适的语句,灵活运用嵌套等多种方法来实现,而不再盲目编程。
7.培养结构化的程序设计思维
使用计算机编制程序解决现实生活中的实际问题,需要在课程讲解时,有意识地培养学生使用计算机的思维模式来对问题进行分解和处理,这样才能编制出逻辑合理、条理清楚、层次分明的结构化程序代码。
参考文献:
[1]沈大林.Visual Basic程序设计案例教程[M].北京:中国铁道出版社,2004.
程序结构论文 篇7
1 模块独立性
模块的独立性越强, 其灵活程度越低。也就是说为了保证模块的独立性, 必须不与其他模块或类型产生依赖关系, 函数的参数不能使用其他模块中的定义类型。所以, 使用通用性强的变量类型作为模块的出入口参数能够保证其较高的独立性。但在以处理复杂数据结构为核心功能的大型应用程序 (如地理信息系统、图形处理系统等) 中, 每一个功能模块都围绕着复杂数据类型 (空间数据、图形数据等) 进行设计。若将模块中处理复杂数据类型的函数参数设计为自定义的复杂数据类型, 必然产生对此种数据结构的依赖, 模块独立性大幅下降。若将参数设计为简单变量, 则失去了定义这个复杂数据类型的初衷, 可理解性变差, 反而使程序开发变得复杂。若将此数据类型作为公用类型, 让所有模块都可访问, 虽然既保证了函数参数的通用性, 也方便了数据处理, 但必然会受到这个公用数据类型的限制, 这个数据类型的改动将涉及所有模块的代码重写, 直接降低了程序的可扩展性能。
2 结构优化原则
该文探讨一种模块的优化组合方法, 在面对复杂数据结构的情况下, 能够提高模块的独立性。这种方法以总线式结构为基础, 利用Microsoft.NET Framework的反射机制作, 管理模块加载和配置, 达到程序的深层次修改和模块多维扩展的目标。此方法遵循的原则是: (1) 灵活的模块组合方式。模块组合的方法操作简单, 结构灵活, 方式多样, 加载的方式必须一致。不仅要求模块可替换、可扩展, 还能实现新老版本模块的交替使用。 (2) 明确的模块间相互依赖关系。所有模块不能依赖于下层模块里的类、属性、字段、方法等, 只能依赖上层模块。所有模块之间的关联, 必须是松耦合关联, 并且关联方式必须通过顶层模块调用。 (3) 简洁的接口设计。简化总线和固定模块的功能, 减小接口的数量和规模, 强化组件、工具的功能, 工具的使用必须采用一致的接口调用。
3 程序结构设计优化
根据软件的业务逻辑模型, 将模块各部件封装成类, 变为独立的整体单元, 自上而下的将模块组合设计为层次结构, 可用树形结构描述。树形结构的根节点位置模块, 就是系统总线。总线并不负责所有子模块的加载, 子模块的加载工作交给另一个中间件完成。总线只是一个容器, 提供所有模块的存储空间和总线资源的引用方法。将总线也设计为模块, 若系统功能改变, 总线也可以像其他子模块一样, 进行替换。模块加载中间件逻辑上位于两个模块中间, 实现宿主模块和多个子模块关联。它为宿主模块提供子模块的加载方法, 并规范子模块, 使之符合被载入条件。为了叙述方便, 将这个中间件命名为Module Loader, 它继承于被命名为IBus的资源调用接口, 让被载入子模块通过接口能够向上搜索, 找到树形结构的根节点—总线, 子模块通过总线调用其模块的各种功能。Module Loader的核心部件是其内部维护了一个可加载类型的配置列表, 当向模块中插入下级模块时, 只需要向此表中添加一个类型, 由Module Loader自动完成对这个类型的所有继承类型的扫描, 并选择符合条件的加载类型, 进行实例化。软件框架搭建时, 让所有可扩展的模块基类都继承于Module Loader类型, 模块的扩展采用继承的方法。这样, 所有的模块都具备载入其它模块和被载入的功能, 并且载入的模块可以被选择和配置。开发者可以实现任意两个模块之间的从属结构关联, 从而构成复杂的程序框架结构。
4 Module Loader的设计
Module Loader的关键功能是实现模块的动态加载。其原理是它实现了对模块子类的扫描功能, 这种扫描功能利用了.NET Framework提供的反射机制 (Reflection) , 该项可以在运行时获得.NET中每一个类型 (包括类、结构、委托、接口和枚举等) 的成员, 包括方法、属性、事件, 以及构造函数等。树形结构中的每个Module Loader中都内含扩展类型配置集, 利用反射的功能, 扫描配置集中类型的子类信息, 检查配置状态, 当条件符合时, 创建这个类型的实现, 加入到实例列表中。当需要扩展一个模块时, 只需要修改其宿主模块的配置集信息, Module Loader会自动搜索到这个类, 实例化该类型, 替换原有模块。Module Loader由两部分组成: (1) 配置工具部分包括:用于存储所有的可扩展类型和状态的集合、用于获取模块子类信息的扫描工具、用于自动创建配置集信息的构造器和用于配置集信息设计和获取的配置器。 (2) 实例化工具部分包括:用于保存所有子模块实例的对象列表、用于根据配置集信息创建模块实例的构造工具、用于增加、删除、替换模块实例的管理工具和用于获取用户所需子模块实例的对象提取工具。这两大部分协同操作, 使Module Loader不仅可以加载、管理不同类型的多种模块, 也可实现对模块不同版本的交替使用, 使程序框架中模块的组合方式更加灵活。
5 命名空间的依赖性
为了提高模块的独立性, 消除模块间的病态关联, 必须明确规范模块间的相互依赖关系。利用命名空间的可视范围来限制模块间相互依赖的规范方法是可取的。因为下层命名空间的对象可以访问上层命名空间的类型, 而上层命名空间的对象是无法访问到下层以及同层其他命名空间的对象资源的。根据软件结构的逻辑关系, 确定命名空间的层次, 顺序, 范围。当结构下层的模块使用另一个命名空间的模块时, 必须通过Module Loader访问顶层的IBus接口调用其它模块对象。并且规定不准使用对下层或同层其他命名空间的直接引用。这样的规范方法, 能够保证所有调用都通过顶层总线, 避免了模块之间的非逻辑性关联, 在一定程序上提高了模块的独立性。
6 接口设计
若说命名空间为模块之间的访问设置了阻碍, 则接口设计就是在不可视的模块之间搭建了相互使用的桥梁, 让其间产生了相互使用的可能。所以模块的接口应位于命名空间的较高层次, 确保特定功能范围内的可视性。接口一旦定义, 一般不轻易修改。因此, 为通用性高的核心固定模块设计接口, 将使用率低, 通用性不高的功能设计为工具, 所有工具只设计一种接口的方法较为合理。工具集内部也可以按功能设计为层次关系, 并用动态加载的方式进行管理。但工具的使用必须采用统一的接口调用方法。这样的设计能够减少接口的数量, 控制固定接口的规模, 减少接口扩展时的代码编写工作量, 从而达到优化程序结构的目的。
7 数据结构调用
数据结构是决定模块独立性的重要关键问题。在专业软件中, 多种基本数据类型聚合为复杂的数据类型, 这种复杂数据类型符合软件业务功能的逻辑模型, 能够便于被各模块分析、处理。但是数据类型一经定义, 很难扩展。当大量模块都使用此种数据类型时, 增加、改变其中的一个变量的名称就可能涉及大量模块的改动。所以数据类型经逻辑分析组装好后, 也可为其设计接口, 模块通过接口调用复杂数据类型的对象。只要接口不改变, 即使数据类型变化, 所有的模块还能通接口调用的方式, 对数据类型继承访问。但使用这种方法时要注意两个问题: (1) 若在子模块中创建复杂数据类型的实例时, 应利用Module Loader提供的方法动态创建数据类型的实例, 并转换为接口类型使用。 (2) 接口中可能会变化的属性, 最好使用泛型集合类型定义。模糊化了的属性类型, 能够保证数据类型的扩展, 不会某些固定类型的限制, 否则也不会达到数据类型可扩展的目的。
8 效率分析
由于对象的多层次引用和动态创建, 配置集的频繁搜索, 大量的封箱、拆箱操作等, 必然会牺牲软件运行的时间和空间效率。但用这种牺牲换取的是良好的模块封闭性和结构的紧凑性。而且, 由于复杂的动态管理功能被封装在Module Loader里, 所以在开发、使用层次的实际操作变得十分简单, 牺牲运行效率的过程一般发生在初始化环境、事务高度和模块运行的起始环节, 在飞速更新的计算机硬件上已经显得微不足道。实际上, 工程师更关心软件的结构、扩展性和局部操作性能 (如空间数据的显示、处理效率) , 只有对局部模块内部的功能不断优化、升级、扩展, 才能真正提高软件的运行效率, 而这样的优化和升级必须建立在良好的结构基础之上的。
9 结语
开放的结构、灵活的扩展方式、弹性的组合方法让软件框架结构的组织变得更加清晰、紧凑, 延长了软件的生命周期。结构设计让程序开发工作能够产生良性的优化机制, 让开发者能够始终站在巨人的肩膀上, 精益求精, 不断创造奇迹, 让工程师有精力将注意力由开发技术研究转化为开发工艺研究。云计算的时代即将到来, 优化模块结构不仅适用于桌面应用程序, 也适用于云端服务单元的创建, 在“软件—服务”这一思潮涌来之时也将大有作为。
摘要:在计算机应用程序的开发过程中, 软件结构的前期设计对代码实现和后期维护、扩展和升级等工作的影响重大, 直接影响软件的代码编写规模、可扩展性等。良好的结构设计能够缩小软件规模, 提高代码的复用率。其中, 总线式结构设计是维持软件可扩展性的一种方法。将软件按功能设计为不同的模块 (插件) , 将这些模块组合在一起, 通过总线管理各个模块协同工作。当软件需要扩展时, 加入新模块或更新旧模块就可以实现。该文讲述的是基于总线式的结构设计方法, 利用.NET框架中的反射 (Reflection) 机制对类型信息的描述能力, 提出一种模块组合结构的优化方法, 用来增强软件的可维护性, 并保持对用户自定义数据结构的处理能力。
关键词:软件开发,结构设计,模块,总线,插件,优化,C#,NET,反射
参考文献
程序结构论文 篇8
矩阵有两个数据性质:
(1) 层次结构。矩阵有3个层次 : 矩阵、行或列向量、 元素 (构成平面数表)。说明矩阵由行 (列) 向量构成, 或者矩阵由m*n个元素构成。
(2) 元素次序。矩阵中元素排列的顺序 。若按照行、列顺序排列则对应二维数组, 矩阵元素按不同的行排列, 是多向的。若按照元素递增序排列则对应一维数组, 元素不分行的不同, 单向排列。
在矩阵的计算中, 目标矩阵与已知矩阵之间存在3类映射关系:
(1) 形的对应 : 行数、列数、 非0元个数。例如 , 矩阵乘法Q=M*N, 要求目标矩阵Q的行数与 已知矩阵M的行数相同, Q的列数与已知矩阵N的列数相同。
(2) 序的对应 : 行序、列序。 例如 , 转置运算中目标矩阵的行序与已知矩阵的列序相同。
(3) 层次的对应。例如 : 稀疏矩阵转置运算 , 目标矩阵T每一行第一个非0元在存储数组T.data [] 中的位置, 通过已知矩阵M每一列第一个非0元以及每一列非0元个数求出。
1 三元组表
0元素多的矩阵称为稀疏矩阵 , 用三元组表示一个非0元素。稀疏矩阵的数据结构是三元组表。
稀疏矩阵的非0元以行序为主序存储在一维数组data [中。稀疏矩阵每一行非0元的数目不同, 因此data [] 是不规则数组。稀疏矩阵存储在一维数组中, 是矩阵二维结构到元素排列递增序一维形式的映射。稀疏矩阵的计算是目标矩阵的存储数组data [] 元素赋值的过程。
2 矩阵转置运算程序
2.1 转置计算
矩阵M已知, 矩阵T未知, 转置计算就是将T的三元组表表示出来。因此在编程时, 应考虑以哪个矩阵的行序或者它的存储数组的元素递增序为算法主序, 这是矩阵计算编程的一个出发点。
(1) M、T的行列互换 (i) 两个矩阵的行数mu、列数nu互换
(ii) M、T的非0元个数相同 ,
(2) 矩阵元素, 矩阵T的第i行第j列的元素与矩阵M的第j行第i列的元素值相等。
2.2 传统转置程序 (C 语言伪代码)
M.data [] ={(1,2,12), (1,3,9), (3,1, -3), (3,6,14), (4,3,24), (5,2,18),(6,1,15),(6,4,-7)}。
存储结构:
M.data [] 按矩阵行序排列 , 数组工作游标p的上下界是[1,M.tu] ;
T.data [] 是行排列数组 , 工作游标q从1到T.tu。
两个数组都是按元素递增序, 将矩阵M、T的非0元排列在数组中。
2.3 程序分析
(1) 确定一维数组T.data [], 游标q的范围 [1,T.tu], 元素递增序, 算法线索单向。T.data [] 的赋值过程见图1:
(2) 过程分析
M同一列的元素仍然按照行序 [1..mu] , 以离散有序形式存在M.data [] 中。根据矩阵的数据性质, 传统转置算法用元素的递增序, 因此用矩阵层次结构可编写快速转置算法, 如表1所示。
3 快速转置程序
3.1 矩阵层次结构的辅助数组表示方法
一维数组M.data [] 不能表示矩阵的层次结构, 因此用辅助存储数组cpot []、num [], 将矩阵M的层次结构表示出来。
(1) cpot [] 表示每一列第一个非0元素在M.data [] 中的位置。
(2) num [] 表示每一列元素的个数。
M的num [col] =T.data [col] 行中非0元的个数。M第co列的第一 个非0元对应T的第col行的第一 个非0元 , cop[col] 指示这个非0元在T.data [] 中的位置 , 有公式计算出来 :
计算num [col] 的方法:
三元组表的元素列下标有相同的, 因此作为另一个数组num [] 的下标可以产生有利的应用。这个编程技巧应该掌握。
3.2 快速转置算法
在传统转置程序中, T.data [] 元素的增长只有一个方向q++, T.data [1]、T.data [2]、…、T.data [q]、…、T.data [T.tu],称为元素递增序。快速转置程序的目标矩阵增长序是nu行并行“增长”。T.data [] 按M的列分成nu个行数组, 每个行数组的游标cpot [col], 每一行都有一个元素递增方向, 区间表示[cpot [col] ,cpot [col+1] -1]。cpot [] 数组的元素值根据num [数组得到 (见3.1)。因此, 快速转置程序有M.nu个算法线索。T.data [] 的单序算法用游标q, 而T.data [] 并行算法线索用到cpot [] 数组 , 数组元素cpot [col] 是第col个行数组的游标 ,表示一个“增长”方向。由算法线索构成的数组cpot [] 称为数组序, 数组序是多算法主序。eg1.的并行算法的数组序如图2所示。
图2中颜色相同元素的表示并行转置, 实际这个“并行”并不是刻板的。eg1.目标矩阵T有6个行数组, 第col个数组的游标cpot [col], 根据公式 (1-1) 可得cpot [col] 的初始值与范围。这6个行数组的增长是交叉前进的, 与cpu的分时使用是一样的。
多算法主序可用“齐头并进”描述, 与归并排序的道理一样。因此速度应该比单算法线索快。算法线索在合理的程度上, 越多越好。这是衡量程序并行度的一个标准。增加并行算法线索的数量, 是提高软件效率的方法之一。
3.3 快速转置程序 (C 语言伪代码)
3.4 程序分析
3.4.1 多算法线索
传统转置算法, 目标矩阵的T.data [] 只有一个方向, 称为算法线索。快速转置中, T.data [] 有多个“增长”方向, 称为多算法线索。每一个线索实际是M矩阵的一列。矩阵作为一个数学实体, 有层次和元素次序两个角度。传统转置算法只用到了矩阵元素的次序。因此只有一个递增方向。而快速转置算法, 使用矩阵的层次结构, 使目标矩阵的每一行都有一个递增的方向, 在一次M.data [] 数组遍历中就能实现确定T.dat[]。而T的每一行的起始位置和元素个数 , 根据已知矩阵M中设置。辅助存储结构Num [] 与cpot [] 用来说明矩阵的层次结构, 能够反映转置矩阵T的逻辑结构。
传统转置算法确定T的一行元素, 需要遍历整个M.data [数组, 因此需要遍历T.nu次M.data [] 数组, 而多算法线索的快速转置程序只需要遍历一次M.data [] 数组。
3.4.2 数 据分析
如图3所示。
3.4.3 过 程分析
如表2所示。
4 乘法算法
两个稀疏矩阵相乘。Q的行数等于M的行数, Q的列数等于N的列数。
4.1 稀疏矩阵行逻辑数据结构
数据结构的组成方法让三元组表与行位置表构成一个记录, 而不单独使用辅助数组。
4.2 并行乘法算法
并行乘法计算方法: M的arow行与矩阵N相乘得到Q的第arow行, M的第arow行的一个元素M.data [p] 与N的一行M.data [p] .j=brow相乘 , 如图4所示。若M.data [p] 的列下标是j, 则M.data [p] 与N的第brow=j行元素相乘, 并且将值存储在ctem [] 中。M.data [p] .e*N.data [q] .e的结果存 储在ctemp [ ccol] 中 , 变量ccol =N.data [ q] .j ( q∈ [ 1..t] ) 。ctemp[ccol] 只是Q (arow, N.data [q] .j≠q,e≠0) 的一个部分值 , 应是第arow个部分值的累加。当前行元素累加器ctemp [] 是中间变量, ctemp [] 的长度=N.nu, 包括非0元和0元, 与三元组表的含义不同。
矩阵Q以行向量为增长主序, 按行得到值。矩阵M的一个行向量与矩阵N相乘, 一次得到Q的一行值。因此算法线索是向量序, 可用ctemp [ ] 表示。
M的一个元素与N的一行元素相乘。
4.3 并行乘法程序 (C 语言伪代码)
4.4 数据分析
如图5所示。
5 结语
矩阵计算程序的功能结构由多个有效部分组成, 包括: 目标矩阵增长序、所映射的算法主序、驱动元素的精确选择、驱动元素数据相关处理范围的确定、 计算、输出结构等。矩阵计算程序功能结构的精确组成还需要在研究更多算法的基础上确定, 例如LU分解的矩阵求逆算法等。通过对3个计算程序的分析, 可以知道一般方法和并行方法的区别, 提高对高性能计算的认识。
摘要:详细分析了矩阵转置、乘法计算程序的功能结构,分析了转置程序的多算法线索对程序效率的影响,分析了并行转置乘法的行向量方法,并且对3个程序都进行了数据分析,以及程序执行的过程分析。以达到掌握《数据结构》的稀疏矩阵计算程序的目的,而且对今后编写矩阵计算类程序在功能结构上提供了有效根据。
程序结构论文 篇9
关键词:SOA,.NET,Web Service,ADO.NET
1 程序设计的背景与目标[1]
目前,数据库技术的发展已经很成熟,Web技术对大量数据的组织管理具有较佳的信息发布途径,这两种技术的天然互补性决定相互融合是其发展的必然趋势。传统的数据库应用系统采用的客户机/服务器模式,有高度的交互性、高效的用户界面等优点,但存在数据交互和交互规则移至客户端产生的维护成本高、不易扩展等缺点。采用传统的系统架构技术和传统的EAI和B2B技术存在系统封闭、耦合度高、扩展性差、无法和上下游企业的系统建立统一的接口等问题。
而采用SOA技术则可以有效解决上述问题。面向服务的体系结构(SOA)是一个组建模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口联系起来。由于SOA基于HTTP/SOAP/WSDL等开放式技术,对于特定厂商产品依赖性小,系统开放,互操作性强,可以建立统一的Web服务,用于和不同的上下游企业信息系统实现供应链协同。
本设计的目标是通过Web Service技术,根据需求通过网络对松耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性并且通过Web Service技术可以实现数据库共享。基本思路为:模拟建立Soa System和Get Service两个网站,在网站Soa System中,是通过建立自己的数据库,并把相关信息的数据保存在该数据库中。而网站Get Service并不像网站Soa System那样建立数据库来保存数据,该网站只是通过网站Soa System所提供的Web Service数据库共享接口,就可以对数据库实现查询操作了。这样,网站Get Service就省去了构建数据库和收集资料的工作,从而体现了SOA这种框架不仅有着降低客户端压力的优势,而且有利于不同的上下游企业信息系统实现供应链协同。
2 系统开发环境
本设计是采用ASP.Net(C#)、ADO.Net、Web Service技术开发的。
C#是由C和C++衍生出来的面向对象的编程语言。用C#编写的程序能最大限度地和任何支持.NET的语言互相交换信息,C#编写的应用程序具有强大的跨平台性,这种跨平台性也包括了C#程序的客户端可以运行在不同类型的客户端上[2]。
Microsoft.NET是Microsoft XML Web Service平台。XML Web Service允许应用程序通过Internet进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。.NET除具有良好的兼容性,还具有更快的运行效率、简易的程序设计模型、良好的延展性和可使用性。ADO.NET是一个全新的数据访问技术[3],主要驻留在.NET Frameworks System.Data.*和System.Xma命名空间中,提供更有效率的数据存取。
Web Service是一种可以接收从Internet或者Intranet上的其他系统中传递过来的请求,轻量级的独立的通讯技术。其工作原理是:通过松耦合这个特性将所有服务联系起来实现系统之间的整合与协同。
3 系统设计
3.1 系统功能概述
本系统主要是模拟SOA架构的一个Web系统,SOA是一种比较新的Web技术,其目的是为了整合和协同上下游企业之间的业务。比如:如果两个原先做不同产品的企业想合作做某些产品,A企业想在自己的网站上为用户提供B企业的产品信息,同时B企业也想在自己的网站上为用户提供A企业的产品信息,这时如果采用SOA架构,在A企业和B企业自己的网站后台各建立一个Web Service数据库共享接口,这样A企业和B企业都可以通过Web Service接口相互查到对方企业的产品信息,省去了构建数据库和收集资料的工作,这样不仅大大提高了工作效益也提高了经济效益。
为了模拟SOA这种技术,在这个系统中建立了Soa System和Ger Service两个互相独立的网站。其中,Soa System网站主要为用户提供新闻信息、交通信息、图书信息等信息的查询操作。用户可以根据不同的查询条件对所需要的信息进行查询,系统提供了精确查询和模糊查询。同时系统还提供了管理员操作功能,管理员从管理界面登录后可对各功能模块进行信息的添加、修改、删除等操作,一般用户无法对此进行操作,因为管理员页面都对用户权限进行了核对,如果没有管理权限则会跳到报错页面并提示您没有管理权限。
Ger Service网站也为用户提供了一些服务,主要的服务包括:城市公交车信息查询、火车时刻查询、邮政编码及区号查询和全国车牌信息查询等,这些服务在网站Soa System中也同样向用户提供。但在网站GetService中并没有建立自己的数据库去收集提供服务所需的数据信息;只是通过网站Soa System提供的Web Service接口,来对网站Soa System的数据库进行查询操作,可以直接把查询的结果反馈给用户查询或者在查询结果的基础上进行二次查询操作。而这一切,对用户而言,是透明的。Ger Service网站上的用户会以为自己是直接查询该站的数据库而得到反馈结果的。系统的流程图如图1所示[4]:
3.2 Soa System网站各功能模块
(1)新闻信息模块。该模块主要是对新闻信息进行管理和查询,用户可以根据标题、内容来查询所需要的新闻信息。
(2)图书信息模块。该模块主要为用户提供图书信息的查询,用户可以根据书名、作者、出版社来查询自己所需要的信息;也可以根据分类来检索信息。
(3)交通信息模块。该模块中的信息主要包括:城市公交车信息、城市汽车信息、火车时刻表、飞机航班信息。用户可对以上信息按车次或班次、站点、城市及站站进行查询,所得结果会在Data Grid控件中显示给用户。
(4)学校信息模块。该模块主要提供了学校信息检索和管理,用户可以根据学校名称、学校代码检索自己所需要的信息,也可以通过学校分类来检索信息。
(5)天气预报信息模块。该模块主要提供了天气和气候两种信息的查询,该查询是模糊查询,用户可以输入关键字对所需信息进行检索或不输入任何信息检索所有。
(6)邮编区号车牌信息模块。该模块主要为用户提供全国各地邮编区号、简称来检索自己所需要的信息。例如,可以通过邮编来检索区号或者通过区号来检索邮编。
(7)旅游信息模块。该模块主要包括三个部分,即酒店信息、景点信息、旅行社信息。用户可根据名称、城市对以上信息进行检索。
3.3 Get Service网站各功能模块
(1)城市公交车信息查询模块。该模块主要为用户提供城市公交车信息的查询服务,用户在输入查询条件后进行查找,后台便通过Web Service接口读取Soa System网站的数据库中的数据,把符合条件的数据放到数据集中,并显示在Data Grid控件中供用户查看。
(2)火车时刻信息查询模块。该模块主要为用户提供火车时刻信息的查询服务,用户在输入查询条件后,后台便通过Web Service接口读取Soa System网站的数据库中的数据,把符合条件的数据读取出来,并填充到Data Grid控件中供用户查看。
(3)全国车牌信息查询模块。该模块主要为用户提供全国车牌信息的查询服务,用户在输入查询条件后,后台便通过Web Service接口读取Soa System网站的数据库中的数据,把符合条件的数据读取出来,并填充到Data Grid控件中供用户查看。
(4)邮政编号及区号信息查询模块。该模块主要为用户提供邮政编号及区号信息查询服务,用户可以根据城市来查找,也可以通过邮编来查找区号或通过区号查找邮编。用户在输入查询条件后,后台便通过Web Service接口读取Soa System网站的数据库中的数据,把符合条件的数据读取出来,并填充到Data Grid控件中供用户查看。
4 详细设计
4.1 Soa System网站功能设计
Soa System网站主要向用户提供新闻信息、图书信息、交通信息、天气预报等信息的查询功能;面向网站的管理员,可以在后台提供对信息进行添加、修改、删除等编辑操作。现以“交通信息模块”为例,说明查询功能和数据编辑功能的实现。
其中,公交车信息查询关键代码[5]如下:
4.2 Get Service网站功能设计
Get Service网站主要向用户提供城市公交车信息、火车时刻、全国车牌信息、邮政编号及区号等信息的查询功能;Ger Service网站没有自己的数据库,只是利用Web Service接口,读取Soa System网站数据库中的数据,再把数据呈现给用户。现以“全国车牌信息查询模块”为例,说明查询功能和反馈数据功能的实现[6]。
“全国车牌信息查询模块”主要为用户提供全国车牌信息的查询服务,用户在输入查询条件后,后台通过Web Service接口读取Soa System网站数据库中的数据,把符合条件的数据读取出来填充到Data Grid控件中供用户查看。其中,按地区查询“全国车牌信息”的关键代码如下:
5 系统测试
5.1 测试Soa System网站
Soa System网站测试项目包括:
(1)交通信息模块:测试添加城市公交车信息功能,包括路线号、站点名称、城市、头班车和末班车时间和票价等内容的输入,进行合理性和合法性检查,测试修改和删除公交车信息功能。
(2)旅游信息模块:测试添加酒店住房信息功能,包括酒店名称、地址、省份、城市、订房电话的输入,进行合理性和合法性检查,测试修改和删除酒店住房信息功能。
(3)全国车牌信息模块:测试添加车牌信息功能,包括省份、城市、车牌简称等信息的输入,进行合理性和合法性检查,测试修改和删除车牌信息功能。
5.2 测试Get Service网站
Get Service网站测试项目包括:
(1)城市公交车信息查询。测试信息查询功能,在条件输入框中输入查询条件后按“查找”,界面中显示符合条件的数据。
(2)邮政编号及区号信息查询。测试信息查询功能,在条件输入框中输入查询条件后按“查找”,界面中显示符合条件的数据。
5.3 系统测试结果
通过对两个网站的五个功能模块的测试,得知各模块功能都能正常使用,对用户的操作能够做出相应的判断,对非法操作或者输入错误都会有相应错误提示,满足用户的使用要求,本系统基本上达到本次设计的目标要求。
6 结束语
这次设计是开发一个基于SOA服务程序设计的系统,最后实现了在网站Get Service中在没有建立自己的数据库的前提下,通过Web Service共享接口来查询网站Soa System的数据库,从而为用户提供交通信息、天气预报、邮编区号及车牌信息等信息的查询功能,基本实现本次设计的目标。
参考文献
[1]潭浩强.C语言程序设计(第二版)[M].北京:清华大学出版社,1999.
[2]Jack Lunn.DRPG Sarang编著.张哲锋,庞太刚译.Java开发人员.NET高级编程——C#编程篇[M].北京:清华大学出版社,2005.
[3]张青,郭亚萍编著.C#编程思想与实践[M].冶金工业出版社,2002.
[4]章立民编著.用实例学ASP.NET(使用C#与ADO.NET)[M].北京:电子工业出版社,2005.
[5]谭桂华,魏亮编著.Visual C#高级编程范例[M].北京:清华大学出版社,2004.
程序结构论文 篇10
《循环结构》案例是广东省佛山市高中信息技术课程校本化研究活动之“计算思维的培养”的一节公开课。教材内容取材于广东教育出版社的高二信息技术(选修1)算法与程序设计第二章第4节第一课时,并结合石门高级中学机器人校本课程进行设计,学时为1课时。《循环结构》一课将STEM教学理念融入课堂。STEM教育理念源于美国,其代表科学(Science)、技术(Technology)、工程(Engineering)、数学(Mathematics)融合,旨在培养具有创新能力的复合型人才,同时在教学过程中有意识地向学生渗透计算思维,即利用计算机解决问题的思维和方法。
●学情分析
本节之前学生已学习了程序的顺序和分支结构,对机器人仿真编程软件的使用基本熟悉。这节课较之顺序、分支结构有一定的难度。由于只上了几节程序基础课,大部分学生用代码编写程序的能力较弱。为了提高学生的学习积极性,降低难度,笔者对循环结构这一章节采用循序渐进的方法。首先用流程图的编程模式进行教学,暂时忽略具体代码,关注算法本质,希望让学生更容易接受和体验学习编程的成就感。高中生信息技术水平差异化非常突出,教师要兼顾到各个层次的学生。教师设计不同难度的编程任务,让学生们都能在课堂上“吃饱”。教师在课件上提供丰富的学习资源以供他们进一步学习,如提供自主学习的微视频导学材料等。
●教学目标
知识与技能目标:认识循环结构的概念、作用、分类及其在编程中的广泛应用。掌握循环结构中的多次循环(固定次数循环)、永远循环(死循环)和条件循环的区别和应用。学会综合利用循环结合顺序和分支三大结构编写机器人行走等一系列的应用问题。
过程与方法目标:能通过类比的方法去应用循环结构编写程序。能正确运用循环结构去解决机器人行走等一系列应用问题。初步体验自顶向下、逐步求精、模块化程序设计解决问题的过程和方法。
情感态度与价值观目标:通过程序设计过程,培养学生严谨细致的科学精神。培养学生编程兴趣。
●教学重点、难点
重点:循环结构中条件循环的执行流程及编程应用。
难点:循环结构的灵活应用。
●整体思路
本课先是从学生感兴趣的机器人问题出发,教师演示灭火机器人灭火和扫地机器人回家充电的情境。然后,教师提出问题:机器人是如何搜索到火源和充电器的?从而激发学生探究问题的兴趣。接着,教师以问题解决的教学模式,将循环结构的知识,按照“什么是循环结构——为什么要用循环结构——循环结构分类——循环结构应用”一步一步地循渐推进。教学中采用案例教学,贴近学生生活实际,如机器人叫醒程序“闻光起叫”、机器人灭火程序等,让学生体验完成机器人编程项目的成功感。
●教学过程
1.创设问题情境,引入新课
教师播放两段视频,一是我校学生在美国参加国际中学生机器人灭火比赛获得冠军的比赛视频;二是家庭扫地机器人扫完地回家充电的视频。学生看后既感到新鲜又充满疑惑。例如,灭火机器人它是如何自动搜索到火源的?扫地机器人是如何找到充电器的?教师引导学生分析,机器人是由程序驱动的,灭火机器人在找到火源前,它不停地重复行走以搜索火源目标;而扫地机器人快没电了,在找到充电器前,它都在不停地重复行走以搜索充电器目标。因此,看似它们在做不同的任务,但程序本质是一样的,即在一定的条件下,重复执行行走和搜索目标的动作。而描述这种重复的算法步骤的程序结构,就是这节课要学的内容——循环结构。
设计意图:机器人问题情境让学生倍感新鲜,富有时代感。机器人的各种走路算法是一个个灵活应用循环结构编程的典型案例。通过机器人仿真编程环境,驱动机器人按学生的意图做出各种反应,呈现效果生动形象,更能吸引学生学习程序的兴趣。
2.循环结构概念
教师讲解循环结构的概念,描述重复执行某段算法的程序结构。它和顺序、分支结构一起组成程序的三大类型结构。教师讲解循环结构的执行流程。
学生聆听并理解循环结构的概念,阅读流程图掌握循环结构的执行流程,回答教师提出的问题。
设计意图:让学生储备循环结构的知识为后续编程解决问题夯实基础。用流程图的方法讲解循环结构执行流程。通过对比教学法,让学生理解循环与分支、顺序结构的区别。
3.循环结构作用与分类
教师通过分别用循环结构和顺序结构实现机器人走正方形的两个程序的对比演示,引导学生归纳循环结构的作用,它可以极大地减少程序重复书写的工作量。
学生对比分别用顺序结构和循环结构编程实现机器人走正方形的例子,感悟采用循环结构的优势。
设计意图:通过对比实验,形成简练和繁冗的强烈反差,让学生感悟循环结构的优点。
4.循环结构的应用
(1)多次循环
教师讲解多次循环的概念和使用方法,布置机器人走正六边形的编程练习任务。
学生计算走正六边形转弯的角度(如图1),动手编写和调试程序。学生总结并掌握多次循环结构的编程方法。
设计意图:机器人走正六边形轨迹的程序是走正方形程序的进阶,需要灵活求解转弯的角度,也通过任务的稍微改变考察学生知识的迁移和应用能力,有一定的难度梯度,符合学生认知和能力发展规律。同时,这里也给学生设置了一个惯性思维陷阱,很多学生误认为机器人转弯角度是内角,其实是内角的补角。
(2)永远循环
教师演示机器人不停发出叫声并眨眼睛的编程例子的实现方法。
学生观看演示,掌握永远循环结构的编程方法。
设计意图:这个编程例子为下面完成的“闻光起叫”机器人叫人起床程序作铺垫。由相对容易理解的永远循环知识点过渡到下面难度相对高的条件循环知识点,学生知识的迁移和能力的提高,符合其心理认知发展规律。
(3)条件循环
教师讲解条件循环的概念和应用场景,布置学生练习机器人“闻光起叫”编程。
教师巡回指导学生,检查学生学习成果。
学生两人分组协作动手编写和调试程序,上交作业。学生观看同学演示。学生归纳掌握条件循环结构的编程方法。
设计意图:机器人“闻光起叫”让学生和“闻鸡起舞”相联系,觉得幽默有趣,学习热情高涨。该环节是本课的重点难点所在,因为条件循环的循环体是否执行涉及循环条件表达式是否成立的问题。在实际教学中,笔者发现学生往往会忽略循环条件变量是否改变的问题。学生的整体算法思路没错,但循环体里面常常忘记给循环变量进行重新赋值,以致循环条件在程序执行自始至终都是原来的初值,导致变成死循环或者没有执行循环体的错误。因此,本环节教师先不提醒学生,采用在他们动手实践的时候,允许部分学生犯错,然后通过他们运行程序发现问题,这个时候,再引导学生寻找和分析问题的根源。从犯错中得到经验教训,从而深刻体会到循环条件编程的关键点,也就更好地突破了循环条件应用的教学难点。
5.解决问题——机器人搜索火源问题
教师采用自顶向下、逐步求精模块化的编程方法引导学生获得解决问题的算法,布置练习任务,让学生自主探索机器人搜索火源的算法。教师检查学生学习成果,让学生用游戏表演的方式展示机器人搜索火源的行走算法。
教师展示仿真环境的程序测试效果。
学生阅读课件获得解决问题的算法,观看同学表演机器人行走算法,加深理解。
学生完善教师提供的半成品程序,调试程序和仿真环境测试,提交作业。
设计意图:水到渠成,综合利用本节课的知识点,解决新课导入的问题。让学生学以致用,体验学习成功感。通过游戏模拟机器人行走,加深学生对机器人搜索火源的“S”形行走算法的理解。
6.回顾和拓展
(1)回顾梳理
教师课堂小结,回顾本节课学习过程,引导学生总结循环结构的知识点。教师引导学生回顾自顶向下,逐步求精模块化的编程方法。师生一起浏览网络课件学习社区中学生提出的典型疑难问题并进行解答。
(2)拓展提升
教师简单介绍循环结构在其他编程领域中的应用,引导学有余力的学生课外阅读拓展材料,激励学生进一步学习程序设计和机器人知识。
设计意图:通过网络课件,及时搜集和解答学生的疑难问题,提高课堂的互动性。开拓学有余力的学生的视野,让各层次的学生都能“吃饱”。通过课堂小结和评价,让学生获得进一步的感悟和提升。
●教学评价
为了获得学生对本课的学习效果的评估数据,课件设计了学生学习自我评价反馈环节(如图2)。让学生学完这节课后,对自己的学习行为进行自我评估,同时也让学生对教师的教学提出改进建议。对学生提交的数据进行分析,可以侧面地了解学生哪个知识点还没有掌握,从而改进教学环节。教师争取从学生的反馈获得改进建议,形成民主的教学氛围,从而更好地达到教学目标和突破本节课的重点和难点。
●教学反思
这节程序设计课的教学内容和编程案例与机器人应用教学的一些内容进行了整合,旨在利用循环结构解决机器人的一些应用问题,可以说是程序设计和机器人编程应用教学的一堂整合课。在教学过程中,教学设计是有意识地向学生渗透学科思维例如计算思维的培养,试图将STEM教育理念引入课堂,将其融合在一起。具体体现在每个应用机器人的编程小项目对学生来说本身就是一个个需要完成的小工程(E);机器人走正六边形转弯角度的求解就是数学(M)思维的训练;还有机器人应用亮度传感器测试环境光的亮度是电子技术(T)的应用等;而最为重要的是在程序解决问题的过程中,向学生有意识渗透了自顶向下、逐步求精、模块化的编程思想。整堂课,学生整体参与度较高,能完成课堂编程任务。但是,也有不足之处,如限于场地和经费,没能给学生提供真实的机器人编程体验等。
点评
这节课是广东省佛山市高中信息技术课程校本化研究系列研讨活动之“计算思维的培养”的一节示范课。本节课基于STEM(科学、技术、工程、数学融合)教学理念设计,将学校的机器人特色课程和《算法与程序设计》模块的教学相结合,在教学内容的表现形式方面有很大的创新。课堂上,利用机器人仿真平台,通过图像化、形象化的界面让学生建构循环结构的概念,掌握循环结构几种表现形式。学生体验了利用循环结构驱动机器人灭火的过程,体会利用循环结构解决重复问题的思路。紧扣住教研活动的主题——“培养计算思维,提升利用计算机解决问题的能力”。
程序结构论文 篇11
关键词:JC法,MATLAB,GUI
1 JC法基本原理
JC法的解题思路是将非正态随机变量作当量正态化处理[1,2],将其转化为等效的正态随机变量,用结构在设计验算点处的切平面代替极限状态曲面,然后利用改进的一次二阶矩法求解可靠度指标。
设结构功能函数可表示为
选择失效界面上的点P*(x1*,x2*,…,xn*)为线性化点,由于假设P*点在失效界面上,它满足极限状态方程,即f*(x1*,x2*,…,xn*)=0,这时
其中
根据可靠度系数β的定义,有
由式(5)可得
满足这个方程的设计验算点为
下面是两条当量正态化的条件:
1)在设计验算点xi*处,当量正态随机变量XiN(其平均值为μXiN,标准差为σXiN)的分布函数值GXiN(xi)与非正态随机变量Xi(其平均值为μXi,标准差为σXi)的分布函数FXi(xi*)相等;
2)在设计验算点处,当量正态随机变量XiN的概率密度函数gXiN(xi)与非正态随机变量Xi的概率密度函数fXi(xi*)相等。如图1所示。
由条件1)和2)可以得到当量正态分布的平均值μXi*和σXiN标准差。
2用MATLAB实现JC法在结构可靠度中的计算
2.1 MATLAB的简介
MATLAB是由美国MathWorks公司于1984年推出的一套高性能的数学计算和可视化软件,它是一种功能极其强大的科学和工程计算数学软件系统,汇集了大量数学、统计、科学和工程所需的函数。MAT-LAB的一个重要特色就是有一套程序扩展系统和一组称之为工具箱(toolboxes)的特殊应用子程序,多达40多个面向不同领域而扩展的工具箱支持,每一个工具箱都是为某一类学科专业和应用而定制的,工具箱是MATLAB函数的子程序库。与Fortran、C等编程语言相比,MATLAB具有编程语法简单、用户界面友善、矩阵运算功能强等特点,易为广大工程技术人员所掌握,可以大大提高编程效率。
2.2编程求解
如果将可靠度计算方法比作一个结构,搭建这个结构需要大量基本构件,这里指一些常规计算方法,那么,只要选用MATLAB的命令和函数作为结构的标准构件,就能凭借其高效精确的算法实现复杂结构,而且结构的可靠性也是很高的。图2是JC法程序框图[3]。
按照图2所示的计算流程编写成MATLAB模块[4,5]:
MATLAB7.0引进了fig文件来保存GUI的布局,用M文件进行GUI编程,使GUI设计变得简单、快捷[6]。
在MATLAB7.0命令窗口下,输入guide命令或者利用文件菜单中的new选项下的GUI,即可以进入GUI设计窗口。从窗口的左侧工具栏中选取需要的控件,绘制在右侧雏形窗口;双击各控件图标,即打开该控件属性对话框,对其进行属性设置。最好为每个控件设置一个标签,即设置Tag属性,且标签值是唯一的,以便在自动生成的m文件中编程时能容易快速地找到其句柄。
保存图形界面时,系统将自动生成一个同名的m文件,打开此程序文件,对图形界面各控件的回调函数Callback()增加所需的程序代码,以完成各种操作。
3算例
本程序开发主要考虑结构抗力、工作荷载效应和风荷载效应。程序计算分为单值可靠指标的计算和批量可靠指标的计算。
取文献[7]中一组数据进行验算,抗力R服从对数正态分布,永久荷载效应S服从正态分布,L服从极值Ⅰ型分布,其均值和变异系数分别R=319.52,VR=0.17;S=53.0,Vs=0.07;L=70.0,VL=0.29。输入程序后计算结果β=3.69546。程序计算界面如图3所示。
对于批量数据的计算,MATLAB可以通过xlsread函数从EXCEL表中读取所需的应力值。通过实际的资料统计可以得到结构抗力、工作载荷以及风载荷的变异系数,可以在程序中直接定义好,也可以设计可视化的界面手动输入。点击“导入EXCEL数据”按钮将有关数据代入可靠性计算程序进行计算。
Android通过设置类的AdapterView.OnItemClickListener成员到一个监听者并捕捉用户的操作事件,来处理用户的操作具体代码如下:
//创建一个消息句柄
//映射事件操作,并设置监听器
4结论
Android手机应用程序开发需要涉及它的整个体系结构,是一项复杂的工程。本文介绍了Android框架的层次结构,并在此基础上给出了Android用户界面设计的原理与设计过程。Android平台具有极大的开放性和兼容性,并且本身大量使用开源代码库,为开发人员提供了一个非常便捷的开发环境。关于Android平台和J2ME平台程序移植以及运行效率方面将是一个进一步研究的方向。
参考文献
[1]赵国藩.工程结构可靠性原理与应用[M].大连:大连理工大学出版社,1996.
[2]贡金鑫.工程结构可靠度计算方法[M].大连:大连理工大学出版社,2003.
[3]喻全余.用改进的一次二阶矩法求应力—强度系统的可靠度系数[J].机械设计,1997(12):36-38.
[4]李志华,张光海,康海贵.基于Matlab优化工具箱的工程结构可靠度计算[J].四川建筑科学研究,2005,31(3):1-4.
[5]张明.结构可靠度分析—方法与程序[M].北京:科学出版社,2009.
[6]亨塞尔曼.利特菲尔德.精通Matlab7[M].北京:清华大学出版社,2006.
【程序结构论文】推荐阅读:
模块结构程序11-23
程序逻辑结构设计09-18
循环结构程序设计心得11-28
C语言实验报告《逻辑结构程序设计》05-14
《visual basic 6.0程序设计》选择结构教案06-18
§8-3程序的多条件多分支结构——DOCASE语句说课材料06-15
程序知识论文07-12
程序背景论文08-21
辅助程序论文08-24
程序质量论文09-29