c语言编程范文
时间:2023-04-09 13:08:07
导语:如何才能写好一篇c语言编程,这就需要搜集整理更多的资料和文献,欢迎阅读由公务员之家整理的十篇范文,供你借鉴。
篇1
1 C语言的特点和优势
C语言是学习编程语言的基础,它集合了很多语言的特点,我们都知道语言之间是相同的,而C语言能够把很多语言的特点集中起来,有高级语言和低级语言的特点,能够编辑系统软件和应用软件,所以C语言是一个非常重要的语言。要想学好C语言,首先要了解下它的历史,1970年美国AT&T贝尔实验室的Ken Thompson以BCPL语言为基础设计出很简单很接近硬件的B语言,但B语言过于简单,功能有限,继而在1972年―1973年期间美国贝尔实验室D.M在B语言的基础上设计出C语言,所以C语言用起来非常的方便,能够给程序带来自由和便利,这也是很多软件用它的原因之一。在C语言的语法中,运算和程序书写是非常丰富的,在编写程序的过程中能够用到的运算方法有很多,可以实现很多高级程序无法实现的功能,使用起来灵活多样,能实现各种复杂的数据结构的运算。C语言还能够直接的访问物理地址进行各种操作,非常方便的对程序进行控制和编译。
2 学习枯燥乏味之理由
在学习C语言的过程中很多学生对C语言提不起任何的兴趣,导致在上课的时候压力很大,听不进去,甚至无法理解。C语言的功能非常强大,这是我们学习的最基本理由,而且目前C语言的用途很广,收到计算机方向的重视,所以我们也必须对自己要重视起来,大部分同学在学习起来觉得很枯燥,理论的东西很难记住,对C语言的认识也不够深入,所以会造成一个学期学完之后反过来想想,觉得一无所获。那究其缘由为何会出现这样的情况呢?
个人认为首先一个是教学方式上,C语言的理论东西偏多,不能通过一些直接的感官方式给学生,造成学生的理解困难,如果能通过很直观的方式来呈现内容的话效果应该会比较好,比如说多进行上机的操作,让程序能够通过界面的方式反馈出来等等。
其次是在C语言中有很多的算法和结构让很多同学觉得眼花,很多同学只是简单的靠记忆把他记忆下来,这样效果就很低,而且非常枯燥,应该要通过更多的实践练习掌握它们的规律和方法。
最后就是教师在教学上应该要注重教学方法,不能仅仅简单的理论教学和实践教学,应该把学生放在第一位,能够听懂才是关键,否则一堂课下来内容讲完了,学生收不到你的效果。教师在课堂讲解的过程中除了课程教授之外,还要传达C语言在整个计算机学习中的重要性,让学生更加深入的去理解和分析,增强他们的学习兴趣,这个才是关键。
3 编程技巧
同学们之所以学习的非常吃力,觉得C语言很枯燥,归根结底是没有掌握到C语言的学习技巧,其实对于初学者来说觉得学习吃力是正常的,学习任何一门语言都是有一个过程的,关键问题在于你要掌握其精髓的地方,只要掌握了重点一定能够学好语言。对于C语言我们应该要更加注重其编程技巧,接下来就阐述几个比较有用的技巧。
⑴指针掌握。指针的掌握在C语言中是非常重要的,也是C语言中一个非常重要的技巧之一。指针能够在运算的过程中提高速度,让整个编程的语句变得更加简单,不足的地方就是消耗的内存要大点,但是和整个编程语言来说微不足道,如果本身内存就有富裕的话那么就一点问题都没有了,所以同学们在学习这一章的时候一定要加强自我的学习能力,除了老师上课讲的知识之外,可以多去网上找相关资料进行补充,把指针这一章做好学习。
⑵数学知识掌握。数学知识在整个计算机学习的过程中是非常重要的,能够解决C语言中的很多问题,IT界有句话叫“数学是计算机之母”,由此可见数学在计算机学习中的重要地位。同时,在整个C语言的学习中如果能够很好的用到数学思想的话也能够促进学习,在编程之前首先进行分析,通过什么样的算法能够更加简单,这就是数学的一种运用,所以数学知识对学习编程语言非常有作用。
⑶位运算的掌握。使用位运算可以使代码更简洁,效率更高)使问题得到解决。其实在所有的计算机程序中可以说位是最小的数据单位,一般而言所有的运算和操作都可以通过“位运算”来解决,这足见“位”在编程语言中的重要性。在C语言当中去应用能够提高效率,解决更多的问题。
当然不管什么样的技巧,应该具体问题具体分析,上述只是个人的一些看法,总体来说能够提高编程效率,通过让同学们不会感到枯燥,让C语言更加广泛的应用。
4 总结
总的来说,C语言的功能非常强大,所以作为我们学生有责任要把它学好,为今后的就业打下基础。C语言作为高校的一门公共基础课,不仅仅是计算机专业开设了,其他非计算机专业的同学也要进行学习,所以学好C语言能够提高自己的编程效率和对编程语言的理解,对整个计算机语言的学习是非常有作用的。希望通过我的个人拙见,让更多的同学学习C语言,而且能够掌握,培养自己的编程能力,这样才能更好的服务社会。
[参考文献]
[1]李自清.浅谈C语言编程中的常见错误和解决方法[J].科技信息(科学教研),2007(33).
篇2
【关键词】堆栈;缓冲区;函数调用;指针
中图分类号:TP39文献标识码A文章编号1006-0278(2015)09-122-01
C语言是一种面向过程的计算机语言,它的表现能力和处理能力极强,具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行基于bit位的操作。它的编写不依赖计算机硬件的应用程序,又可以编写多种程序。
虽然C语言具备多种优点,但也其存在着不少的缺点。常常会出现很多问题从而导致程序运行错误。循环语句是一个非常好的结构,它可以节省很多代码,使程序代码看起来非常简单。而对于嵌套循环更是非常精妙,能够解决很多问题,但是由于内循环和外循环的退出条件不同,在某种没有考虑到的异常情况下容易导致死循环,从而造成灾难性的后果。因此,对于一个可靠性要求比较高的程序来说,尽可能减少嵌套循环的使用,只要有可能就把它写成几个单独的循环,对于有十足把握的嵌套循环,也不建议使用。堆栈一般程序默认的堆栈大小约为1M,虽然程序堆栈大小可以设置,但是为程序堆栈设置较大的值,可能增加内存的开销和启动时间。因此在程序设计时不盲目的为程序设置很大的堆栈空间。因此对于一个大型程序开发,必须要考虑每个函数的堆栈的使用,对于多线程来说,每个函数尽可能节省有限的堆栈空间。特别忌讳在函数中定义局部变量的大型数组,如果在函数中定义一个局部变量的大型数组,就有可能导致定义的数组覆盖堆栈段或代码段中的数据,从而造成程序的崩溃。为节省有限的堆栈段空间:避免使用局部变量的大型数组;尽量避免用长调用或递归函数;避免传递大型结构体,建议用指针代替;定义短寿命变量(像auto类型)。在熟悉汇编语言的人眼里,C语言编写的程序不值得一提,就像C语言和其它高级语言相比。这种说法虽然有些偏激,但是却有它的道理,因为汇编语言是效率最高的计算机语言。不过汇编语言也有它明显的缺点,它太繁琐,不宜阅读,我们不能用汇编语言来写一个几十万行没有什么人能够读懂代码的程序。所以,为了写一个复杂的大型软件,同时为了获得程序的高效率,我们可以采用变通的方法,在C代码中嵌入汇编,混合编程。这样既提高了效率,又增加了可读性。
上面几种问题是初学者经常遇到的几种典型问题,随着学习的深入,还有一些初学者不易发现的问题也是至关重要的。
一、缓冲区溢出问题
缓冲区用于存放给定类型的数据,是内存的连续块。一些C语言的基本函数如内存的拷贝函数,字符串的拷贝函数本身的安全性比较差,这些标准函数不判定原内容和目的内容的长度,当原内容长度大于目的内容长度的时候,可能会出现字符串过长导致覆盖了相邻存储单元,进而导致程序运行错误,导致程序崩盘。
这种情况可以在编写的代码中检查所有对数组的读/写操作,以确保对数组的操作在正确的范围,但是这样会使程序在性能上受到很大影响。例如strcpy函数经常被用错,进而造成了缓冲区溢出的风险。在执行strcpy函数前,必须保证目标源有足够的空间容纳数据,这个是极为重要的。另外,对源数据存储空间的限制也是一种较好的办法,这不仅会使得应用程序更为有效,而且也降低了缓冲区溢出问题。当然这个函数相对应的安全函数是strncpy函数。但这个函数常见的错误就是在人们对于这个函数的count值计算来源:很多人是用目标缓冲区的字节总数作为count值,而实际上应该是留在缓冲区的字符数目作为count值。
二、指针的使用
C语言的难点和精华就是C语言的指针,指针的种类就有很多,例如:整数指针变量、字符指针变量、指向整数指针的指针、整数数组指针、整数指针数组、指向整数数组指针的指针等。对于初学者来说,还没有看完估计就没有信心了。其实指针也非常简单,别看它的定义很复杂,和普通变量相比,普通变量是用来表示一个数据,每一个数据都存在计算机的地址中;而指针是用来表示一个计算机的地址,对于一个32位程序,所有类型的指针的值都是一个32位整数,它的值是0x0000-0xffff中的一个。只要把指针理解为汇编中的计算机内存地址,应该就能更好的理解指针的功能了。上面这些指针是比较常见的,其实C语言中还有一种“野指针”,我们都知道“野指针”不是NULL指针,是指向“垃圾”内存的指针。“野指针”是很危险的,有时会让人误以为该指针合法,有时候会让程序崩溃。
避免“野指针”的产生要注意这几种情况,例如:指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的;第二种是指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针;第三种情况发生在指针操作超越了变量的作用域范围。
三、系统调用
系统调用就是在用户层和核心层之间的层次与接口。系统调用模块的预先设定,提供了用户与应用程序的核心程序服务。在一般的操作系统中,只有操作系统才能有权访问系统硬件,而用户和程序是无法对设备直接访问。所以需要系统调用来为应用程序提供硬件资源或重要软件资源。
篇3
【关键词】C语言 编程 结构化
1 C语言的编程特点
1.1 C语言的定位
很多人都普遍的认为C语言是在B语言的基础上发展过来的一种高级编程语言。然而从编程语言的层次结构方面来说,我们应该认为C语言,是在汇编语言的基础上发展而来的,它比汇编这类编程语言要高级,但是比一些可视化的编程语言又低级,所以准确来说,C语言应该算是中级编程语言,或者称为准高级程序设计语言。目前很多高级程序设计语言都是在C语言的基础上发展而来的,或者至少借鉴了C语言程序设计的思想。80年代初,Bjarne Stroustrup在贝尔实验室对标准C进行了改进和完善,C++得以诞生,使得面向对象的程序设计思想得以提出和落实;21世纪初,人们将C语言和单片机相结合,开发出来了应用于单片机编程的C51语言,使得单片机的程序设计从反复的汇编语言设计中抽身出来,大大的提高了程序的设计效率。
可见C语言在整个编程语言的发展过程中属于承上启下的作用,同时其自身的应用领域又在不断的更新和发展。
1.2 C语言的编程特点
通过上述C语言的定位可知,它既具备高级程序设计语言的结构性和层次性特点,同时也兼具了低级程序设计语言的实用性。
(1)用相应的C语句可以实现对微机操作中的字节、地址等进行直接访问。
(2)基于函数的结构化特点,使得复杂的软件系统可以由多个人,以设计子函数的形式,分别各自进行程序开发。之后进行函数的汇总,最后由主函数,按照既定的程序流完成对各个子函数的调用就行。
(3)丰富的数据类型,尤其是指针类型,可以很方便的应用于复杂数据和大数据的访问和处理。
(4)由于C语言基本上不向低级语言那样直接涉及到对硬件的操作,所以C语言程序往往具有很好的通用性,方便程序移植。
2 C语言的编程技巧
2.1 扎实基本工
在进行C语言程序设计之前,首先要熟悉运算符、表达式以及各钟类型数据的定义和使用方法,其次对顺序、分支和循环三大程序结构要有较好的把握,并熟练使用while循环、for循环、switch语句等。如果要在程序的设计上有进一步的提高,那就需要对“指针”能够进行熟练的使用了。指针可以用于表示变量,但更多的是用于代表数组、存储地址以及函数地址。在代替不同变量时将返回不同的值,可以说指针的功能十分强大。对其熟练使用有助于程序设计的简洁和便利。
2.2 立足C语言的结构化的特点,熟练程序设计基本构型
C语言典型的特点就是结构化,在进行具体的程序开发时,应该首先要根据设计的软件项目,然后进行任务的细分,由于C语言不需要编程人员去配置硬件资源,因此程序设计人员可以把更多的精力放在各个细分任务的子函数设计上,考虑用最简单的程序结构去实现。在数据类型的选择上,能够用短数据类型就尽量用短数据类型。
另外,为了提高程序代码的执行效率,建议C语言程序设计人员要了解C语言程序最终运行的硬件的基础机构,是在微型计算机上运行,还是在单片机上运行。在了解硬件平台结构及内部资源的前提下进行相应的程序设计,将有助于提升程序的运行效率。
3 C语言的实践应用
3.1 混合编程
很多程序设计人员都认为C语言比汇编语言高级,所以认为没有必要去学习和了解低级语言。其实这种思路是及其错误的。汇编语言之所以称之为低级语言,是因为其更加贴近于硬件。在编程时一定要明确的在代码中描述清楚,数据如何从一个存储单元送入另一个单元,因此显得编程复杂,由于其直接和硬件打交道,所以被称为低级语言。但是其运行效率却是最高的。所以在C语言程序设计上要有质的飞越,有必要了解汇编语言的编程思路和理念。有条件的话可以将C语言和汇编语言混合编程,从而发挥出两类编程语言各自的优点,达到设计程序的最优化。
在进行C语言和汇编语言的混合编程时,无论是采用C语言调用汇编,还是汇编调用C语言,还是C语言嵌入汇编的方式,都应该对调用关系、各模块的连接以及参数的传递进行妥善的处理。对于调用关系,则需要对调用的函数和过程进行说明;通过明确函数和变量的命名以及存储模式的关联性,从而实现各模块的有效连接;通常情况下往往通过堆栈的方式来实现参数的传递。
3.2 C语言在工程上的应用
C语言在电力电气系统、交通控制系统以及机器人控制方面都有广泛的应用。下面以工厂通风控制系统的C语言程序设计为例来加深对C语言软件编程思想的理解。
工厂通风控制程序的设计时采用模块化得设计思想,即单独的编写初始化函数void Initial(void);中断处理函数void**(void)interrupt;数据采集函数unsigned char ADconvert(unsigned char address)以及其它函数等。然后由主程序负责对各个子函数的调用,从而实现对工厂通风系统的控制。简化的主程序如下:
main( ){ ... Initial(void);
while(l){ReadAi( );ADconvert(unsignedchar address);
DataChange( ); DisPlay( ); …}
整个系统由于需要不停的对工厂数据进行采集,所有主程序的结构就设置成了循环结构,当通风控制系统有序的进行准备工作之后,通过调用初始化函数,程序就开始进入主循环,主循环中通过调用采集程序,完成对测量对象的循环检测以及对显示程序,数据处理函数的循环调用。一遍又一遍的不停循环执行主程序。在这个主程序循环的过程中,如果有异常情况发生,则随着中断触发事件的发生,将进入中断响应,实现对中断函数的调用。
4 总结
C语言作为编程语言中经典的一类程序设计语言,因其结构化、可移植化、编程简介的特点,被广泛的应用国民生产的各个领域。而随着信息技术、互联网技术以及物联网技术的飞速发展,未来C语言的应用领域将变得更加广泛。对C语言在软件编程方面的研究和分析将变得更有意义。
参考文献
[1]顾泰龙,李远静.基于C语言的计算机软件编程实验研究[J].软件工程师,2013(08).
[2]李强.计算机软件开发语言的选择探讨[J].电子制作,2013(09).
作者单位
篇4
C语言是一种计算机程序设计语言,是计算机汇编语言的重要组成部分。其实质就是通过对语言进行编写和翻译,使其产生一种与社会相衔接的语言,让人和计算之间通过这种语言能够进行简单的交流。C语言是在1972年由美国贝尔研究所提出,1978年先后被运用到各种机型中。C语言具有双重性,具备高级语言的特点和汇编语言的优越性,不仅能对系统应用程序进行编写,而且能对不依靠计算机硬件的应用程序进行编写。同时C语言也具有广泛的应用性,能在多个计算机的操作系统中运用,大大提高了计算机软件编程的效率。随着计算机的日益普及,C语言的应用领域越来越宽,成为目前较为流行的高级程序设计语言之一,在许多大型的软件编程中被广泛的应用。C语言具有如下的特点:
1.1模块化思想模块化的基本思想就是运用C语言在进行计算机软件编程设计时,按功能作用的不同将一个较大的程序分割成为许多小的子模块,使每个小的子模块成为一个功能单一、理解简单和结构合理的小程序。
1.2简洁性强C语言具有语言简洁、结构紧凑、使用方便、灵活的优势。C语言包含了32个关键字和9条控制语句,源程序书写方式较自由灵活,因此在计算机软件编程中要选择使用小写字母,压缩掉所有不重要的部分。
1.3运算范围广C语言总共具有34种运算符,其运算符号十分丰富且对运输结果能采用各种各样的表达形式,因此C语言的数据处理能力强,可以为各类数据结构进行复杂的运算,进行一些高级语言较难实现的运算功能。
1.4移植泛用性C语言在进行软件编程中基本上不需要做任何的修改,就能运用于各种不同型号的计算机和操作系统环境上,从而形成很多不同版本的C语言。
1.5应用效率高C语言的应用结构简单清晰,能够对内存中的相应地址进行直接的访问,操作十分方便,被称为高级语言中的低级语言。同时能够直接调用系统功能,直接操作硬件,具备许多高级语言所不具备的高效率。
2.C语言在计算机软件编程中的技巧
C语言具有模块化的特点,因此在计算机软件程序编程中,充分发挥C语言的灵活性和方便性,提高软件编程的技巧性,能够优化软件程序编辑和提高软件开发的效率和质量。
2.1变量数据和运算模式的合理设置设置变量数据时,要在最大限度满足计算机软件编程需要的前提下,尽可能合理的设置变量数据,使用无符号的最小数据类型,这样能减少程序代码,从而促进计算机软件编程的有效运行。同时在设置运算模式时,要尽量运用定点运算,避免运用浮点运算。
2.2变量存贮器类型的合理定义在计算机软件编程中,采用和操作不同类型的变量存贮器时,会造成编译后的代码执行效率各不相同,只有合理定义变量存贮器类型,才能不断提高程序的执行效率。因此在定义变量存贮器类型时,应在满足条件的情况下尽量选用内部直接寻址存贮器。
2.3变量存贮类型的灵活设置在计算机软件编程中,C语言具有模块化思想,正确函数变量的传递在编程中十分重要,因此子程序模块使用的变量常采用局部变量,而整个程序模块使用的变量要采用全局变量。另外在C语言中灵活使用指针、结构和联合,也便于数据的传递,提高软件编程的效率。
2.4设计软件编程与C语言的接口C语言具有程序执行速度快和直接操作硬件的优势,在进行数据采集、中断服务器处理和实时控制时,可以将C语言程序运用到计算机软件编程中,自行控制数据的传递,从而能够精确控制任务,加快实时响应。
2.5编译控制指令的正确选择C语言能为计算机的软件编程提供了20多条控制指令,总体可分为首要控制指令和一般控制指令,首要控制指令的选择只能用一次,要放在源程序的开始处,以防止重复而导致停止编译,而一般控制指令的选择可以多次。因此选择正确的控制指令,能加速程序调试过程。
3.C语言在计算机软件编程中的应用
C语言具有很强的优越性,可以适用于计算机软件编程实验研究,这就需要对C语言在计算机软件编程中的应用有一个全面的认识,避免在以后的程序设计过程中出现基础不足的情况。
3.1指针的应用C语言中的指针代表相关变量、相应函数的地址和地址相对应的存储内容。在进行软件编程时,如果一个相应的变量声明前面,出现“*”号,那就表示这个内存地址相对应的存储内容。通常情况下C语言的一个指针代表着一个相应函数的地址,是一个常量。此外,C语言的指针可以在调用函数时得到几个不同于return(z)的返回值。
3.2字符串在C语言中,字符串是一种以ASCII的UNL作为数组退出的一种chair型的数组,在计算机软件编程中,字符串的使用一般不需要引用库。但在C标准库中包含着一些函数可以操作相应的字符串,在使用这些函数时,需要运用相对应的头文件进行引用。
3.3C语言结构C语言主要包括三种结构模式即顺序结构、选择结构和循环结构。顺序结构在C语言中是按照先后次序进行操作,通过构建一个相对简单和完整的程序,进行相对独立的运用。循环结构是在进行各种数据运算和处理时,需要对其中的一些语句进行反复的执行,这在一定程度上简化了程序的长度,使程序变得简洁。选择结构是根据相关的分支条件选择相应的执行路径,在计算机软件编程中要选择具有较强适应性执行路径。
篇5
关键词 C语言;中等职业教育;计算机专业
中图分类号:G712 文献标识码:B
文章编号:1671-489X(2015)23-0083-02
1 前言
《教育部关于进一步深化中等职业教育教学改革的若干意见》(教职成〔2008〕8号)明确提出,中职教育要坚持以人为本,关注学生职业生涯持续发展的实际需要,培养他们具有良好的职业道德,掌握必要的文化知识和熟练的职业技能,成为德、智、体、美全面发展的具有中国特色社会主义事业的建设者和接班人。随着社会对中职学生的要求关注度逐渐提高,中职教育面临的问题也日益突出,尤其是学生质量的下降与社会的高期望值之间的差距,对从事中职教育的老师提出了更高的要求。如果教与学的问题解决不好,就会影响技术技能型人才的培养质量,继而影响整个社会经济的发展。
2 中职学校计算机专业开设编程语言课的必要性
自1987年起,国家教育部就开始了中职毕业生直接上大学(普通高校)的探索。目前,国家每年都有部分普通高校本科和专科对口单独招录中等职业学校毕业生,这为中等职业教育的发展提供了有利条件,拓宽了中职学生继续学习的渠道。中职学生升入高一级学校,继续学习计算机相关专业,编程语言课的学习是必然的,因此在中职阶段提前开设相关编程语言课的学习就很必要,它会为学生今后拓展专业知识奠定有利的基础。
3 中职计算机专业学生现状
1)学生普遍阅读能力差,抓不住重点,遇到题目不明其意。
2)逻辑推理能力差,缺乏全局统筹安排意识,遇到问题不知如何解决,加之中职配套教材例题又多以数学问题为主,学生初中阶段甚至是小学阶段的数学知识欠缺,直接导致现阶段问题突出。
3)英文界面的操作有难度,关键字不能借助英语知识记忆。
4)变通能力差,不会举一反三。
5)学习惰性强、缺乏自信,遇到困难不愿自行解决、认为也解决不了。
6)主观意识中排斥编程类课程的学习,认为没有实际用途。
4 教学思考与对策
目前,中职学校编程语言主要开设VF和C两门课程,VF的学习相对容易一些,可视化的界面直观形象操作也很简单,同时VF作为高考对接考试中的考试科目,学生主观上更重视一些,无论是老师的教还是学生的学问题不突出。而C语言前几年曾经是考试科目之一,近两年被取消,目前有些中职学校又在重新开设,具有一定教学难度。教师考虑到学生今后的学习需要,这门课就是让学生理解计算机在解决问题时所采用的思路、方法,让学生逐步形成解决问题、统筹布局的能力,要合理安排这门课程的教学难度,提高学生的学习兴趣。
科学合理安排教材内容 学校现在所用的是高等教育出版社编写的《C语言程序设计教程》,从第一章到第十章内容分别是概述、数据类型和运算、基本输入与输出、流程控制、函数、数组、指针、结构与联合、编译预处理、文件、对外接口、图形、汉字处理、用户界面技术。
按照以往的教学经验和往届学生的学习效果,再结合学生的认知结构,笔者将第二章数据类型及运算的知识点结构做了些微调整,即先讲数据类型,然后将整型、实型、字符型数据类型又分为相应的变量和常量,常量讲各种表示方法,变量讲标示符命名规则、讲不同的定义形式、讲初始化和赋值方式。第三章基本输入的知识点也做了相应的调整,调整为先讲单个字符的输出与输入函数,再讲格式化输出与输入函数,而字符串的输出与输入等到学完数组和指针后再讲。C中的图形和文本部分,界面效果相比较适合,但程序相对大,函数、指针的运用比较多,程序有相当的难度,所以这几章内容我在课堂上不讲解,但会建议感兴趣的学生自行上机调试,看程序界面和前几章的有何不同,为学生今后的继续学习留一些空间。
适当降低教学难度并调整讲课进度 在每节课的例题中精选一些学生容易掌握的、有特点的例题进行讲解,并对其举一反三、变换对比程序,让学生每节课学得少而精。
不同章节选用不同的教学方法 同时注意将上机环境融入到课堂讲授中,让学生直观的认识程序的调试、运行、结果的必然联系和关系,引导学生发现课堂分析程序与上机调试程序存在的区别,这样有利于学生课后自学,逐步提高学生的自学能力。
1)讲函数的定义时,可将之前学过的程序代码(主函数中实现相应功能的程序语句)改写到自定义函数体中,然后为该自定义函数加上相应的变量说明、输出语句等,使之形成完整的自定义函数。然后再让学生反复练习,将改写的程序变成自定义函数。
2)讲函数的调用时,接触到的程序中一般含有多个函数,因此先教学生将大程序分成小模块(每一函数就是一个模块),然后结合上机过程,采用F7键进行单步调试,每次点按F7,程序从主函数进入后会单步顺序走一条语句,直到碰到调用语句时,程序会跳转到相应的自定义函数定义处,接着再按F7键,程序会从自定义函数定义处顺序执行,遇到return语句时程序又会返回到调用位置处。结合上机过程讲解这节内容,程序的走向、函数的调用、函数的返回过程清晰明了,相比较课堂的讲解效果好许多。
3)讲解变量的存储类型和作用域时,也可采用上述的将程序划分模块的方法,引导学生将程序分成若干源文件、若干函数,接着在函数外找到外部变量和外部静态变量,在函数内部找到局部变量和局部静态变量,最后告知学生每一种变量的作用域和特点,这节内容上机调试程序时,教学生利用监视器窗口对每种变量添加监视,仔细观察每种变量的初值、变化情况以及最终值的保留情况(即作用域的长短)。
课后作业控制难度 多年的教学发现,课堂上学生跟着老师能较顺利地完成程序代码的分析,得到正确的运行结果,但是独立完成作业时,却问题很多,这说明学生对课堂内容没有完全掌握,独立解决问题的能力不够,所以课后的作业难度要降低,作业可以以小组(3~5人)的名义上交,交作业的最终目的是检验学生对课堂内容的掌握情况,促进相互学习,这样既锻炼了学生,又增进了他们之间的感情,还能体验成功的乐趣,增强他们的自信心。
注重和其他专业课程的衔接 如和VF课程的衔接。编程语言都有相通之处,VF 和C就是这样,在处理有些问题时,只是两种语言的表示方法不同而已,让学生对比学习,效果会更好。
5 结语
语言类的教学会有这样的瓶颈,教得浅了,学生学得容易,但实际编写代码的能力不高;教得深了,学生学起来难度太大,提不起学习积极性,反而会打击学习热情。笔者认为语言类的教学尤其是C语言对学生的帮助短期内可能看不到明显的效果,它更多是思维上的潜移默化的影响,比如考虑问题的角度、解决的步骤、是否考虑到多个方面等。
参考文献
[1]谭浩强.C语言程序设计[M].北京:清华大学出版社,
2001.
[2]徐维祥.C语言程序设计教程[M].北京:高等教育出版社,2004.
篇6
关键词 高职教育 C语言 结构化编程 互联网
如何提高高职计算机类专业学生非图形模式下的结构化编程能力,是高职计算机教育中的一个普遍问题。作者通过三年的努力,对“C语言程序设计”课程在教学内容、教材建设、实训设计、网站建设和考核方式等诸多方面,进行了大胆的改革和探索,将电子教材、电子教案、学习论坛、编程工具、学习资料等,整合成为学习网站,在教学过程中通过论坛程序不同版本,实施案例驱动,课后通过QQ群进行辅导答疑,通过论坛、电子邮件进行作业提交批改,建立了基于案例驱动的结构化编程教学模式。本文具体论述了基于案例驱动的高职C语言结构化编程教学的过程和方法。
1 教学内容
在课程设计上,针对高职计算机专业学制短,技能要求高的特点,提出了“一条线两阶段,三结构四循环”的教学模式。
“一条线”是指在一年级的编程教学课中,贯彻C语言一条线。曾经有一种观点,认为高职计算机专业的编程语言教学,直接从面向对象语言开始学习,可以节约时间。但是,70%的企业依然要求学生具备面向过程的结构化编程能力。考虑到企业的需求,结合后续的课程安排,我们决定在一年级的课程安排上,贯彻C语言“一条线”,即在第一学期,开设“程序设计基础”,第二学期,开设面向过程的“C语言程序设计”。
“两阶段’指课程安排分为“程序设计基础”和“C语言程序设计”两个阶段。“程序设计基础”解决程序的基本结构,重点在建立学生的结构化程序的基本框架和概念;以C语言为基本语言,使学生能有实际操作的平台,但准确把握“把C语言作为伪语言”的原则,不让学生陷入C语言多变的泥淖,而把注意力放在结构化程序的基本结构上。“C语言程序设计”放在解决C语言的使用上,把握“C语言”是编程工具而不是研究对象的原则,根据企业的编程规范,对“C语言”进行简化,重点是如何使用C语言解决一般复杂程度的结构化编程问题。
“三结构”是指在一年的学习中,学生要学习三个成绩管理软件的编程,分别是基于一维数组、二维数组和动态结构数组。从企业实际应用来看,动态空间的使用,可以用动态数组解决。因此我们去掉了链表,重点是让学生写出有工程实际意义的结构化程序。
“四循环”是指编写基于“三结构”的每一个成绩管理软件过程中,教师四个以上的程序版本,引导学生改写、增加函数,让学生直观地看到软件的功能是如何一步一步构建起来的。
结构化程序设计的教学中,如何让学生建立起结构化程序的框架是很困难的。一个简单的成绩管理软件,代码就超过300行。对初学者来说,看懂超过100行的程序就需要很长时间,学生又如何能在短短的课堂时间里通过增加/改写函数来增加功能呢?这也就是很多学生学完了C语言程序设计,依然不能编写一个简单的应用程序的主要原因。我们发现通过论坛程序版本,利用工具软件BeyondCompare,比较不同的程序版本之间的差异,可以让学生直观地看到软件的功能是如何一步一步构建起来的,如图1所示。程序的第一个版本,就是一个主函数,不超过10行,只显示程序的几项功能菜单,学生很容易理解,然后通过第二个、第三个版本,每一个版本实现或改进一个菜单的功能,直到最后版本。
通过图1,我们可以看到程序功能的增加是由哪些代码实现的,而通过不断反复的比较,学生就可以掌握结构化程序设计的过程和方法。
在教学过程中,通过比较版本,让学生直观地看到复杂的程序功能是如何由简单的函数一个一个构成的。学生经过“程序设计基础”的课程设计,基本掌握主函数与模块函数的作用和相互关系,可以看懂超过100行的C语言源程序,理解基于一维数组的成绩管理系统;在“C语言程序设计”的课程设计中,学生对主函数与模块函数的理解更加深入,可以看懂超过300行的C语言源程序,理解基于动态结构数组的成绩管理系统,掌握主函数的设计方法,并按照规范的格式写出自己的函数。回想三年前,因为没有采用这种方法,只要是超过20行的程序,学生就普遍反映看不懂。由此可见,采用新的方法后,学生编程能力的提高十分明显。
2 教材建设
2004年9月清华大学出版社出版了作者主编的21世纪高职高专规划教材《程序设计基础》,教材主要在三个方面进行了改革。
(1)强调把生活中的问题转化为程序的能力,使学生真正能够编写实用的程序
在教材编写思想上,重点放在培养学生把生活中的问题转变成为程序并进行处理的能力,强调转变讲授思路,推行引导学生首先想清楚“我要做什么?”,然后才教给学生“如何做”,最后上机进行验证的三步教学法。
在教材的编写风格上,对全书所有的例题进行了通盘的考虑,在循环、数组、函数和结构化设计等单元,所有的例子都有前后的联系,强调内容的前后衔接,特别注意工程规范的引入,在变量的命名、程序格式方面,均按工程要求进行。在案例选择上,全部采用工程实际和实际生活中的案例。
(2)提出了以“三大区域”为特色的c程序的基本框架
通过把一个基本的C程序从上到下分成预处理区、变量声明区、执行语句区“三大区域”为特色的C程序的基本框架,让学生树立正确的程序格式与规范。“三大区域”概念的提出,明确规定了程序的基本框架,让学生从一开始就按固定的格式进行编程,养成良好的编程习惯。
(3)提出了使用函数的“三大步九要素”的基本方法,建立使用函数的清晰框架
我们提出的使用函数的“三大步九要素”的基本方法,在教学中取得了很好的效果。
所谓“三大步”,是指我们在使用自定义的函数时,对函数进行声明、定义和调用。三大步按顺序进行。
所谓“九要素”,是分别指函数声明、定义、调用各有三要素共九点:函数声明的三要素:返回值的类型、函数的名字、形式参数。函数定义的三要素:形式参数、功能、返回值。函数调用的三要素:名字、实际参数、返回值。通过对“九要素”的理解掌握,学生能够建立起使用函数的清晰框架。
3 实训设计
对高职学小的技能培养,实训是很重要的环节。我们采用了项目驱动的思想来设计实训项目,每一单元的实训,都是构成最终程序的不同版本,在“程序设计基础”头程序版本8个,“C语言程序设计”共程序版本10个,构成了实用的软件框架,学生相当于参与了一个中等复杂程度的软件开发,积累了经验。在今后的实际工作中,完全可以以此为模板,进行结构化程序的开发。
4 网站建设
利用互联网技术,建立基于互联网的学习资源。2003年建立了“光华之窗”教学网站,在网站平台上,将电子教材、电子教案、学习论坛,编程工具、学习资料等,整合成为学习网站,设计了“程序设计基础”、“C语言程序设计”教学论坛,两年来积累了完整的教学过程资料。可以说,网站的建设和运行,为课程的质量提供了保证,避免了“课随老师走”的问题。
5 考核方式
篇7
一、研究目标及拟解决的主要问题
程序设计基础(C)具有较强的实践性,对学生以后参与专业领域的应用软件的开发和使用会有极大的帮助,它的学习效果将直接影响学生后续课程的学习。由于本课程的学习对象是大学一年级的学生,他们对计算机语言与编程还很陌生。一方面,C语言存在难点集中、跨度大的问题,要求学生记忆大量的语法规则、语句格式等,容易使学生产生畏难情绪;另一方面,该课程难以体现软件工程思想,不利于学生能力的培养。第三,传统的教学方式主要以教师讲授为主,培养出来的学生缺乏自主学习的能力,缺乏运用知识解决实际问题的能力。第四,对学生的学习评价方式单一,大多以卷面笔试成绩为依据,很难客观体现学生的实际应用能力。针对这些问题,本项目提出建立以培养能力为主线的教学体系;依靠网络信息技术和多媒体技术构建基于WebQuest教学模式的网络探究教学平台,提高学生实际编程能力。本项目拟解决的主要问题有:
(1)实行启发式、讨论式、探究式、趣味性教学,建立教与学互动的教学情境。广泛吸取先进的教学经验,以教师为主导,以学生为主体,完善教学课件,精选典型、趣味性案例,多媒体教学和黑板书写等多种方式相配合,实行启发式、讨论式、探究式、趣味性教学,建立教与学互动的教学情境,激发学生的学习兴趣,提高教学效果。采用“实例-理论-应用”的教学方式,任务驱动,用实例来引入、解释概念,用案例来演绎理论和方法,鼓励学生自己提出问题的解决方案,对遇到的问题,鼓励同学之间或师生讨论,或在老师的的启发与引导下解决问题。培养学生具有合作学习和探究性学习的能力,培养良好的团队精神,为以后的后续课程的学习打下良好的基础。
(2)构筑网络教学平台
构筑网络教学平台,教学资料全部上网,以教学课件、教学录像为基础,以学习指南、实验指导、作业习题为引导,以在线答疑、手机答疑、短信答疑、电子邮件答疑为互动,以在线测试、模拟考试为补充,鼓励学生自主学习、开放学习、灵活学习。
通过师生互动的教学,通过网络教学资源的配合,让学生掌握各学习环节,充分发挥学生的学习积极性和能动性,激发和促进学生的能力发展。
(3)考核方式
建立试题库,抽题组卷;实行全校统考,考教分离; 期末闭卷笔试(统考)成绩占70%,平时作业成绩占10%,平时实验成绩占20%。
(4)鼓励学生参加各社会实践大赛:全国大学生数学建模竞赛、挑战杯竞赛、电子设计竞赛、软件设计大赛等,锻炼和培养学生的创新精神和方案创新设计的能力。
二、研究内容
1、如何以培养学生分析问题、解决问题编程能力为目标,编写适合教学的教材,修定、完善“程序设计语言(C)”的课程教学大纲、实验大纲和实验指导书。
2、如何依靠网络信息技术和多媒体等新兴技术构建基于WebQuest教学模式的网络探究教学平台,建设“程序设计语言(C)”重点课程网站。
3、如何以“全国信息技术应用水平大赛”为载体,增强学生掌握应用开发技术的自信心与能力。
4、如何培养学生形成正确的程序设计思想,能够熟练地使用C语言进行程序设计并具备调试程序的能力,为后继课程VC,VC++及其他程序设计课程的学习和应用打下基础。
三、本项目研究解决教学问题拟采取的主要方法
1、对当前民办院校和独立学院计算机类专业基础课程体系进行比较研究,对当前IT行业要求学生应具有的主要应用开发能力进行比较研究,从而,编写适合学生的教材,合理的确定“程序设计语言(C)”的课程教学内容与学时、教学大纲、实验大纲和实验指导书;课程设计要求、方式、学时与学分、课程设计指导书(任务书)等,体现出课程的先进性、科学性,符合软件行业对人才的能力需求。
2、精讲课本知识,充分利用先进的教学手段,提高课程教学质量。加强师资与实验室建设,加强综合课程设计环节,切实提高学生实际动手能力的培养。
3、丰富和完善试题库、模拟试卷与解答、多媒体课件、教学录像、在线答疑等各类教学资源。在该项目实施的基础上,该项目组已经按照城市学院重点课程建设的要求,于2011年申报院级“程序设计基础(C)重点课程建设项目”。从而,在城市学院建立完善的、以培养学生掌握C语言为目标,掌握后续课程C++、VC++程序设计方法的教学体系。
4、改革课程与课程的考核方式。
四、项目研究(开发)的总体安排及进展情况
(1)第一阶段:
准备阶段:根据课程的特点,项目组的教师讨论提出最优方案,制定详细的计划,分工责任到人,并定期检查进展情况。
(2)第二阶段:
具体实施阶段:编写适合学生的教材,制作统一的教案和电子课件,合理的确定 “程序设计语言(C)”的课程教学内容与学时、教学大纲、实验大纲和实验指导书等,体现出课程的先进性、科学性,符合软件行业对人才的能力需求。申报院级“程序设计基础(C)重点课程建设项目”。
(3)第三阶段:
丰富和完善“程序设计语言(C)”课程试题库、模拟试卷与解答、多媒体课件、教学录像、在线答疑等各类教学资源。由相关教师完成网站建设工作。
(4)第四阶段:
评价项目研究成果;撰写项目“研究报告”;发表研究论文及应用论文。
五、预期成果
1、教学研究的研究报告。
2、教学研究的教材、教案、课件、教学大纲、实验大纲、实验指导书等。
3、以“全国信息技术应用水平大赛”为载体,增强学生掌握应用开发技术的自信心与能力。
篇8
【关键词】C;C++;Fortran;混合编程;字符串;文件读写;函数调用
对C、C++、Fortran不同语言混合起来进行编程,利用各自的优势,弥补各自功能的不足,如FORTRAN语言具有强大的科学数字计算功能,但绘图功能不强;而C、C++语言计算功能不强,但它具有良好的移植性和较强的图形功能,可将计算方式转变为数据输入简易、结果显示方便的Windows可视化应用程序,因此,在许多情况下,我们应该使用C、C++、Fortran等进行混合编程。在既要大量计算,又要图形处理的开发环境中,可以通过混合编程,达到优势互补。
1.混合编程开发平台及编译开发环境的选择
Fortran语言没有大小写之分,而Windows平台下的混合语言编程过程中大小写问题十分突出。考虑到编译器的差异,可以用以下方式进行跨平台编程的函数声明。C、C++编译器使用MicrosoftVisualC++6.0编译集成开发环境,Fortran编译器使用DigitalVisualFortran6.0编译集成开发环境。
VC++与FORTRAN的语言编译器同出自微软家族,且使用同一操作平台,因此在它们两者之间进行混合编程是完全可以实现的,但是必须充分考虑两种语言之间的接口问题,即在存储模式、语言约定、数据处理以及例程单位等方面的一致性问题。
存储模式的一致性。存储模式是指编译器应遵循的某种规则,这种规则是把程序的代码和数据装入存储器段中的一套预先制定的规则,它定义了编译器将代码和数据组织分段的方法,同时也规定了访问每段中代码和数据的寻址方法。一般来说PC机上有6种存储模式:微小模式(Tiny)、小模式(Small)、中模式(Medi-um)、紧凑模式(Compact)、大模式(Large)、巨模式(Huge)。对FORTRAN一般用大模式,而VC++至少是紧凑模式以上,因为FORTRAN采用段间或远程传址。
语言约定的一致性。混合编程时,要注意调用程序与被调用程序遵守同样的约定,不能发生冲突。这些约定包括命名约定、调用约定、参数传递约定和函数返回值约定。
命名约定,即在编程过程中相互匹配的标识符应保持一致。由于VC++语言严格区分大小写,而FORTRAN中不存在大小写问题,VC++中还存在类型说明及其它一些问题,如果命名约定在调用程序与被调用程序之间不一致,程序就不会成功地连接。FORTRAN的缺省方式使符号名在目标文件中变成大写,如果在VC++程序中调用一个使用FORTRAN缺省的FORTRAN子例程,在VC++中需用一个纯大写的名称来生成一个调用;当在VC++中用一个纯小写的名称来生成一个调用时,在FORTRAN程序中需用C和STDCALL属性将所有名称转换为纯小写的形式;在VC++中,当一个调用例程的名称以混合书写形式出现的时候,需使用FORTRAN的ALIAS属性来解决混合书写形式之间的命名冲突。
调用约定,指语言实现调用的规则及方法。调用约定可以从三个方面影响程序设计:首先是调用例程利用调用约定决定传递给另一个例程的自变量的顺序;其次是被调用的例程利用调用约定决定接收传递过来参数的顺序;第三是所有涉及堆栈这样一种数据结构的参数从椎栈中移去后,调用例程和被调用例程必须在调整堆栈的职责上取得一致。在VC++与FORTRAN语言混合编程时,两者之间的函数调用一般采用C与STDCALL调用约定。
假设一个C语言函数为voidcFunction(),那么只需要在它的头文件里面进行如下定义即可。
#ifdef_cplusplus
extern/C0void{
#endif
externvoid_stdcallCFunction();
#definecFunctionCFUNCTION
#ifdef_cplusplus
}
#endif
这样就可实现上述函数在Fortran或C++程序中的直接调用。
2.混合编程中的字符串处理
混合编程中经常会出现需要传递字符串的情况,而字符串的传递是一个较为麻烦的问题。在Fortran里,字符串是没有结束符的,但是有长度的概念,也就是说,编译器会给每一个字符串一个长度以控制,在Windows平台下用如下方法定义。
以C函数为例,定义如下。
voidmessag(char*msg1,int*where1,char*msg2,int*where2)
{
printf(/,,%sshouldbe%d,while%ssh-
ouldbe%d\n0,msg1,*where1,msg2,where2);
}
如果要在Fortran里调用的话,需要以下定义。
#ifdefinedULTRIX||SPARC||IRIS||LINUX||WIN32
#ifdefinedULTRIX||SPARC||IRIS||LINUX
externvoid_stdcallmessag(char*,int*,char*,int*,int,int)
#definemessag(s1,i1,s2,i2)messag_(s1,i1,s2,i2,strlen(s1),strlen(s2))
#else/*WIN32Platform*/
externvoid_stdcallmessag(char*,int,int*,char*,int,int*)
如果要用在C++中,需要如下定义。
#ifdef_cplusplus
extern/C0{
#endif
/*yourexterncode*/
#ifdef_cplusplus
}
#endif
Fortran里便可以直接调用如下。
CALLMESSAG(char1,i1,char2,i2)
同样,在Fortran里写的字符串处理函数使用以上的define和extern后,也可以在C里直接调用。
3.混合编程中的文件读写处理
文件读写也是混合编程中一个非常重要的问题,由于编程语言的差异,不同的编译器的存储格式也存在差异,如VisualFortran与DigitalFortran在存储数据块中还存在着差别。在一个write语句中,VisualFortran存储数据块的开始标志与结束标志是用一个字节表示,而在DigitalFortran是用一个整形数,即4个字节来表示。也就是说,VisualFortran一个数据块最多可以存储128个字节,如果一个write语句要求写入的数据量大于128字节时,则按循环形式存入。所以,DigitalFortran在读取时就应该把它转化为相应的DigitalFortran存储形式。
4.混合编程过程中数据结构的处理
主要体现在数组和结构2个方面。在Fortran语言里,数组和C、C++里的数组有些不同,这表现在行列顺序和数组起始值.Fortran语言不同于C、C++的行优先,而使用列优先的方式。假设有一个数组a,m行n列,采用行优先时的数据存放格式如下。
a11,a12,a1n,a21,a22,,,a2n,,,
am1,am2,,,amn
而采用列优先的数据存放格式如下。
a11,a21,,,am1,a12,a22,,,am2,,,a1n,a2n,,,amn
行优先顺序推广到多维数组,规定为先排最右的下标;列优先顺序推广到多维数组,规定为先排最左的下标。这样,在混合语言编程里调用数据时必须注意行列优先的差别,进行准确地调用.数组的另一个差别是起始下标的不同。Fortran默认的数组下标是以1开始的,而C、C++默认的数组下标却是从0开始的,所以在调用时要注意加1或者减1,以保证调用到正确的数据。
Fortran语言里的结构经过声明后就被分配了空间,在C、C++里面也要声明它,采用下面的方式。
Fortran结构声明格式如下。
COMMON/COLOR7/C_RED,C_GREEN,C_BLUE
COMMON/NDDAT/NID(NASIZE),XN(3,NASIZE)
C、C++结构声明格式如下。
#ifdef_cplusplus
extern"C"{
#endif
#definecolor7COLOR7
#definenddatNDDAT
externstruct{floatc_red;floatc_green;floatc_blue;}color7;
externstruct{intnid[NASIZE];floatxn[NASIZE][3];}ndda;t
#ifdef_cplusplus
}
#endif
综合上述问题的研究,混合编程的优势在于它允许调用另一种语言编写的现有程序代码、使用在特定语言环境下难以实现的算法和获得处理速度方面的优势。在混合编程中的关键问题是协调2种或多种语言间所的调用约定、命名约定及参数传递方式,并使它们在数据结构、数据类型上保持一致。
参考文献
[1]张志华,王林江,吕庆风.混合编程与FORTRAN计算程序可视化[J].计算机应用,1999,19(6):33-35.
[2]袁平.多语言混合编程的技术关键及方法[J].电脑与信息技术,1996,(1):43-45.
[3]周振红.IntelVisualFortran应用程序开发[M].郑州:黄河水利出版社,2006.
篇9
关键词:可重构;Impulse C;FPGA;高性能计算
中图分类号:TP311文献标识码:A 文章编号:1009-3044(2009)04-0991-03
The Research on Reconfigurable Computing Programming Technology Based on Impulse C
MAO Xing-quan
(Jiangnan Institute of Computing Technology, Wuxi 214083,China)
Abstract: The research on reconfigurable computing takes up with highly flexible architecture for high performance computing. Reconfigurable platforms with FPGA instruments appear largely in recently years. The high-level programming technology of FPGA let the software engineers break away from the trouble of hardware and concentrate on the algorithmic functionality. The Impulse C development kit is a relatively simple and C-based approach which is used for hardware/software co-development. Combining with the hardware compilers, these tools form a whole processor/FPGA mixed means, and greatly simplify the design process of the reconfigurable component. But still, there is some gaps about efficiency and optimization need to fill.
Key words: reconfigurable; impulse C; FPGA; High performance computing
1 可重构计算技术
1.1 基于FPGA的可重构计算
随着电子、通信、科学计算等应用领域的不断发展,对高性能信息处理系统的需求日益增加。传统的基于通用处理器通过软件编程实现基本算法的方法和基于硬件的方法都无法完全满足这些需求。而可重构计算技术结合了通用微处理器的灵活性和专用ASIC的高效性,为满足各领域对高性能计算的需求提供了一条可能的途径。
可重构计算(Reconfigurable Computing)是指,在软件的控制下,利用系统中的可重用资源,根据应用的需要重新构造一个新的计算平台,达到接近专用硬件设计的高性能??[1]。而具有可重新配置电路功能特性的FPGA(Field-Programmable Gate Array)的出现,正好满足了可重构计算系统的需求。目前的可重构计算系统主要是基于FPGA的,以便针对不同的计算需求构造不同的硬件结构,实现高效的并行计算,提高电子信息系统的实时处理能力、自适应能力、可靠性、降低硬件系统的规模和功耗等等。
1.2 可重构系统的体系结构
为了取得上述性能上的优势,并且支持广泛的应用,可重构系统一般由通用微处理器和可重构部件联合组成。通用处理器控制可重构部件的运行并执行不能有效加速的代码,计算密集的核心代码被映射到可重构部件上执行,可重构部件担当通用微处理器的协处理器的角色[2]。
一个典型的可重构系统的结构是:通用处理器初始化可重构的硬件,为其送入必要的数据或者提供数据在存储器中的位置信息。可重构的计算单元独立于主处理器执行实际的计算任务,计算完成后返回结果。如图1所示。这种形式的耦合允许可重构部件在不受主处理器干扰的情况下运行大量的操作,并保持与主处理器同步。
1.3 FPGA的编程技术
使用FPGA作为可重构计算平台也存在着挑战。传统上,低层次的硬件描述必须采用VHDL或Verilog语言编写,这些语言通常不是软件编程人员的专长。
然而基于C语言的FPGA设计工具的出现,支持了比硬件描述语言更高级的编程抽象,使采用软件设计工具和标准C语言来实现绝大部分应用成为可能,特别是计算密集型的设计。
这些新的硬件编译工具允许对C语言应用程序进程处理和优化,生成FPGA网表格式的硬件设计,同时也包括对C语言做必要的扩展,以便于描述高并行、多进程的应用[4]。
有效使用这些工具和软硬件协同设计方法的关键在于对应用在软硬件之间进行划分,确立一个适合于高并行应用的编程模型,以及确立一个应用的结果,从而最大限度利用硬件并行优势[5]。
2 Impulse C开发平台
2.1 Impulse C编程模型
Impulse C就是一种基于C的硬件设计和软硬件混合设计语言,他能够抽象掉硬件和软件之间通信的许多细节,使得开发人员能够更加专注于应用的划分而不用担心硬件的底层细节。
Impulse C的编程模型是一个面向流的、软硬件混合式应用程序的通信顺序进程模型[3]。通过使用一些C兼容的扩展,一个应用程序被描述为一组通过流、信号、和共享存储器进行通信的进程。这些进程持续接收数据、进行计算、产生输出来完成应用程序的工作。
Impulse C编程模型的核心是进程和流。Impulse C致力于从算法到混合FPGA/处理器系统的映射,目的在于建立硬件进程在FPGA上的硬件实现,软件进程存在于微处理器中。硬件进程通过流、信号和存储器与软件进程相联系。如图2所示。对于被映射到硬件的进程,C语言被约束在它的一个子集里,而软件进程只受主机或目标C编译器的限制。
Impulse C编译器为硬件进程生成可综合HDL,以及实现特定的流、信号、存储器所必须的硬件之间的接口和硬件到软件的接口。该编译器可以执行指令调度、循环流水、和循环展开。它包含多种编译指令(在C中用语句#pragma来表达),这些编译指令能够调整优化结果,使其满足通常的面积/性能需求。
2.2 Impulse C的开发环境
Impulse Accelerated Technologies公司专门为加速超级计算应用而提供可编程FPGA的开发工具,他们推出的CoDeveloper开发工具为基于FPGA的可重构计算提供了一个软/硬件协同开发环境。CoDeveloper使用Impulse C库来支持多重并行处理,将基于C语言的设计在编译后以FPGA网表的形式建立硬件。
CoDeveloper开发环境包括:实现从C到RTL级HDL转换的CoBuilder,针对具体平台的自动生成软硬件接口的平台支持包(Platform Support Package,PSP),以及软硬件协同设计调试工具Application Manager和Application Monitor。
CoDeveloper使用Impulse C语言提供了对FPGA系统级的设计,对软/硬件划分,同时允许使用标准C构造编写和自动优化独立进程,具有最小的软件编程复杂度。同时具有在标准C开发环境下编译和调试的能力。
2.3 Impulse C的开发流程
Impulse C编译器能够将Impulse C进程转换成相应的硬件和软件二进制文件。在这个处理的过程中,需要执行一系列的步骤,其中一部分依赖于你所选择的平台对象。如图3所示。
对于软件进程,使用标准的交叉编译器和Impulse C提供的特定平台运行是库即可。硬件进程需要通过RTL生成器的分析,并通过几遍编译进行优化。在这个流程中,设计输入、初始的桌面仿真和调试是利用通常的C开发工具来完成的。在仿真的过程中,CoDeveloper会通过Application Monitor等调试工具监视Impulse C应用程序,指出其中的异常或设计缺陷。
3 在加速3-DES算法中的应用
3-DES算法是常用的加/解密算法,网络上可以找到它的公开源代码。其核心算法是对64位的数据块进行加密或解密,对于大量的数据,只要将该算法重复应用在这些64位块数据上就可以了。
数据流模型对该算法是非常适合的,因此我们用Impusle C库函数中的流接口来读取数据和输出数据。我们在顶层创建生产者和消费者进程,这样就可以向在FPGA上运行的硬件进程输入一些随机文本,并接受输出的加密解密算的结果。还要创建一个代表加密算法的进程和一个代表解密算法的进程。加密算法进程从生产者进程中接收配置数据和文本数据,然后把加密结果按照一次一个字符的方式写到输出流中。如图4所示。解密进程和加密进程实质是一样的,除了编译时参数不同以外。
算法是用标准C加上Impulse C的库来描述的,因此可以用标准桌面的调试工具和CoDeveloper Application Monitor进行设置和运行,并可观察数据流在系统各个不同的进程之间的流动,算法的结果可以在编译到FPGA平台之前进行验证。
用标准桌面开发工具仿真它的功能后,用Altera公司的DE2目标板,在混合FPGA/处理器硬件平台上实现了该应用。这个平台的开发套件包括了所用编译和综合到FPGA的开发工具。这个开发套件结合Impulse C编译器,包含了编译C源程序和执行应用所需要的所有工具。
在把加密程序编译成目标硬件的过程中,首先必须设计支持DE2平台的Platform Support Package文件,接着利用利用这个平台支持包处理相关的Impulse C源文件,产生相应的硬件和软件的接口文件。
然后用Altera的Quartus工具建立新的项目,CoDeveloper输出生成的硬件和软件文件给Quartus,整个系统用Quartus工具综合,并用SOPC Builder的工具生成bit文件,通过USB电缆下载到FPGA上运行验证。
在这个实验中,通过运行在通用处理器上的软件进程来获取测试时间,并与在通用处理器上运行的纯软件方式的加密算法所用时间作为对比。对同一块数据进行加密,混合平台上运行的时间约为0.014秒,通用处理器上的软件实现约为0.12秒,硬件实现比纯软件实现速度提高了8.6倍,这主要是由于硬件实现发挥了算法内层循环中的底层并行性的能力。
4 结论
本文介绍了基于FPGA的可重构计算平台的体系结构,以及在C语言的环境中对FPGA的编程技术,还对基于Impulse C库的CoDeveloper工具进行了详细的论述。在此基础上,通过3-DES加密算法的实例,对在CoDeveloper和Altera设计工具的环境下基于Impulse C的软硬件协同开发技术进行了深入的研究。
可重构计算是未来高性能计算的一个发展方向。采用高级语言对FPGA的进行编程,可以使开发人员把注意力集中在算法的描述上,并让软件设计师也能完成底层硬件的的设计工作。当然这些需要强大的可重构编译器的支持。未来,面向可重构计算的编程模型、编程语言及相关的编译器的设计还有待进一步研究。
参考文献:
[1] 罗金平,杜贵然,周兴铭.计算机体系结构的新发展:通用重构计算技术[J].计算机工程,1999(9):1.
[2] 王昭顺,王沁,曲英杰.可重构计算机体系结构[J].北京科技大学学报.2001,23(4):387-389.
[3] Katherine Cpmpton,Scott Hauck.Reconfiguralbe Computing:A Survey of Systems and Software.ACM Computing Surveys,2002,34(2):171-210.
篇10
[关键词]BASIC 编程 过程
随着高等级公路的不断修建,采用的各种测量仪器和计算方法也越来越先进、快速、精确。目前我们在公路建设中主要的测量仪器大部分都采用全站仪,而在公路的平面设计、纵断面设计、横断面设计等工作中,都已采用电脑计算,但是一般电脑只方便于内业,对于外业来说就不能随意携带。如果我们使用PC-500袋装电脑,那就不管内业和外业都是很方便的,因它小巧、容量大,故特别适应于公路建设中的施工单位的随意测量放样和监理单位的测量监理使用。
下面就本人在公路建设中使用PC-500机进行公路坐标程序编制方法介绍如下,供同行们参考。
例如编制某一条公路的中桩,可按以下步骤来解决。
一、确定计算处理方案
在一般的公路线型中,无非有直线和曲线两种情况,而曲线又分为圆曲线和带有缓和曲线的圆曲线两种。要计算出某中桩坐标,必须根据曲线要素判断该点是在直线上还是在曲线上,然后按有关公式进行计算,就很容易得出正确结果。
二、根据方案画出框图(即程序流程图)
框图是程序编制中利用规定的符号及规则来描述程序的思想、步骤,体现程序编制人员的思路、意图的一种程序编制方法。在程序的编制过程中,由于使用了许多条件语句和无条件语句等,使其程序不按行号顺序执行,而是根据实际需要改变了执行顺序,即“跳跃式”地执行。因此,我们在编程开始前就要根据自己的设计思路先画出程序框图,再根据框图进行编程。
在框图的编制中,应当按照每个步骤的功能选择适当的框图位置,然后组成框图,再将程序的执行步骤逐个按顺序填入框图中(如上图)。
三、框图检查
当框图检查无错后,再对照框图编制你所需要的程序。
四、上机调试程序和运行程序
根据编写完成的程序编入计算机,并调试。当调试完毕并运行无错后,即可进行坐标计算。
刚编好的程序总会存在各种各样的错误和问题,在调试过程中,要查看各语句的书写格式,使用规则等是否正确。有时一个标点符号或空格的错误使用,都会造成全部的计算结果出错或“死机”等,所以在调试过程、查看的过程中要特别仔细。
在调试的过程中,还要输入一些数据进行试运行,看是否运行情况正确,能否得到预期的效果,有时可能因为得不到预期的正确结果而对原程序做些局部修改。总之,调试是一项费时费力的工作过程。
在编制程序的过程中,要正确使用公式以及公式的前后顺序。如果某公式里含有一个或多个未知数,那么就应把未知数的计算式放在该公式的前面,使计算机首先计算未知数后再计算该公式,否则出错。例如:
10 INPUT”A,B,C=”;A,B,C
20 X1=(3+2*A)*SQR(E+C)
30 E=(A+B)*C
40 PRINT”X1=”; X1
50 END
因30行里的E未计算出来,故20行就无法运行,并发生错误,故应把该程序改写成:
20 E=(A+B)*C