第一篇:程序设计语言教学与专业应用
一、前言
C++是一门实践性很强、极富创造性特点的课程,项目驱动方式,确实能够更好的将教学重点从老师单纯地教语法知识点,到学生主动地参与到编程和学的过程中。但是目前的项目驱动方式仍存有问题,例如,项目的题目学生不感兴趣,学生认为一些项目和他们的关系不大,甚至认为C++的学习对专业应用没有用,从而导致有些组完成的项目不理想。鉴于此,本文提出将C++程序设计语言的教学与专业应用相结合,让学生充分认识到C++程序设计语言是解决专业问题的一种重要工具。
二、C++程序设计语言与专业知识的关系
C++程序设计语言与专业知识是密切相关的,它为后续相关课程的学习提供了基础,为解决专业问题提供了一种有效的工具,同时专业常识可以辅助学生在C++语言学习中加深对概念的理解。1.C++程序设计语言为解决专业问题提供了一种工具。C++程序设计语言工具的作用主要表现在它能解决一些专业问题,例如,机械工程专业和自动化专业的单片机设计课程,单片机功能的实现离不开编程,while、for循环语句及不带参数函数十分常用;或是金融专业中投资组合优化,为了得到最优的投资方式,根据数据得到投资组合模型,采用C++编写投资组合模型,从而通过计算机分析出最优的投资方式;或是化学专业中,为了分析两种分子结构的相似度,从而寻找最大公共子图。众所周知,最大公共子图问题是NP完全问题,靠人力分析太慢,可以应用C++编程,让计算机代替求解;或是医学专业中,研究新药的开发,分析新药在小白鼠上的反应得到的数据需要分析,分析过程中设计到拟合算法和精度分析等,用C++编程会大大简化实验员的工作量。尽管C++程序设计语言对于专业的学习十分重要,但是专业课老师反映多数学生对于C++程序设计语言的掌握不牢固,即使当时得分很高的学生,也不能顺利而高效地设计出算法。原因之一是学生学习计算机语言的时候只是专注于语法的学习,而不专注于程序语法背后的语义、以及语义背后的深层思维、深层思维背后的对象模型的学习,而且计算机程序语言的教学脱离了应用,不能让学生真正体会到计算机编程语言是一种工具。2.专业常识辅助C++程序设计语言中抽象概念的理解。C++程序设计语言中的一些概念是比较抽象的,例如类的概念,学生刚开始学习的时候不能很好地掌握类的概念,也不能明确地区别类和对象,而专业常识可以辅助抽象概念的理解。例如,机械专业中螺母可以看成一个类,这个类有规格、牙距、最大外径、高度等属性。有一个规格是2.5,牙距0.45mm,最大外径6.4mm,高度2mm的六角螺母,这个螺母就对应于对象,从而向学生们解释了类和对象是抽象和具体的关系,同时机械专业的学生也知道了螺母的属性有哪些。因此,专业知识和C++程序设计语言是相辅相成的,可以将这两者结合起来,从而达到让学生们增加对C++程序设计语言的兴趣,同时也对专业知识有所了解,深刻理解C++程序设计语言对于专业学习是一个重要工具。
三、C++程序语言与专业知识的结合
既然专业知识和C++语言之间相辅相成,在教学活动中应将两者结合,从而使学生对C++学习提高兴趣,同时也了解了专业知识。两者之间的结合点主要表现在教学过程中概念的讲解和项目的选取。1.概念的讲解。C++的概念相对于C比较多,为了让学生能更好地掌握这些概念,可以结合具体事例,尤其是专业相关的实例。例如:类的继承性是面向对象编程的一个重要性质,在讲解继承性的时候,可以结合专业背景知识来说明继承性的好处;机械专业中,零件的设计过程中设计新零件是基于旧的零件的基础上改进,可以看成新零件继承了旧零件的特征,而添加了一些新特征,从而省去了大量重复的工作,C++的继承性同样具有这种优点。C++的继承性是指在一个基类上定义了一个派生类,派生类继承了基类所有属性和操作,同时增加了其他新的属性和操作,这些新属性和操作是基类不具备的。这样就可将专业常识和类的继承性结合起来,有助于C++概念的理解。2.与专业背景有关的项目。项目驱动教学方式使得学生主动地参与到编程的学习过程中,但是项目的选取十分重要,如果应用背景学生不了解,使其对于项目的完成形成一定的障碍,因此项目的选取与专业应用相结合有助于学生了解项目的要求,提升对项目的兴趣。目前,很多高校采用拟合算法的实现作为一个典型项目,但是单纯地讲拟合算法,没有专业应用背景,学生觉得很枯燥,可以将拟合算法和专业背景结合起来,比如面向机械专业的学生,可以以逆向工程为例。教师在介绍项目的时候可以简单介绍一下逆向工程的技术背景。逆向工程是一种能根据现有的物理部件通过CAD、CAM、CAE或其他软件构筑3D虚拟模型的方法。逆向工程的过程采用了通过丈量实际物体的尺寸并将其制作成3D模型的方法,真实的对象可以通过如CMMs、激光扫描仪、结构光源转换仪或者X射线断层成像这些3D扫描技术进行尺寸测量。这些测量数据通常被认作是点集,缺乏拓扑信息,并且通常会被制作成更有用的格式,例如多边形网格、NURBS曲线或者CAD模型。由此,学生知道逆向工程的定义、内容和过程,而拟合算法是逆向工程中常用的一种方法。介绍项目时,将逆向工程的实际问题进行简化,比如实现一个旋转面的三维数据点,并重构出这个旋转面,并给出旋转面的母线和旋转轴。面向医学专业学生,可以以实验数据分析为例,例如放射后细胞存活的实验,教师先介绍一些放射治疗的背景、效用和副作用等,并指出细胞存活实验的重要性。介绍细胞存活实验的实验,通过实验得到一组数据,并通过C++程序设计语言,得到放射后细胞存活量的变化曲线图。由上面可知,同样一个算法,在不同的专业中应用是不一样的,如果在说明拟合算法时,向机械专业学生介绍放射后细胞存活的实验,或是向医学专业的学生介绍逆向工程,他们更加难理解项目,项目的完成效果也不佳,因此项目的选取应与专业应用结合。
四、结论
将计算机程序语言的教学与专业相结合,让学生了解自己的专业是什么,计算机程序语言能解决什么样的专业问题。计算机编程语言一般是大一、二的基础课,很多新生都不了解自己的专业究竟做什么,因此,这种结合更有助于学生尽早了解自己的专业,也有助于他们将C++程序设计语言应用于专业的学习和实际问题解决中。
作者:罗晨 单位:东南大学 机械工程学院
第二篇:C 语言程序设计教学中应用
1知识可视化的内涵
当个体看到某个符号出现时,会同时呈现视觉影像与语言编码两套系统,并且同时以视觉形式和语言形式呈现信息能够增强记忆和识别.因此,将知识以可视化的手段表示出来,可以把复杂化、抽象化的知识构建为图解,把抽象化的知识转换成形象化的知识.这样学生在学习抽象化知识的过程中可以得到形象化的支持,能为基于语言文字的表征提供补充,从而降低了学习的难度,增强了个体的理解能力,提高了学习的效率[3].C语言从本质上说是抽象符号的表征,它是由一系列规则和约定组成的符号系统.学习C语言实际上是学习对按照一定规则执行的符号系统的运用,而C语言程序设计就是运用这些符号系统表示问题解决的方案.知识可视化在《C语言程序设计》教学中的应用主要就是解决以下两方面的问题:?什么样的知识需要可视化??如何进行可视化?
2知识可视化在实际教学中的应用
2.1利用可视化技术将真实问题与程序学习结合起来学生在学习《C语言程序设计》这门课程的过程中往往存在这样一个疑问:“我们学习C语言到底为什么?C语言编写出的程序能帮助我们解决什么实际问题”,这个问题的解答直接关系到学生的学习兴趣.因此,我们在教学中可以选取与学生学习、生活紧密联系的实例,并通过图片或动画的方式呈现出来,使真实世界典型的实例成为C语言程序教学的工具,搭建出真实世界与C语言程序设计之间的桥梁,使学生能快速地将现实生活中已有的经验转化到C语言程序设计学习中,能够更好地把握相关概念[4].例如:教师在讲解《C语言程序设计》中的if语句时,先选取现实生活中需要根据条件做出选择的实例(例如学生最关心的某门课程是否要补考),通过图片或动画的方式呈现给学生,并通过教师的语言解释将if语句的核心———条件判断的概念总结出来,这样学生就很容易理解if语句的语义及相关语法规则.2.2利用可视化技术加强C语言符号的表征能力《C语言程序设计》这门课程的教授对象是大一的新生,绝大多数学生毫无程序设计的基础,他们在学习C语言的过程中,对于C语言中的许多符号的意义只是停留在强制记忆阶段,并没有真正去理解符号所代表的含义.因此,在实际编写程序的过程中,经常错误使用符号,造成程序无法正确执行.通过知识可视化技术将学生“看不见”的计算机内部变量的存储方式模拟出来,学生就能比较容易的借助可视化的图形和图像建立起正确的感念模型[5].例如:教师在讲解《C语言程序设计》中整型数组的定义时,可以先给出数组的定义方式:类型说明符数组名[常量表达式],及实例inta[5].此时,学生只是知道了一维整型数据的定义方式,并没有真正了解数组在计算机中存储.我们可以通过图表的方式将抽象的计算机内存表示出来,如图1所示:学生通过图表可以很直观的看到一维整型数组在内存中的分配情况,清楚地知道数组元素按照下标从小到大占用的是一段连续的内存空间,从而掌握如何正确地给数组元素赋初值及避免数组元素下标越界的问题.2.3利用生活化的语言、图形再造学生的算法想象力《C语言程序设计》这门课程中有较多的经典算法,但教材中对于算法的描述绝大多数都采用书面化的语言,学生光靠阅读文字难以理解算法的核心思想.例如:教师在讲授“选择法”排序算法时,可以先给出算法的相关介绍:?对有n个数的序列(存放在数组a[n]中),从中选出最小的数,和a[0]交换位置;?除a[0]外,其余n-1个数中选最小的数,和a[2]交换位置;?依次类推,选择了n-1次后,这个数列已按升序排列.此时,学生恐怕根本无法真正理解该算法的含义,更无法根据算法写出相应的程序代码.我们可以通过图表及动画的方式将算法演示给学生看,并在演示的过程中,通过教师生活化的语言引导学生思考、执行算法.第一步:将待排序数组通过图表的方式显示,如图2所示:第三步:通过动画演示如何将最小的数与数组的第一个元素的值互换位置,同时教师通过语言解释“选择法”的核心———选择相应的数据放到相应的位置,如图4所示:一般经过前面三个步骤,学生已经能够理解“选择法”的核心思想,教师可以引导学生通过语言的方式将该算法执行完成,从而使学生把枯燥的算法介绍转化为了内在的知识.
3教学效果分析
笔者于2011-2012学年度第二学期和2012-2013学年度第二学期分别教授了11级(合班)与12级(合班)的《C语言程序设计》,其中针对12级(合班)的教学较为广泛的运用了知识可视化相关技术.据问卷调查结果显示:两个班级的学生在学习本门课程之前均未接触过任何有关C语言程序设计的相关知识,只通过课堂学习C语言程序设计的相关知识.假设:两个班级的学生在学习之前对C语言程序设计相关知识的理解能力在同一水平,将11级(合班,未广泛运用知识可视化技术)期末考试成绩作为前测成绩,将12级(合班,已广泛运用知识可视化技术)期末考试成绩作为后测成绩,利用SPSS软件将前后成绩进行T值检验,得出如表1的所示结果:分析表1、2中数据可以得出以下结论:?SIG值为0.000小于0.05,说明两个班级的成绩差异较显著;?从平均分看,12级成绩的均值比11级成绩的均值高出2.7345,说明知识可视化技术对于提升学生学习成绩有显著作用;?12级班级的标准差比11级班级班小,说明将知识可视化融入教学中更利于全体学生的均衡发展.因此在《C语言程序设计》课程教学中通过应用知识可视化教学策略是有效的,能够促进学生本门课程学习成绩的提高.
4小结
《C语言程序设计》所教授的内容看似枯燥、死板,在设计的教学中,需要教师精心设计教学内容,并将知识可视化融入到其中,就能将教学内容生动化、动态化,从而达到较好的教学效果.当然,各种知识可视化的技术和策略都有其一定的优势和局限,在今后的教学中,仍需要我们不断的积极探索,使其在教学中发挥更好的作用.
作者:廖雁 黄爱琳 王丽丽 单位:赣南师范学院 数学与计算机科学学院
第三篇:递归和递推算法在程序设计应用
1实例分析
1.1使用递归法求阶乘使用表达式1的思路,将第一个因子提出来,之后的因子可以整个理解为(n-1)!即:n!=n*(n-1)!其中(n-1)!=(n-1)*(n-2)!依次递推,直到当n为1或者0时,结果为1。使用C语言编程,定义函数,其算法设计如下:longfun(intn)//拟定问题规模参数,以自然数n为界定{if(n==0||n==1)returnl;//边界的确定,即终止条件为0或1elsereturnn*fun(n一1);//重点:递归体,通过//参数的递减,调用自身来实现}上述算法通过分支结构实现了求自然数n的阶乘,简单明了。其最后一行,在调用函数fun(n)的过程中通过改变参数,调用自身fun(n一1),这样在一个子函数的定义中直接或间接地调用该子函数本身,定义为递归。由此可见,使用递归算法能使程序结构清晰,具有良好的可读性。分析递归算法的基本思想是问题的分解,即从规模和难易程度上把大问题(自然数n的阶乘)转变成同一个概念的较小问题(自然数n-1的阶乘),再把较小的问题又变成规模更小的问题(自然数n-2的阶乘),并且小到一定程度可以直接得出它的解(1或者0的阶乘是零),从而得到原来问题的解。利用递归算法求解问题,应该对问题从以下3个方面进行分析:(1)决定问题规模的参数,如自然数n。(2)问题的边界条件及边界值(又叫结束条件或出口),如0或1。(3)解决问题的通式(又叫递归体),如n*fun(n一1),这是解决递归问题的难点。其实只要理清楚递归的思想,包括递归的定义和执行过程,再灵活根据实际情况运用它来进行编程就容易了,而且往往几条简短的递归调用语句就能解决用其他方法难甚至无法解决的问题,其收效的确是非常奇妙和高效的。由此可见递归是一种编程思想,是一种把原始问题的复杂程度和规模进一步降低后再求解的过程,这个定义本身就具有“递归性”。递归算法会把原始问题的向未知拨开“一层”,进而越来越接近已知,并且此时递归算法并没有算出一个中间量(注意此处与递推的区别),在递归深度达到最大的时候,即达到已知条件———洋葱的最里层,此时再反之,将已知条件作为上一层的已知,一层一层地向上返回,最后未知也就是原始问题就这样被求解出来了。因此,递归是从未知到已知的算法进栈再从已知到求解问题的双向过程。1.2使用递推法求阶乘使用表达式2的思路,算法设计如下:longfun(intn){longresult=l;inti;for(i=l;i<=n;i++)result=result*i;returnresult;}由此可见递推也是一种算法思想,它是从已知条件出发,用一种具体实现的算法,一步一步接近未知问题,一般采用循环(for或者while语句)结构。递推算法在求解的过程中,每一个中间量都是计算出来了,而且没有出现重复计算,运算简洁,但是对于编程人员来说,书写和理解代码存在一定难度。递推方法采用的是自底向上的方式产生计算序列,即首先计算规模最小的子问题的解,然后在此基础上依次计算规模较大的子问题的解,直到最后产生原问题的解。由于求解过程中每一步新产生的结果总是直接以前面已有的计算结果为基础,而避免了许多重复的计算。因此递推算法直接从已知到原始求解问题的单向过程,相比递归算法具有更高的效率。
2递归和递推算法的区别和联系
通过上述的分析可以发现,递归是双向过程,是利用子问题与父问题的关系,进而构造成有递归性的函数,无中间计算量产生,而递推恰恰与此相反,递推是单向过程,有中间计算量的产生,是从已知到未知,类似于一般解数学题的思路。从已知与未知的顺序上来看,它们好像仅仅是逆过程,但其实不然。递归算法是把问题简单化,抓的是原问题与子问题的联系,而递推算法则是把中间解推进,抓得是中间计算量与更靠近未知的中间计算量的联系,两者截然不同。递归和递推之所以难以理解,容易混淆,有个主要的原因在于递归法包括“递推”和“回归”这两部分,其中“递推”:(1)将原问题转化成新问题。(2)新问题的解法与原问题一样,但求解过程比原问题简单些。(3)不断将问题转化成更简单的新问题。直到最后的新问题有明确的答案。(4)有明确终止递归条件。而“回归”:指当简单问题得到解后,回归到原问题的解上来。
3结语
递归算法重在“归”,需要求解的问题是什么,就直接去求什么,不用中间的计算,至于怎么去调用、怎么去求,让函数自己通过反复调用自身一步步去实现;递推重在“推”,和平时做数学方法一样,一步步地通过求中间量来达到问题的求解。显然编程时递归比较特殊,具体表现在函数的自我调用,这样编程代码简短,可读性好,但效率低,尤其是递归层次比较多时。而递推一般用简单的循环实现,虽然程序难理解,但可靠性高。一般来说,递归程序都可以用循环程序实现。
作者:庾佳 单位:苏州健雄职业技术学院