开篇:润墨网以专业的文秘视角,为您筛选了八篇c语言范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
忙碌了一个多星期,在大家的共同努力下,我们总算将此程序设计出来。尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。
另外平时扎实的基础也很关键,因为如果你平时学得就不怎么样,那么你面对这么一个比较有难度的程序,你可能会望而却步,看他人的程序都是个难点,更别说让你自己去设计。为了解决此。类问题,最好就是多向同学,老师请教,不要怕难为情。
C语言课程设计和现代计算机技术的实际应用相结合,是我们在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从开始的算法思路到运行调试后的美观的图形界面以及另人兴奋的可用程序,都是一个很好的学习和锻炼的过程。使我们巩固了原有的理论知识,培养了我们灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力。使我们体会到自身知识和能力能在实际中的应用和发挥。不但可以激发创新意识,还可以开发创造能力、培养沟通能力。这次实习时间虽然仅有一个星期,但确实使我受益非浅。通过实习我丰富了计算机操作经验,更加深了对C语言的了解,熟悉了其环境,更增强了对Turbo C的使用技巧。
这次实训有很大的收获,让我对C语言有了更深的认识,平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。如果是一个程序写完一处错误也没有,会有种成就感,于是兴趣就来了,兴趣来了,自然学的东西也就多了,能把理论变成实际的技能,让我对C语言有了浓厚的兴趣和更深层的认识。
C语言是一个有序的学习,学了最基本的替换,然后扩展到循环,嵌套,条理很清楚,不是一个零散的知识,实际上所有的课程都如此,不过通过实训我也知道了自己的不足,存在的很多问题。
比如自己写的写的小程序出了问题,不会解决了就叫老师帮忙,虽然说一定意义上增加了师生之间的感情,但是会养成一种依赖的心理,碰到问题了第一个想到的是求助而不是自己独立解决,所以以后要多多锻炼自己的信心和增加自己的能力,争取做到老师不在身边的时候也可以完成一些简单的程序编写与错误排除。
还有自己的基础知识不扎实,遇到的问题,没有很好的逻辑思维,亲自编写一个陌生的程序的时候会有种无法下手的感觉,找不到突破口。通过实训,逐渐理清了顺序,对于简单的程序和一些相对比较繁琐的嵌套,循环,不在是看着一头雾水。其实只要理清了思路,把基础知识掌握了,然后有条不紊的分析,一步一步理解,C语言还是很有意思的课程。
自己亲自动手编写程序让我增加了对C语言程序开发环境的了解,在上课的时候老师就讲,学习C语言最重要的是学习C语言的逻辑思维,不管以后从事什么行业,学习C语言都对自己的职业很有帮助,如果是从事编程工程工作的话,就更有帮助了,即使以后的编程工作可能不用C语言,但是拥有扎实的C语言基础是对工作很有用的。
考研有四门课:数学、英语、政治、专业课,如果不是计算机专业的,不需要考C语言。
C语言:是一门通用计算机编程语言,应用广泛,C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器以及超级电脑等作业平台。
(来源:文章屋网 )
【关键词】指针;情景创设;主动探索;协作学习;游戏案例导入
一、引言
指针是C语言中广泛使用的一种数据类型,运用指针编程是C语言最主要的风格之一。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多于1个的值;并能像汇编语言一样处理内存地址,从而变出精练而高效的程序等,这对设计系统软件是很必要的。掌握指针的应用,可以使程序简洁、紧凑、高效。指针极大地丰富了C语言的功能。每一个学习和使用C语言的人,都应当深入地学习和掌握指针。可以说,不掌握指针就是没有掌握C语言的精华。
二、教学现状
高职学生的基础普遍较差,数学与英语基础较为薄弱,在碰到程序逻辑思维分析,程序代码编写及调试的过程中,往往会感到困难,这是高职C语言课程教学中的共性问题。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是学生是否掌握C语言的一个标志。同时,指针也是C语言中最为困难的一部分,学生很难正确理解基本概念,就指针的教学谈谈自己的想法。
三、教学方法
1、情景创设教学法。课堂教学是获取知识和技能的主要阵地,应当成为培养学生独立思考的摇篮。情景创设教学方法把学习设置到简单的、有意义的问题情境中,学生通过互相合作来解决这些问题,发现隐含于问题背后的科学知识,形成让学生掌握解决问题的技能和提高自主学习的能力。例如,讲解指针的基本概念,计算机中的所有数据都是顺序存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同数据类型的值所占用的内存单元数亦不同。为了正确地访问这些内存单元。内存单元的编号也叫地址,通常也把这个地址称为指针。内存单元的指针和内存单元的内容是两个不同的概念。为让学生掌握并理解内存单元的指针和内存单元的内容,我采用了情景创设的教学方法。我们到银行去存、取款时,银行工作人员将根据我们的账号去查找存款单,找到之后在存单上写入存款、取款的金额。在这里,账号就是存单的指针,存款数就是存单的内容。这样就能让学生明白内存单元的指针和内存单元的内容之间的关系了。
2、主动探索、协作学习教学法。根据已有信息,从不同角度、不同方向思考问题,从多方面寻求多样性答案的一种思维形式,是主动探索的教学方法。为走出传统教学中的泥滩,教师应转变教学观念,砸碎应试教育的模式和框架,克服单纯传授知识的倾向,注重顺向思维、逆向思维、多向思维的训练,培养学生思维的深刻性、批判性和创新性。具体来讲,就是要通过挖掘教材中能一题多解、一法多用、一题多变的教学内容,来引导学生主动探索,使他们的思考朝多种方向扩散,提出各种设想、多种解答。在指针教学中还可以进行协作学习中培养学生们的思维。协作学习是在解题中,尽可能利用自己已有的知识和经验与同学一起讨论,将不同的方法进行比较,从中确定出最佳方案。在教学中,引导学生从不同方向利用其他学科的理论,开阔思路,找出解决问题的多种方法。然后在众多的解法中,经过归纳、判断和比较,最终得出一个最优化的结论。比如在教学生如何通过指针引用数组元素,先请学生协作学习开阔思路用不同方法编写“输出数组中的全部元素”程序。
方法一:下标法
方法二:通过数组名计算数组元素地址,找出元素的值
方法三:用指针变量指向数组元素
通过该教学方法,这个知识点学生掌握得很好,找出解决问题的多种方法,能深刻地、高水平地掌握知识,并能把这些知识广泛应用到学习新知识的过程中,举一反三,提高了对知识的理解能力,使学习活动顺利进行。
3、游戏案例导入教学法
在指针教学中通过游戏案例导入教学法可以营造学生独立思考的心理氛围。在分析指向多维数组的指针和指针变量中的“多维数组的地址”知识点,我先请同学做游戏,一个当“排长”,三个当“班长”,十二个当“战士”,游戏是:有一个排,下设3个班,每个班有4名战士。规定排长只管理到班,班长管理战士。在排长眼里只有第0、1、2班。排长从第0班的起始位置走到第1班的起始位置,看来只走了一步,但实际上他跳过了4名战士。为了找到某一班内某一个战士,必须给两个参数,即第i班第j个战士,先找到第i班,然后由该班班长在本班范围内找第j个战士。这个战士的位置就是a[i]+i.。开始时班长面对第0个战士。注意,排长和班长的初始位置是相同的。但他们的“指向”是不同的。排长“指向”班,他走一步就跳过1个班,而班长“指向”战士,走一步只是指向下一个战士。可以看到排长是“宏观管理”,只管班,班长则是“微观管理”,管理到战士。如果要找第1班第2个战士,则先由排长找到第1班的班长,然后,由班长在本班范围内找到第2个战士。二维数组a相当于排长,每一行(即一维数组a[0]、a[1]、a[2])相当于班长,每一行中的元素(如a[1][2])相当于战士。
请同学们打开书,仔细看插图,边看边想:谁是排长?班长在哪儿?管多少个战士?
这段游戏导入把贯穿全文的线索用三个问题串起来,让学生从静态的图中找答案,思考、讨论结果。这一过程学生的思维也是最活跃的,对问题的思考是深入而全方位的,这些问题激发了学生们的心理驱动力,在讨论争议中,让学生迸发出创新思维的火花。
关键词: C语言;指针;应用
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2013)0120059-02
1 C语言指针重要性
指针是C语言中最重要的概念之一,运用好指针不就能够很方便灵活的处理好复杂的程序的设计,依靠指针的特性能够完成其他高级语言所无法完成的功能,在有些场合运用指针的灵活性是解决问题的唯一方式。如目前很多远程攻击都利用内存的缓冲区溢出来攻击,C语言本身特点不进行变量边界检测,人为介入检查,不仅工作量加大,同时很容易犯错,而所采取的检测库函数,同时也是安全漏洞,在这种情况下,利用指针分析,它可以本质上在C语言程序编译过程中,完成对程序的静态分析,完成对程序的变量边界检查,这种方式只有指针能够完成。指针同时在程序切片调试、自动化硬件技术有着广泛的应用。
同时指针也是最难掌握的一部份内容,指针的难以理解和应用中潜在危险,如应用指针不小心,也会使得整个程序奔溃。所以,指针在C语言占有非常重要的位置,在C语言的程序设计中应用非常广泛。
2 指针在C语言中应用
实际上,指针为变量地址,用于存储地址,程序设计在跟数据类型定义变量,同时为其分配一定大小的存储空间,同时建立变量名与地址空间关联。而指针变量简称指针,它是一种特殊的变量。它的特殊性在于:首先系统为变量,其所存储的内容为地址,而不是常用变量所存储的地址,它只能是整数值,具有一定的含义和运算规则所形成的整型。其次指针的类型指的不是存储数值的类型,而是指针变量的类型。在C语言中,指针的类包括整型、字符型、实型、数组型、结构型、联合型和枚举型等构造类型,它还可以指向函数、文件和指针。
程序开发人员,在使用C语言的指针时要特别的谨慎,因为如果指针被赋以错误的值,可能无法察觉问题,同时对于系统可能造成很大的影响。程序在调用每次错误的指针时,都会对错误指针所对应的存储单元进行读写。程序中的读操作,只能得到无用或者无效的值;程序中的写操作,所输入的数据将存入未知的地方,这类情况的发生,将使得使程序出现错误,开发人员无法找到错误所在,因此使用指针必须谨慎,建立相应的判别的条件,防止错误无法巡查。
下面就C语言程序设计中指针使用过程中遇到的特殊问题进行分析并对解决策略进行详细阐述。
1)其中指针初始化问题,指针初始化相比其他的变量不同,指针是用来存储地址。所以指针初始化形如:
jnt n=1;
jnt * str=&b;
而不能形如:jnt *str=1,由于str为指针,上面str所获得的值不是地址,而是将一个具体的值赋予指针,所以指针指向哪里,就不清楚,这种错误,很容易造成不易察觉的程序BUG。
2)指针与数组问题,指针和数组存在很紧密的联系,这是C语言构造比较神奇的地方,通过如下的例子了解指针与数组的关系。
jnt j,b[]={1,4,5,6,7,1};
for (j=0;j
{
prjntf ( “%d”, b[j] );
如上例子,b[j]是显示b 数组的各元素值。同样也可以指针访问元素,如下
jnt j,b[]={1,4,5,6,7,1};
for (j=0;j
{
prjntf (“%d”,*(b+j) );
}
如上例子运行结果和作用跟上面的数组的完全一样,所以可知指针str=*(b+j);
在看例子来分析数组名与指针变量的关系。
jnt j,*pb,b[]={3,4,5,6,7};
pb =b;
for (j=0;j
{
prjntf ( “%d”, *pb );
pb++ ; //注意这里,指针值被修改
}
这段代码也是将数组各元素值输出。不过,如果把{}中的pb改成b。程序编译出错,不能成功。可知指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针常量。指针pb在整个循环中,其值是不断递增的,即指针值被修改了。数组名是指针常量,其值是不能修改的,因此不能类似这样操作:b++。而指针pb的值是终没有改变。所以变量指针pb与数组名b可以互换。
3)指针与函数
C语言规定函数的参数传送有两种:值传递和地址值传递,其中实参变量对形参变量的数据传递是值传递,即单向传递只由实参传给形参,而不能由形参传回来给实参,但采用指针变量作为函数参数,可以改变所指向的变量的值,指针作为参数传递为地址传递。不过要注意只有在被调用的函数中指针形参所指向的变量值发生变化函数调用后在主调函数中才能使用这些改变了的值。若在被调用的函数中指针形参的值不发生变化。则不能改变指针实参所指向的主调函数中变量的值。
vojd fjnd1(chbr [] brrby, chbr sebrch, chbr * pb)
{
jnt j;
for (j=0;*(brrby+j)!=0;j++)
{
jf (*(brrby+j)==sebrch)
{
pb=brrby+j
brebk;
}
else jf (*(brrby+j)==0)
{
pb=0;
brebk;
}
}
}
如上例是传送的地址,所以在函数内地址进行改变,对应的指也进行了改变,而跟值传送的方式正好相反。一般在函数的参数应用中,利用指针进行地址传送是最普遍的方式,并且能够保持数据的一致性。
3 深析指针
指针为C语言难点,如果理解不深,很容易造成错误。一旦造成了错误,也无法容易找出来。此节将对指针容易出现问题,进行分析。
1)指针分配不一定成功,若不进行事前判断处理,容易造成错误。对于程序开发者容易犯这样的错误,其实通malloc()等函数动态分配空间时,不一定能成功。还有如打开文件时,也应该判断一下是否打开成功了,以防给程序带来不必要的麻烦。在程序设计上,在动态分配空间后,先应该判断是否分配成功,要养成这种程序设计习惯。
2)通过指针赋值,可能导致内存的数据丢失。在程序设计过程中,容易把指针b=“123”理解成是把字符串赋到分配的空间中了,其实这样理解是错误的。语句指针b=“123”,是把静态存储区的字符串的首地址赋给b指针变量,这样使得p指针又指向其它位置(字符串的首地址),不再指向刚才分配的新空间。所以在进行程序设计时,要理清楚函数赋值的真正含义。
3)在数组中使用指针及指针函数容易出现的问题。对于组i`nt b[3],其中p指针可以指向数组中任何一个元素,但是对于二维数组而言,情况就比较复杂,也不容易理解。二维数组中数组名b代表第0行的地址,b[0]才代表第0行第0列的地址(这才是二维数组元素的地址)所以不能使得p=b,但可以这样赋值p=b[0];或p=&b[0][0];这里尽管b和b[0]的值是相等的,但意义不同。大部分初学者对这一部分的学是比较含糊,下面我们以一种新的思路来理解。
4)使用指针,容易使人以为传送值,产生内存值变化。程序中的指针使用,特别是函数调用的过程,使用指针作为参数传送时,由于所传送是指针,实际上为地址,所以当函数中地址中的值进行修改时候,实际上内存的值也改变,若程序员不注意,很容易造成数据丢失,时间长了,会造成系统奔溃。
5)使用指针,很容易使得释放内存在使用。如果程序中没有释放内存的语句。PC的内存空间是一定的,当多次分配内存空间而没有及时释放不用的空间,这部分空间将被认为丢失,不能再被分配,所以很容易造成内存分配完而无法继续分配的情况,这时就造成系统奔溃。所以在新增新空间之后,一定要注意对内存的释放,这样很容易造成内存混乱
4 总结
本文对C语言的指针部分进行详细的分析和介绍,特别是对于使用指针过程中遇到的问题进行深入的分析。指针部分在C语言的体系是非常的重要的,其所应用的领域和范围很广,还有很多使用技巧,难点还需要慢慢分析和总结。
参考文献:
[1]魏扬,C语言中的指针[J].电脑编程技巧与维护,2008(17).
[2]韩雨涝,C语言指针与数组关系研究及应用[J].福建电脑,2009(07).
[3]丁春芳,浅析c语言中指针作函数参数[J].科学大众(科学教育),2010(03).
[4]张颖,C语言中数组与指针的使用技巧[J].信息通信,2009(04).
[5]李芳菊,蒋建.C++语言中指针的妙用[J].中国科技信息,2009(01).
实验五 指针
一、 实验目的
1、掌握指针的概念、会定义和使用指针变量
2、掌握指向数组的指针变量
3、掌握字符串指针的使用
二、 实验内容
1、 输入3个字符串,按由小到大的顺序输出。(习题10.2)
2、 写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。(习题10.6)
3、 完善程序,要求使用函数功能:将一个数字字符串转换成一个整数(不得调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。
#include
#include
long fun(char *p)
{
填写程序
}
void main()
{
char s[6];
long n;
printf("Enter a string:n");
gets(s);
n=fun(s);
printf("%ldn",n);
}
一、 三、 实验步骤与过程
关键词:面向对象的程序设计;内存分配;封装;STL;多线程技术;软件工程
现代操作系统的诞生和发展与C语言是密不可分的,因此C语言是非常重要的程序设计语言。C++在C的基础上增加了面向对象的概念,从而具备了现代编程语言的一切特征。C和C++是密不可分的,在计算机软件领域,提到C或者C++时,实际上都是指C/C++。对于计算机及信息类专业的学生,甚或对计算机软件从业人员,C/C++无疑占据着无可替代的核心位置。和C/C++语言本身的重要性相比,目前大多数高校的C/C++课程设置和教学内容却相对落后,这和教材建设滞后相关,也和教材编著者缺少应用实践经验有很大关系。
程序设计是一门实践性非常强的课程,因此整个教学环节应该以应用为导向,以上机实验为手段,不断强化和巩固各种基本概念和核心技术,才能培养出能胜任实际工作的合格毕业生,让学生在走向工作岗位的第一天就具备很强的竞争力。
现在,计算机和网络已经非常普及,这为教学提供了极为方便的实践手段,与其他专业相比具有天然的优越性。然而,也正因为计算机和网络的普及,竞争也变得异常激烈,仅仅掌握一点基础知识,满足于完成课本作业,已无法适应当前的就业形势。如何在激烈的就业竞争中胜出,是每个大学生从入学第一天起就必须正视和严肃面对的问题,也是每个高校教育工作者需要不断思考和探索的重大课题。
1以C++为重点,强调面向对象的程序设计思想
目前,大多数高校信息类专业将C和C++作为
两门课程分开教学,并且主要以C语言为主,C++甚至成为选修课程。这一方面是出于课时划分的需要,另一方面也和当前流行的教材相关。这样的划分虽然秉承了C语言和C++语言的发展历程,却忽略了现实需求。现代程序设计以对象为基本概念,以面向对象的设计为核心思想。面向对象的程序设计应该是程序设计的起点和基本要求,没有对象这个概念,软件设计无从谈起。
但是和Java等纯面向对象的编程语言不同的是,C++语言一开始就继承或者说兼容了C语言的几乎全部特征。因此,它并不是一个纯面向对象的程序设计语言,这大大增加了它的复杂性。必须强调的是,C++语言的复杂性虽然增加了学生学习的难度,但是正因为它兼容了C语言的语法特征,使其具备了直接操作内存的能力,从而成为开发系统级软件和大型软件的不二选择,其重要性也是其他语言不能比拟的。掌握了C/C++,就等于拥有了通向软件设计领域的金钥匙。另一方面,所有的程序设计语言都是相通的,掌握了功能强大、既能接近系统底层又具有高级语言全部特征的C/C++程序设计语言,再学习其他高级语言就会轻车熟路。
合理分配C和C++的教学时间,将重点转向C++,是一个艰难但重要的选择。这需要好的教材,也需要好的教学计划。C和C++是分不开的,不应该将其割裂开,要从起点就强调面向对象的概念。
在教材内容设置上,可以分为基础篇和高级篇,这样既利于学生循序渐进,也利于学时划分。基础篇应包括C和C++的基本概念和语法,如基本数据类型、指针、函数、类的基本概念,对象的生命周期、对象的内存映射等。高级篇应包括类的高级特征和复杂应用,并以最新的C++标准为基础,培养学生解决复杂和实际问题的能力。如何合理划分教学内容,需要不断地探索。高级篇的内容可以集中教学,也可以作为其他课程的实践部分进行。
2以内存分配和管理为核心,强化专业训练
由于具备了直接操作内存的能力,C/C++语言的功能变得十分强大,复杂性也大大增强。内存概念应该是编程学习和实践的核心,是教学与实践的重中之重。和内存相关的主要概念有:指针、引用、数组、结构、对象生命期、栈、堆、函数参数传递等。
现实中使用某软件时,经常会遇到“程序崩溃”现象。这几乎都是由于不当的内存访问引起的,其本质原因是程序中存在严重的逻辑错误。在编译时,编译者不一定能够及时发现这些错误,但在运行时,当错误逻辑被触发时,很有可能造成内存混乱,从而引起非法地址访问,进而导致程序崩溃。这种错误比一般的业务逻辑错误导致的计算结果不正确等问题更隐蔽、更致命。一个专业的程序员,必须在编写代码阶段就保证代码的高质量,不应该等出现问题再进行查找和排除。因此,在整个程序设计教学中,必须加强内存概念的理解,并不断地训练和巩固。
每个变量所代表的对象,无论是基本数据类型还是复杂对象,运行时都需要实例化,都需要占用内存。内存是何时分配的?分配了多少?何时释放?栈内存和堆内存的区别是什么?对象生命周期的本质是什么?函数调用的本质是什么?参数是如何传递的?函数返回值的本质是什么?这些问题在当前的教学中常常被忽略,而实际上,它们是每个合格的程序员必须深刻理解和准确回答出的问题。因为不理解这些概念,就不可能编写出正确高效的代码,设计出来的程序也一定是存在隐患甚至是错误百出的。在教学中,应该加强培养学生在这方面的专业素养。
3强调程序结构和高效封装,为职业级开发作准备
简单来说,程序的流程无非顺序、分支、循环三种。任何复杂、大型的程序,也是这些基本流程组成的。但是,编写程序时如何划分结构,合理地编写函数,做到代码的复用,用以上几种简单流程组合出一个结构清晰而又效率很高的程序,是考验编程者水平的关键,也是任何编程语言开发程序员都要面临的问题。不过,由于C/C++语言大多用于大型软件以及系统级软件的开发,强调程序结构的重要性显得更为迫切和必要。
编写程序就如同建筑师设计摩天大楼一样,既需要严谨的结构,也需要艺术性的加工。好的程序代码,阅读起来就像欣赏艺术品,给人美的享受。而劣质的程序,完全看不出编写者的思路,混乱复杂,这样的程序即使能够正确执行,也没有任何生命力。
现代编程技术强调的是高效性和可读性的结合。在不影响总体效率的情形下,以结构清晰、高可读性为第一要素,而强调封装正是这一要求的具体体现。所谓封装,有两个层次,一是函数的封装,二是对象的封装。函数封装主要是指将某个单一功能封装在一个函数内部。合理的函数功能定义有利于写出结构清晰的程序,有利于代码的复用,而将不相关的代码一股脑儿堆在一起,写出超大函数,则是函数封装的大忌。对象的封装就更重要了,这是面向对象程序设计中的核心问题。对象概念要定义清晰、明确,成员函数要功能单一,除非有充足的理由,所有成员变量都应设为私有,对象和外界打交道的唯一途径就是公共成员函数。封装对程序的维护至关重要,是现代程序设计的第一要素。
4掌握STL,理解和使用核心数据结构
标准模板库(Standard Template Library, STL)早已成为C++的标准。在商业软件开发中,它们是每个程序员都要时刻使用和深度掌握的,重要性不言而喻。
在数据结构课程中,学生会接触到栈、队列、链表、集合、映射、树、哈希表等常见数据结构。理解和掌握这些概念,对于简化程序设计,提高程序效率,程序的标准化、模块化设计至关重要。
大多数教材会将C/C++作为教学语言,来讲解这些基本的数据结构。自己动手编写简单的代码并实现,有利于概念的理解和掌握。但在商业开发中,必须使用成熟的已成为C++标准的STL,作为这些数据结构的标准实现。要掌握和使用STL,首先要深度理解模板技术。模板技术是编程技术发展过程中的一次革命,它的出现极大地提高了代码的复用程度,同时保持了程序的效率。它和面向对象的技术相辅相成,类似而又不同,掌握好这两项技术就迈进了C++编程的核心领地。
5重视高级概念
目前,多核技术得到了普通应用,互联网早已普及到千家万户。在软件开发中,开发人员必须掌握多线程技术和网络技术,因此教师要着力加大这方面的教学,使学生的知识技能水平跟上时代的步伐。
多线程技术属于编程中的高级领域,对开发者要求较高。要掌握好多线程技术,必须有扎实的基本功,要深刻理解同步、事件等重要概念。在教学上,教师可结合操作系统等课程进行教学。
网络编程涉及到的知识也比较多,教师可配合计算机网络等进行教学。以前,这一领域显得比较高深,随着网络的普及,学生对许多概念都有感性的认识,在此基础上进行专业训练,已没有太多难度。
另外,数据库操作也是软件开发中必备的技术,教师可以结合数据库课程展开教学。
除了以上几点,和平台相关的一些技术,如Windows平台下的窗口、消息、注册表等技术,以及类Unix平台下的进程管理、进程间通信、文件系统等,也是非常重要的。对这些高级技术的学习不能仅停留在语言层面,要进一步熟练掌握,这对于立志进入软件开发行业的学生非常重要。
6重视职业接轨,强调软件工程
开发软件,不仅仅是写代码。写代码仅是其中的一个环节。一个完整的产品或项目开发过程,都要经历需求分析、方案设计、代码编写、系统测试、产品部署、产品维护等各个环节。要加强在各个环节的训练,提高职业素养,学生才能在就业竞争中占得先机,才能在工作岗位上快速进入状态。
这些训练可以安排在高年级,特别是毕业设计阶段来实施。教师要锻炼学生用学到的知识和技能解决实际问题的能力,要提高学生分析问题的能力,提高其综合设计水平。要训练和提高学生使用集成开发环境的能力、编译调试程序的能力、书写规范文档的能力、团队合作开发的能力。通过这些系统的训练,学生就基本完成了从学业到职业的接轨。
7结语
C/C++语言在计算机相关专业的教学中占据着及其重要的地位,在学生的就业技能储备中更是排在了十分优先的位置。因此,C/C++语言教学必须紧密结合实际,针对企业对员工知识水平的真实需求,在教学内容及课时分配等环节上进行重大而科学的调整,才可避免教育和就业需求之间的脱节。在教学内容的调整上,参考文献[1]至[4]等提供了十分重要的素材,本文中提到的几个方面则是重中之重。
参考文献:
[1] Scott Meyers. Effective C++中文版[M]. 侯捷,译. 武汉:华中科技大学出版社,2001.
[2] 侯捷. STL源码剖析[M]. 武汉:华中科技大学出版社,2002.
[3] Thomas H Cormen, Charles E Leiserson, Ronakd L Rivest,et al. 算法导论[M]. 潘金贵,顾铁成,李成法,等译. 北京:机械工业出版社,2007.
[4] Cay S. Horstmann,Gary Cornell. 最新Java 2 核心技术[M]. 王建华,董志敏,杨保明,等译. 北京:机械工业出版社,2003.
Research on C/C++ Language Teaching Planning For Information Major
ZHAO Gui-qin
(Technical School, Shanghai Jiao Tong University, Shanghai 201101, China)
[关键词] C++程序设计 编程语言 教学
C++程序设计语言是许多大学计算机等相关专业的核心课程。学好C++语言,对于相关专业的教学实践具有重要意义。C++程序设计语言的一个重要特点是综合性。作为C语言的扩展,它兼有高级程序设计语言的抽象性与低级程序设计语言的高度实现性。C++课程与上至软件开发方法,下至计算机组成与系统结构的许多课程存在紧密的相关性。学好C++不仅需要学习C++的语法、语义,也需要对上述课程中的许多问题有一定程度的认识。
正是因为C++语言综合性强的特点,才使得这门语言比其它许多语言更加难学。简单地向学生灌输各种语法,往往难以取得好的教学效果。必须使学生知其然,且知其所以然。为此,就需要向学生讲述一些C++中相关的其它课程方面的知识。这往往很难做到,一方面,为保证学生能掌握一门编程语言,以为后继课程奠定基础,C++课程必须尽早开设,在此之前,不可能预先开设后期的各种课程;另一方面,这些后续课程并不比C++容易,前期开设未必能取得好的教学效果。
如何在C++语言教学的同时,兼授与之相关的其它课程的内容,使学生真正把握C++的来龙去脉,更深入地理解各种语言现象,是C++教学的主要挑战之一。针对此问题,本文结合作者在教学过程中的一些经验,提出了一种整合化的教学新思路。主要的思想是在讲授C++的过程中,通过抽象、简化的方式,简明扼要地兼授其它课程中的相关内容,以方便学生对于C++的理解。
本文后继部分首先分析了C++程序设计语言与其它课程的关系,然后以此为依据提出了我们的教学新思路,并总结了全文。
一、C++课程与相关课程的关系
作为一种能够同时支持高层应用开发与底层系统开发的编程语言,C++中直接或间接的体现了计算机软硬件领域的许多概念。本章初步分析了与C++相关的课程,讨论了其中哪些内容与C++课程是紧密相关的,后续章节将基于此分析,探讨整合化教学的新思路。
与C++紧密相关的首先是硬件相关课程,包括计算机组成原理与系统结构等。组成原理中的存储器结构、数据表示、输入输出实现等对理解C++中包括变量、各种数据类型及其比较转换、输入输出流在内的许多问题有重要意义。系统结构方面,了解冯•诺依曼结构等内容,可以帮助学生更好地理解程序的运行,理解计算机计算的特点。
除了硬件类的课程外,操作系统、编译原理等系统软件相关课程也与C++教学紧密相关。理解操作系统中的进程管理、内存管理、文件管理,可以帮助学生更好地了解程序执行的过程,理解C++语言中的内存分配、文件操作等。而编译原理的相关知识贯穿于C++课程始终。C++中有许多规则看似难以消化,但如果使学生了解编译过程,就能更好地帮助他们理解C++语言中的许多设计选择,使那些看似毫无线索的语法规定,变得理所当然。
再一类与C++相关的课程是偏数学类课程,如离散数学、数据结构、算法分析与设计等。离散数学中的布尔逻辑等是理解C++中许多运算的基础,而集合、图等概念,对于理解C++教学中的许多程序实例,以及学生编程实践都具有重要意义。数据结构中的链表等也往往出现在数组、指针等内容的学习中,不了解基本的数据结构概念,将使这些问题的学习变得困难。算法分析与设计也是一个重要的相关课程。在C++语言的学习中也开始涉及一些基本的算法,如排序、查找等,给学生讲解一些经典的算法设计思想,将能使学生更容易理解相关例子,也便于培养解决问题能力。
与C++相关的重要课程还有程序设计语言原理。对于许多高校,这甚至是研究生阶段才开设的高级课程,但在讲授C++课程时,从更高的抽象层面,简要介绍程序设计语言原理中类型、面向对象、异常等重要概念,可以更好地帮助学生理解C++中的相关语法设施,使之明白C++为什么会这样,不这样将会如何等。
另有一类与C++相关的课程常常被忽略,这类课程包括软件开发方法、面向对象分析与设计等。C++课程一般开设在大学一年级,该阶段的许多学生对编程一无所知。常有些学生,对于给定的编程问题感到无法入手。如果在教C++同时向学生阐述一些软件分析设计方面的技术,就能使学生更快地解决问题。
上述课程与C++课程大多存在循环依赖的问题,理解这些课程需要具有一定的编程基础,学习C++又需要了解一些上述课程的内容。几乎不可能将这些课程开设在C++课程之前,这使得如何在C++学习中处理上述课程相关的内容,成为一大难题。
二、整合化教学
分析C++程序设计语言教学中存在的问题,我们提出了一种整合化教学的新思路,即不是单独讲授C++程序设计语言本身,而是与此同时简明扼要地兼授其它课程的相关内容。
1.在理论教学中强调整合
C++教学的整合,首先体现在理论教学方面。在这方面,我们强调抽象、简化与C++相关的内容进行讲授。对于硬件、系统等方面的课程,它们主要在概念上与C++相关,细节方面相关性相对较弱。因此,授课时主要采用的方式是将相关软硬件结构模型化,在模型层面上讲解计算机的工作方式。以内存、CPU为核心,屏蔽重要程度低的设备,重点探讨程序如何启动、运转、结束,变量在哪、如何操作,函数如何调用等;而不是深入细节,探讨存储器有多少级结构,CPU指令是什么形态等问题。刚开始学习计算机的学生,习惯从数学的角度来思考程序中的函数、赋值等概念,容易将它们与数学里的相关概念混淆。通过展示计算机的体系结构、程序流转的基本原理,可以促进学生尽早入门。当然,在抽象、简化的同时,我们尽可能地保证抽象出来的结构能够兼容后继课程,不至于使学生产生矛盾。
对于偏数学类课程,如数据结构、算法分析与设计等,C++中涉及的相关内容并不多,但这些内容往往非常关键。因此,我们选择对直接相关的内容作较为深入的探讨。比如对于链表,虽然它是数据结构课程的核心内容,但C++课程中频繁涉及此概念,因此,我们将对其作比较深入的展开,学生在理解链表的特点后,在编写与之相关的程序时,明显比之前更得心应手。算法分析与设计虽然不直接与C++课程相关,但C++教材中大量的实例都体现了各种各样的算法思想,特别地,暴力法(brute-force)、分治法、动态规划法常常出现。对此,学生往往能看懂例子,但自己编写程序时,却存在较多困难,通过向学生灌输上述算法的基本思想,对不同例子进行总结归类,学生对上述例子的消化将更加透彻。
编译原理与高级程序设计语言原理课程与C++非常相关,但难度较高,直接讲授,学生一般难以接受。对于这部分内容,我们结合了两种教学方式,一种是体验式教学,主要通过原理阐述,案例分析与感受来理解相关内容。对于函数调用、栈内存等编译原理中非常相关的内容,我们将为相关问题建立一个比较抽象的描述模型,然后据此进行较为深入的讲解。通过这种抽象但仍保持一定深度的讲解,可以给学生以更深刻的印象,避免他们犯错。
软件开发方法、面向对象分析与设计等方面的内容,主要体现在C++教学的案例与实践环节中。这里,我们主要的思路是从软件开发方法中抽象出一些基本的方法、原理,将其在案例分析中阐述给学生,使其尽可能地明白一个程序的编制由来。在理解教材中的案例时,做到先自己设计,再阅读材料,而不是直接读书,不做深入思考,不分析由来。软件开发方法中许多方法主要针对大型工程,看似与C++教学无关。但对于刚涉猎计算机领域的学生,每个小例子,都是大项目。深入地分析设计开发方法,有利于培养学生分析、解决问题的能力。
抽象、简化进行讲授的同时,我们还强调启发教学。要求学生不停留于书本内容,不停留与抽象模型,积极提出问题,利用课余时间丰富对相关模型的理解。
2.在实践教学中强调整合
除了在理论教学中整合,我们还强调同样要在实践过程中进行整合。以往C++上机实践过程中,要求学生编写的都是一些简单的控制台程序,基于与系统无关的一些函数库来实现相关功能。这些案例可以提高学生对书本知识的巩固,但是难以充分调动学生的兴趣,特别是在当今计算机如此普及的形势下。
为提高学生兴趣,我们在实践过程中,适当结合了少量超出C++教学范畴外的内容,向学生提供一些操作系统的编程接口,图形界面库等,教学生编制一些具有美观界面,甚至可以实现多媒体功能的小程序。这些小程序往往并不复杂,教师不讲解,也不强求学生掌握。只提供给学生模仿,并启发一些可以改进的点,学生通过模仿学习,即使不能充分了解背后的知识,也可以极大的提高学习热情。
三、小结
本文针对C++程序设计语言课程的一些特点,提出一种整合化的教学新思路,大部分内容来源于已有的教学实践。新思路在教学过程中取得了较好的效果,特别是对C++相关的许多问题的探讨,能启发学生积极思考,这对于培养创新型人才是有益的。
参考文献:
[1]皮德常.C++程序设计教程[M].北京:机械工业出版社,2009.
[2]B.Stroustrup(裘宗燕译).C++语言的设计和演化[M].北京:机械工业出版社,2001.