c语言

2024-07-21

c语言(通用12篇)

c语言 篇1

摘要:汇编语言是各种CPU提供的机器指令的助记符的集合, 人们可以用汇编语言直接控制硬件系统进行工作。C语言是一种结构化语言。它层次清晰, 便于按模块化方式组织程序, 易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型, 便于实现各类复杂的数据结构。在计算机应用程序的开发中, 对于汇编语言与C/C++语言的设计开发, 二者都存在着优缺点, 本文主要研究了汇编语言与C/C++语言混合编程的设计, 并进行相关的讨论。

关键词:汇编语言,C/C++语言

在计算机系统的应用程序中, 所有汇编任务都由汇编语言来完成, 这样虽然完成任务的效率很高, 但是工作量却非常大, 会影响到对于应用程序的维护。若是所有的程序都是由C/C++语言进行编程, 虽然执行过程比较的简单, 但是这种方式却导致了目标代码的执行任务效率低, 实时性很差。所以在嵌入式系统中, 主要采用的编程方式是汇编语言与C/C++语言混合编程形式, 在编程过程中, 初始化任务由汇编语言来完成, 主要的任务则是由C/C++语言来完成, 从而达到了最大的效果。

1 ARM处理器

ARM处理器主要是利用编译器将汇编语言以及C/C++语言进行相互的切换, 并且ARM制定了相关标准, 来保障切换过程中的顺利实施。

1.1 寄存器使用规则

ATPCS为ARM寄存器进行不同命名, 从而在编程的过程中来利用ATPCS寄存器进行编程。

1.2 堆栈的使用规则

在ATPCS中规定, 堆栈的主要类型是FD, 被称为满递减堆栈, 所以必须要利用STMFD/LDMFF进行堆栈的操作。

1.3 参数传递规则

参数传递的规则不一样, 利用参数的数量可以将子程序分为参数数量固定, 以及参数数量不固定的子程序, 对于参数变化的子程序, 若参数的数量少于四个, 那么要利用寄存器来进行参数的传递, 若参数的数量多余四个, 那么必须要利用堆栈来进行参数的传递, 所以参数之间传递的规则不同。

2 C语言

2.1 汇编语言调用C语言

在对计算机程序的开发中, 前期由汇编语言进行初始化的编程, 然后在进行C语言之间的切换, 对于C语言的切换, 主要是通过BL来实现的。以下是调用的字符:

汇编语言的集成环境如图1所示。

2.2 C语言调用汇编语言

在程序中, 使用“C++”程序来调用C程序, 以下是调用C程序的字符:

2.3 汇编程序调用C++程序

在汇编语言与C++程序的切换时, 必须要利用关键词进行声明, 在C++程序的结构中, 如果没有基类, 则要使相应的存储结构与ARMC相同。并且在汇编过程中将参数的数据放在数据栈中, 只有这样才能使被调用的C++程序访问到相应的参数。

3 混合编程

在进行混合编程的过程中, 若汇编代码较短, 那么可以利用内嵌汇编的方式进行混合编程, 不会直接指定寄存器, 而是直接利用编译器进行分配。主要的内嵌汇编语言如下:

以下是利用字符串复制的方式实现混合汇编:

4 结语

在计算机系统嵌入式应用程序的开发中, 利用ARM汇编语言与C/C++语言相互结合的混合编程方式, 可以在很大程度上提高编程的最佳效果。本文主要举出了ARM汇编语言以及C/C++语言汇编中的实例, 提出了设计的方法, 阐述了ARM汇编语言与C/C++语言相互结混合编程方式的实现。

参考文献

[1]翟乃强, 隋树林.汇编语言与C语言及Visual C++混合编程[J].青岛科技大学学报 (自然科学版) , 2003.

[2]王付山.汇编语言程序设计教学初探[J].福建电脑, 2005.

[3]蒋雪玲.对汇编语言教学的几点建议[J].广西师院学报 (自然科学版) , 2001.

c语言 篇2

C语言的非数值处理功能很强,因此它被广泛地应用于数据库管理系统和应用软件。大多数的关系数据库管理系统,如dBASE,Fox$ASE,ORACLE等,都是由C语言编写的。各种不同部门的应用软件也大都是用G语言开发的,C语言在开发数据库应用软件方面应用很广,深受开发者的欢迎。

2.图形图像来统的应用程序方面

C语言在图形图像的开发中也有着广泛的市场。很多图形图像系统,如AutoCAD通用图形系统等,就是使用C语言开发的,并且在这些图形系统中可以直接使用C语言编程,实现某些功能。C语言编译系统带有许多绘图功能的函数,利用这些函数开发图形应用软件十分方便。所开发的应用程序常用C语言编写接口界面,这样既方便又灵活,效果很好。这是因为该语言提供有图形处理功能,便于实现图形图像的各种操作。因此,C语言在图形图像的应用方面很好地发挥了它的作用。

3.编写与设备的接。程序方面

C语言不仅在建立友好界面方面有着广泛应用,如下拉式菜单、弹出菜单、多窗口技术等;而且在编写与设备的接口程序方面也有着广泛应用。这是因为C语言不仅具有高级语言的特性还具有低级语言的功能,因此,在编写接口程序方面十分方便,有时它与汇编语言一起使用,会显示出更高的效率。

4.数据结构方面

由于C语言提供了十分丰富的数据类型,不仅有基本数据类型还有构造的数据类型,如数组、结构和联合等,把它们用于较复杂的数据结构〔例如,链表、队列、伐、树等)中显得十分方便,这方面已有许多成熟的例程供选择使用。

5.排序和检索方面

排序和检索是数据处理中最常遇到并较为复杂的间题。使用C语言来编写排序和检索各种算法的程序既方便又简洁。特别是有些排序算法采用了递归方法进行编程,更显得清晰明了。因此、人们喜欢使用G语言来编写这方面的程序。

上述列举了五个方面的应用,但绝不是说C语言的应用仅限如此,而是说在这几个方面目前使用得更多些。C,语言可以说在各个领域中都可以倪用,并且都会有较好的效果。所以,C语言是当前被用于编程的最广泛的语言之一。

另外,C语言是一种结构化程序设计语言,在编写大型程序中也很方便,特别是该语言又提供了预处理功能,其中文件包含在多人同时开发一个大程序时将带来减少重复和提高效率等好处,因此,越来越多的人喜欢用C语言来开发大型程序。

1.计算机二级C语言程序设计考点:C语言的特点

2.计算机二级C语言程序设计考点解析:C语言程序实例

3.计算机二级C语言程序设计考点:指针

4.计算机二级C语言程序设计考点:数组

5.计算机二级C语言程序设计考点:函数

6.计算机二级C语言考点:字符型数据

7.计算机二级c语言试题

8.计算机二级C语言程序设计考点解析:常用的输人函数

9.计算机二级C语言程序设计考点:单词及词法规则

c语言 篇3

关键词:记忆法;C程序设计语言;口诀记忆

中图分类号:H319文献标识码:A文章编号:1671-864X(2016)08-0190-01

计算机C语言具有设计特性、高效性、可移植性、灵活性、强大的功能等优势,学好C语言有非常重要的意义[1]。但由于初学者缺少先验知识,该课程学习难度大,知识掌握较困难。本文采用“口诀记忆法”,将一些较为复杂和零散的知识点进行编写串联,对促进学习者有效学习的发生,提供了一种较好的选择。

该课程新增知识点较少,教材内容变化不大,通过以下四个步骤(如图1),即可完成编写过程,后续只需在教材章节的基础上对知识点上进行细化。

一、分析环节

分析环节一般分为两个步骤,第一是对学习者的分析,第二是对知识点的分析。分析学习者应该着重分析学习者的一般特征、入门能力和学习风格。教师可以通过查看学生以前的学习成绩记录、直接向学生提问、与学生交谈、与教师交谈、标准化测试、教师自己出题等方式来了解教学对象的特征和入门能力[2]。学习风格可以选择问卷或量表进行测量。在此基础上,确定要进行记忆的重难点。教学者应重点关注那些理解力和思维能力较弱,但容易调动积极性的学习者,进行重点的教学辅导。

对于知识点的分析,一般应结合教材目录、前人总结、课后习题、题库试题等方面进行。以《第二章C程序设计的初步知识》[3]章节为例,首先借助教材对知识点进行初步细分。由目录可知,该章节包括“简单的C语言程序的格式”、“标识符、常量和变量”、“数据类型”、“算术表达式”、“赋值表达式”、“自加、自减运算符和逗号运算符”等小节。其次是对每小节具体知识点进行分析,教材一般都提供了课后习题,这些习题是专家教师经过长期实践总结出的,具有一定的代表性。教学者可以将其中一部分作为要点暂时列出。最后在结合对学习者分析的基础上,进一步筛选出要点知识,即编写知识点。

二、选择记忆方式

对于编写知识点,可以采用口诀记忆可以选择谐音、简化、对偶和综合等方式进行编写。谐音记忆就是把需要记忆的教学难点内容跟日常生活中的谐音结合起来,采用押韵、联想等方式进行记忆;简化是将复杂的知识点,突出重点后进行选择性的简化;对偶是用对称的字句加强语言的效果,但一般情况下在记忆法中,较难达到完整的对偶,只要求字数大概一致即可;综合的方式是指没有固定的格式,可以将几种方式结合运用(如表1所示)。初步完成编写的记忆法往往较为粗陋,还会存在混淆概念或知识点的可能,教学者需要在不断实践的基础上进行修改,同时最好配有口诀的解析说明,方便学习者理解记忆,避免产生歧义。

三、学习者参与编写

对编写的口诀而言,学习者参与编写,可以发挥群体智慧,逐步完善其解释和记忆功能。对学习者自身而言,积极参与会提高学习效果[2]。对教学者而言,可以减轻教学者编写负担。教学者可以定期组织学习者展示上交记忆法成果。

四、评价反馈与修改

评价反馈与修改在整个记忆法的编写过程中都在不断进行,包括判断学习者分析是否准确、对知识点的分析是否适当、对记忆方式是否有改进、对学习者学习和编写过程及结果是否有效。在此过程中,记录调查结果、原始口诀和改进口诀及其解释说明、学习者学习表现等都会为评价过程提供重要的数据依据。同时鼓励并组织学习者对学习中的重难点和学习中出现的问题进行反馈;最后,教学者要把握谨慎修改,修改必须记录说明的原则,逐步修改和完善记忆法。

参考文献:

[1]普拉塔.C Primer Plus(第五版)中文版[M].人民邮电出版社,2005.

[2]斯马尔迪诺.教学技术与媒体[M].高等教育出版社,2008.

[3]教育部考试中心.全国计算机等级考试二级教程——C语言程序设计[M].2010年版.北京:高等教育出版社,2010.

c语言 篇4

关键词: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语言功能, 同时每个函数的名称也能够反映出其功能。在给函数进行定义的过程中, 应该包含函数的名字、参数、类型、返回值类型等。其中, 在编程过程中, 函数数据库会给予函数一个系统名称, 在正式应用过程中, 只需要将指令 (#include) 把相关的头文件包含在本文件中即可。

(三) 算法技巧

在C语言学习过程中, 学生必须要掌握一定的算法技巧, 同时算法也是C语言编程的重要组成部分。通常情况下, 算法可以通过自然语言的形态表示, 也可以采用流程图的形式来表示。在应用流程图的过程中, 要求学生能够灵活、熟练地掌握一些常用流程符号。学生想要更好地掌握算法技巧, 一些基础的数学知识是非常重要的, 同时也比数学基础较差的学生要掌握得更快。所以, 在算法教学过程中, 教师可以适当融入一些数学知识, 从而提高C语言编程效率与质量。

(四) 位运算与文件

位运算可以说是C语言编程中的一大特色, 位运算在其他语言编程中是不具备的。二进制是位运算的主要针对对象, 之后再通过输入数值进行一系列的运算。例如按位、位与、取反等算法, 都是位运算中的基本算法。除此之外, 文件在C语言编程时也是十分重要的, 同样也是必不可少的。文件主要包含数据文件以及程序文件, 通过文件能够让数据查询更为便捷, 能够有效提高查询效率。可以说C语言编程的效率性, 是学习计算机编程的重要目标之一。所以, 学生必须要掌握好位运算相关的技巧与方法, 以及对文件知识更加得心应手, 在实践操作中不断自我反省、自我发现, 不断挖掘行之有效的编程方法, 从而提高学生的C语言编程技能。

C语言作为当代主流编程的代表语言之一, 在C语言应用范围非常广泛的同时, 也带来较为困难的学习难度。但是在实际学习过程中, 仍然可以挖掘一些学习方法与技巧, 来降低C语言的学习难度, 从而提高学习效率, 为社会提供更多的C语言编程人才。

参考文献

[1]段煅.C语言编程技巧在C语言学习中的应用[J].电脑编程技巧与维护, 2012, 7 (20) :97-104.

C语言中的复数C基础 篇5

复数比较详细的内容请参考:复数代数

C支持复数的数学计算,复数Z可以在笛卡尔坐标表示为:Z=x+y*I;其中x和y是实数,I是虚数单位,数x被称为实部,数y为虚部。在c语言中,一个复数是有浮点类型表示的实部和虚部。两部分都具有相同的类型,无论是float,double或者long double。

float _complex:实虚都为float

double _complex:实虚都为double

long double _complex:实虚都为long double

如果在c 源文件中包含了头文件 complex.h ,complex.h定义了complex 和 I宏。宏定义complex和一个关键字_complex 同义。我们可以用complex代替_complex.

下面是个简单的例子,运行在debian 7 (32bit)

代码截图:

运行结果:    详细代码:

View Code

creal(x):得到复数的实部(对于 double),如果对于float,使用crealf(x),如果对于long double ,请使用 creall(x)

cimag(x):得到复数的虚部(对于double),如果对于float,使用crealf(x),如果对于long double ,请使用 creall(x)

此外还有一点值得注意的是:

cos(), exp() 和 sqrt()同样也会有对应得复数方法,例如:ccos(),cexp(),csqrt()

本人是个初学者,如果博客中有任何错误或者有更好的技术知识,请多多指教!

C语言教学中存在问题 篇6

C语言课程的地位

C语言是最重要和最流行的编程语言之一,无论在中国还是在世界各国,“C语言程序设计”始终是高等院校的一门最基本的计算机类基础课程。虽然在过去的十余年中,许多人从C转而使用更强大的C++语言,但C仍然有其自身的优势,而且它还是通往C++的必由之路。

作为面向过程的程序设计语言的代表,C语言是一门非常好的教学语言。通过学习C语言,学生可以掌握自顶向下、逐步细化的结构化编程方式,以及模块化的设计,这一点是至关重要的。可以毫不夸张地说,学不好C语言课程,也就难以学习理解后续的“面向对象程序设计”、“数据结构”等一系列计算机类相关课程的内容。因此,理工科相关专业学生必须掌握使用C语言进行程序设计的基本知识和技能,为进一步学习与应用计算机打下坚实的基础。

教学中的存在问题及探讨

在C语言教学过程中,学生普遍认为C语言概念复杂、语法细节繁琐,解题常常没有思路,一上机写程序就出错,出错了也不知问题所在。结合近几年的教学经验,笔者归纳出当前C语言教学中存在如下几个方面的问题。

课程设置缺乏科学性。C语言课程主要包括顺序、选择、循环结构程序设计,数组、指针、结构体等数据类型,函数的调用,以及文件操作等内容。总的来说,内容相对繁多,细节较为繁琐。且对于初学者来说,数组、指针类型的使用等内容概念复杂(尤其是指针),理解比较困难。笔者认为,合理的课时安排应为64学时。在实际情况中,考虑到C语言课程作为计算机类课程的主要先修课程,往往设置在本科一年级。而同时进行的还有数学、英语等重要的基础课程,也需要占据大量的课时。所以,对于本科一年级学生的教学计划和课时安排往往是非常紧凑的,部分高校对于C语言课程的设置仅为48学时。由于理论学时和上机学时不充足,教学效果自然也就难以得到保障。

如何在学时不足的情况下达到教学目的,这就要求教师改进教学方法,运用现代化的教学手段。注重自身业务素质的提高,切实提高教学效率和教学质量。教师应充分备课并明确教学重点及教学难点,在课堂上主要介绍编程思路和怎样用c语言去实现算法,不要孤立地逐一介绍语法的细节,对于一些非教学重点内容(诸如运算符的优先级等知识点),应引导学生自学完成。因此,有必要对授课计划精心组织,本着强化算法、弱化语言的原则,即把解题思路、方法、步骤当做授课的重点,培养学生分析与解决实际问题的能力。

学生的算法设计能力薄弱。编写一个C程序,首先需要设计算法,然后再考虑适合的数据结构,并用C语言将算法实现。程序的灵魂是算法,而算法的设计是灵活且富有技巧的,需要学生主动思考,这对于初学C语言的学生来说极具挑战。

教学过程中,应改变传统灌输式教学模式,转而采用问题启发式教学,活跃学生思维,引导学生积极思考,而不是被动地接受和理解课本中的算法步骤。应遵循以下四个步骤来解决问题:一是分析问题,明确要做什么;二是给出求解问题的算法流程图;三是根据流程图编写程序代码,四是运行程序,输出最终结果。值得注意的是,流程图对于算法的分析与表示至关重要,教学中必须要求学生看得懂流程图、会画流程图,并且根据流程图能够顺畅地写出程序代码。对于递推、递归、穷举等基本方法,及常用的查找、排序等算法,应让学生有所了解并适当记忆。

学生的上机编程水平亟待提高。学生的上机编程能力普遍不能令人满意,遇到编写程序(尤其是规模稍大一些的程序),往往无从下手。一些学生学习完C语言课程,仍然停留在只会照抄或记忆课本中程序的水平,抑或自己写的寥寥几行代码,根本不考虑编程规范,编译报错看不懂英文提示信息,运行出错也不懂得如何打断点调试程序。这样的情形是非常常见的。

教师在给学生讲解示例程序时,应重点指出关键之处,以及容易出错的地方,要求学生通过自己上机实践来理解程序设计方法。对于常见的编译时错误,可以做一次归纳讲解,但应注意培养学生根据错误提示信息独立分析错误的能力;对于运行时错误,教师应演示并详细讲如何打断点、跳断点、单步执行等常用的调试步骤,必须要求学生掌握程序的调试方法。殊不知,编程水平就是在不断的调试程序、修改错误的过程中潜移默化地不断提高。

此外,笔者由于在从教前具有多年的软件开发从业经验,深知养成良好的编程习惯的重要性。平时应多提醒学生注意变量命名、程序缩进与对齐、添加必要的注释等问题,对于学生今后从事软件开发行业是必须的准备工作。

应该说,提高上机能力也终究还是一个孰能生巧的过程,大量的编程实践是根本。应强调学生多写程序(争取每天编程一小时),并鼓励学生自己写程序,从最简单的程序开始,从而循序渐进,积小胜为大胜。遇到复杂问题应逐步细化,采用模块化设计方法,通过编写函数来解决问题。

c语言 篇7

1 C语言概述及其具有的特征

当前时期, C语言已经成为全球范围中的计算机软件开发以及编写领域中的运用最为普遍的一种编程语言, 其传播速度以及发展速度均是极为迅速的[1]。C语言开发于20世纪60年代, 其在20世纪70年代不断发展完善, 经过50多年的发展, 目前C语言已经发展得较为成熟, 当前C语言拥有着以下一些基本特征。第一, C语言自身拥有着极为普遍的应用范围, 具有非常显著的可移植性, 可以在众多形态操作系统实现良好的适用。第二, C语言从外在形制方面来说, 其拥有着十分明显的简洁和紧凑等性能, 在进行实际使用过程中, 拥有着显著的灵活性和方便性。由于其自身语法欠缺一定的严格性, 为编程人员在进行程序编写过程中打下了较为自由的基础条件, 能够将高级编程语言与地基编程语言进行很好地衔接。第三, C语言拥有着非常多的数据结构。第四, C语言对于进行语句表意方面, 其拥有着多种多样而且数量众多运算符号, 利用这些运算符号能够完成其他高级语言不能很好实现的功能。第五, C语言拥有着典型与鲜明的应用和建设特点, 可以使数据对象和编程代码间可以进行有效的分割, 在软件编写过程中能够拥有着非常显著的清晰性, 给技术员进行使用、调试以及维护等工作带来极大的便利性[2]。第六, C语言可以对物理地址进行最为直接的访问。第七, 运用诸多的数据结构能够让C语言在实现数据运算的前提下, 还拥有着较为显著的图形元素处理以及引入方面的功能。

2 C语言学习过程中存在的问题

C语言因其具有强大以及丰富的使用功能, 使其得到了现代人们普遍的关注以及普遍的使用, 这便要对C语言使用技巧和基础知识加以有效地掌握与学习。然而, 事实上存在诸多的因素造成大量的C语言初学者常常在学习过程中感觉枯燥。虽然位过一定时间的学习以及实践, 但是无法对C语言的基础知识以及操作能力有显著的提升, 而且对于C语言整体认知也存在较大的缺陷[3]。这一学习问题主要可以从如下几点原因进行分析。

一方面, C语言对于目前大多数编程语言而言, 其处于高级语言范畴之内, C语言和以往的面向对象型的编程语言有着较为显著的差异, 这就造成C语言在进行学习过程中无法对编写的语言进行直观查看, 并且只能在编写完成并进行调试过程中才能对所编写的程序进行真实的感知, 此外, 在进行实际编写时, 一旦某一流程存在些许偏差均会造成程序输出存在错误。另一方面, 由于C语言具有的表意元素体系内存在有大量的算法和数据结构, 这便对学习者进行基础知识和应用技巧方面的学习与理解时带来了显著的制约, 致使部分学生在学习过程中感到枯燥乏味, 最终出现厌烦心理, 而且在学习时也会不断失去学习C语言的意愿, 不能确保学生学习效果得到显著的提升。

3 C语言所需的编程技巧

即便C语言拥有着众多的技术优势, 但是在实际学习过程中依旧存在较大的难度, 采取一定的编程经验以及技巧, 不但能够有效地提升编程效率, 而且可以在很大程度上对C语言学习有着帮助。

3.1 指针

C语言所具有的特征通常是利用指针表达来实现, 指针具有更为简单的语句, 而且能够有效地提高C语言的运行时的速度, 但是也存在占用内存相对较大的不足。诸如对于字符串进行赋值方面, 其中一种代码为:#defune LEN 32;char string 1[LEN];memset (string, 0, 1LEN) ;ct rcpy (st r ing1, ”this is a example”) ;另一种方式的代码为:const char string2[LEEN]=“this is a example”;char*cp;cp=string2。从上述两个代码来看, 他们的运行效率是无法相比的, 前者一定要对两个字符函数进行调用才能实现, 而后者对指针进行运用便可实现。但是后者灵活性不如前者好, 一旦字符串出现大量变更时, 前者所具有的灵活性便会展现出来, 后者将会对内存中的字符串加以大量占用。

3.2 数学方法

数学计算对于计算机而言是不可或缺的, 学习C语言过程中, 一定会遇到处理大量数据形式的结构, 编程的目的便在于解决这一问题, 利用计算机来对人工的繁重运算进行有效的代替, 从而有效地节省人工。对于一些相对较为简单的运算能够利用数学方式加以解决, 所以在利用C语言进行编程之前, 应该将数学思维运用在其中, 能够有效地提高工作效率, 对工作人员思维有着显著的扩展作用。

3.3 使用位操作

位操作能够显著的提升C语言编程的效率, 这是由于位操作使全部计算机程序内最为基础的数据单元, 拥有着非常重要的作用, 可以使代码显得相对简洁, 从而使效率得到极大的提升, 全部的运算操作基本上都可以根据位运算来进行处理, 但是位操作也存在一定的安全隐患, 因此这一技巧在实际使用过程中要根据其实际状况进行充分的考量。

4 基于单片机的C语言编程技巧

单片机已经是产品开发今后的必然发展趋势, 单片机计算机操作愈发复杂与繁重, 使其性能也得到了很大的提升, 其内部存储器也在逐渐扩大, 在代码量以及运行速度上均是汇编语言, 并不存在显著的差异, 因此利用单片机实现编程也是一项重要的研究内容[4]。C语言虽然拥有着众多的优势, 但是其所生成出来的代码相对较长, 除非拥有着较好的编程基础, 要不然的话其效果相对较差, 对此简单介绍一些有关单片机进行编程方面的技巧。

4.1 选择数据类型

基于单片机形式的C语言编程要与程序存储器进行有效的结合, 可以提供大量的数据类型, 能够被计算机进行直接读取的语言只要有bit和char, 其所产生的代码相对较短。而浮点型与整形等形式的数据无法被计算机进行直接读取, 要利用相关程序以及函数等才能实现, 而且所产生的代码相对较长。要想降低代码长度, 在对数据类型进行选取时要与实际情况相结合。

4.2 算法优化

明确所选取的数据库类型之后, 便要对程度算法实现一定的优化, 主要是针对程序运行速度以及程序代码量。此二者一般是相互独立, 拥有着此消彼长的联系, 如果空间复杂度得到了优化, 便会使时间复杂度得到一定的增加, 所以, 对算法进行优化时, 要根据具体情况取二者的平均值。代码效率一般是指代码从发出至返回所需的时间, 对时间复杂度进行优化的话, 主要是通过代码执行时间来实现, 对于执行时间方面的计算, 可以利用计时器来实现, 令单片机所自带的计时器方式调整成为自动重载形式之后, 调用代码过程中, 要将计时器进行开启, 在程序执行完成之后, 对计时器进行及时停止, 通过对时间进行计算, 基于此对其进行适当的优化。

5 结语

总而言之, C语言由于具有诸多的技术优势以及强大的功能, 使其在诸多的领域之中得到了非常普遍的运用, 对于我国诸多高校而言, 特别是理工科, 对C语言进行了大力的推动。由于C语言是一种面向过程形式的编程语言, 其中的关键部分使算法和数据节, 这也是学习过程中的重难点内容, 为了解决初学学生学习过程中的学习困难, 可以利用C语言进行编程过程中的技巧来有效地提高学习兴趣, 而且可以对教学效果以及学习效率具有显著的提升。

参考文献

[1]刘小艮.探究C语言编程技巧在C语言学习中的应用[J].科技展望, 2016 (7) :298.

[2]胡渝苹.关于计算机C语言编辑程序技巧探究[J].信息与电脑 (理论版) , 2014 (11) :158.

[3]邢如意.Linux系统下计算机C语言的编程技巧分析[J].电脑知识与技术, 2014 (36) :8674-8675, 8690.

浅析C语言递归 篇8

所谓递归,简而言之就是在调用一个函数的过程中又直接或间接地调用该函数本身,以实现层次数据结构的查询和访问。在函数中直接调用函数本身,称为直接递归调用。在函数中调用其它函数,其它函数又调用原函数,这就构成了函数自身的间接调用,称为间接递归调用。

而采用递归方法来解决问题,必须符合以下三个条件:

1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。

说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用。

2、可以应用这个转化过程使问题得到解决。

说明:使用其他的办法比较麻烦或很难解决,而使用递归的方法可以很好地解决问题。

3、必定要有一个明确的结束递归的条件。

说明:一定要能够在适当的地方结束递归调用。不然可能导致系统崩溃。

好知道是这样以后;我们来写一个众多教材上的程序:使用递归的方法求n!。当n>1时,求n!的问题可以转化为n*(n-1)!的新问题。比如n=4:

第一部分:4*3*2*1n*(n-1)!

第二部分:3*2*1(n-1)(n-2)!

第三部分:2*1 (n-2)(n-3)!

第四部分:1(n-4)!4-4=0,得到值1,结束递归。我给的源程序如下:

可以看到,加上两条printf()和getchar()语句后,可以察看各级调用及其中间答案,很清楚的看到程序的执行过程。运行结果如图1所示,当主函数第一次调用fac0函数的时候,由于n=4不等于0和1,并不立即返回结果1,而是执行c=n*fac(n-1),用实参n-1 (值为3)调用fac()函数自己,即递归调用fac(3)。于是进入第二层调用fac(),这时也没有得出结果,继续用实参n-1(值为2)调用fac()函数自己。同样经过第三层调用后进入第四层调用,这时候n=1,算出1!=1,满足结束递归的条件,然后把得出的结果1返回给第三次调用的fac函数,得出2*1!=2,然后把结果2返回给第二次调用的fac函数,得出3*2!=6,最后第一次调用的fac函数根据第二次调用的返回值算出4!=4*3!=4*6=24,结束整个递归调用,得出最终结果并输出。

我们做事情,一般都是从头开始的,而递归却是从末尾开始的。比如上面的函数,当n>1的时候,就只能求助于n-1,而(n-1)1时,就求助于n-2,然后……直到(n-k)=1时,函数fac终于有了返回值1了,它再从头开始计算,然后一直算到n为止。所以说,递归简直就是一个数学模型,它的工作过程就是自己调用自己。以下是几点对递归的说明:

1、当函数自己调用自己时,系统将自动把函数中当前的变量和形参暂时保留起来,在新一轮的调用过程中,系统为新调用的函数所用到的变量和形参开辟另外的存储单元(内存空间)。每次调用函数所使用的变量在不同的内存空间。

2、递归调用的层次越多,同名变量的占用的存储单元也就越多。一定要记住,每次函数的调用,系统都会为该函数的变量开辟新的内存空间。

3、当本次调用的函数运行结束时,系统将释放本次调用时所占用的内存空间。程序的流程返回到上一层的调用点,同时取得当初进入该层时,函数中的变量和形参所占用的内存空间的数据。

4、在开发过程中使用printf()和getchar()可以看到执行过程,并且可以在发现错误后停止运行。

很多人说所有递归问题都可以用非递归的方法来解决,能不用递归就不用递归。但是对于一些比较复杂的递归问题用非递归的方法往往使程序变得十分复杂难以读懂,而函数的递归调用在解决这类问题时能使程序简洁明了有较好的可读性,因此很多问题用递归可很容易解决。同时由于递归调用过程中,系统要为每一层调用中的变量开辟内存空间、要记住每一层调用后的返回点、要增加许多额外的开销,因此函数的递归调用通常会降低程序的运行效率(在许多情况下,速度的差别不太明显)。

我曾经碰到过这样一个动物繁殖问题:若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛?

如果不用递归函数来做,每当母牛到第4岁的时候才会生下一头小母牛,所以,每年增加的新的1岁小母牛都是上一年3岁的母牛加上4岁的母牛生下数量之和,分析过程如图2所示,给出程序如下:

程序虽然简短,但是可读性太差,不易理解。那么如果用递归函数求此问题呢?

我们先写出函数表达式:f(n)=f(n-1)+f(n-3)

为什么f(n)=f(n-1)+f(n-3)呢,请看:

f(n)-f(n-1)=f(n-3)

因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。源代码如下:

运行结果如图3所示:

可见,递归函数的主要优点是可以把算法写的比使用非递归函数时更清晰更简洁,而且某些问题,特别是与人工智能有关的问题,更适宜用递归方法。递归的另一个优点是,递归函数不会受到怀疑,较非递归函数而言,某些人更相信递归函数。编写递归函数时,必须在函数的某些地方使用if语句,强迫函数在未执行递归调用前返回。如果不这样做,在调用函数后,它永远不会返回,造成无穷递归。在递归函数中不使用if语句,是一个很常见的错误。此外,象汉诺塔问题就只能靠递归才能解决,但是现实中很多问题都是比较简单的,没有象汉诺塔那么复杂,我们只要会用递归编程来为我们解决一些问题就行了,所以就不必深究了。

参考文献

C语言教学初探 篇9

C语言是计算机软件开发领域中流行的程序设计语言之一,它使用灵活、功能丰富、表达力强、生成目标程序质量效率高、可移植性好、语法简洁精妙,很便于描述算法,同时还可以方便直接地控制计算机的底层硬件,使我们能够深入系统底层进行编程,既可用来编写系统软件,也可用来编写应用软件,应用范围很广。其由于功能强大、效率高、简洁灵活和可移植性强的特点,在软件开发领域深受编程人员的喜爱。

C语言由于是理想的结构化语言,同样适合于程序设计教学,所以成为计算机语言教学的主流语言。通过对C语言的学习,可以使学生掌握基本的编程思想,为学习其他编程语言奠定基础。C语言掌握的程度,不仅能直接影响到学生对后继课程的学习,同时对他们以后的学习和发展也起着至关重要的作用。同时,它也是计算机等级考试的主要考试科目。大部分学校采用C语言作为非计算机专业学生计算机等级考试二级语言课程。

2. 教学中存在的问题

然而,但从目前的教学情况来看,学生在学习C语言时往往存在着一定的问题,实际掌握的情况并不理想。由于C语言涉及的概念多、规则广、使用灵活,初学者很难掌握,容易出错。对于大多数的初学者,C语言灵活的语法结构使他们望而生畏,繁琐的细节使他们头晕脑张。同时由于缺乏对计算机结构的全面了解,缺乏对计算机硬件尤其是内存结合很紧密的一些概念,学生基本上很难理解和掌握C语言。

(1)课堂教学中没有突出语言本身的特色。C语言作为一门高级计算机语言,和其他计算机语言有很多相似甚至相同的地方,对于已经掌握计算机基础和其他语言的人,就不能再重复这些知识。一些教师对C语言本身的一些特有的概念,尤其指针、链表的应用,强调不够,既浪费了学生课堂上宝贵的时间,又使得学生对新知识理解不深。

(2)没有充分调动学生学习的积极性。在目前的课堂教学中,还是以教师讲授为主,没有充分发挥学生学习的主动性,启发式教学没有得到充分运用。教师不了解学生课前预习的情况,不了解学生的真正需求、难点和问题所在,挫伤了学生学习的积极性和热情。

(3)对于实践教学环节重视不够。C语言是一门实践性很强的计算机语言,但目前的实践课教学存在很多弊端。例如:学生不明确上机实验的目的,实验的内容不清楚,想干什么就干什么,没有相应的实验要求,考核中上机没有一定的比例。这样,语言课就成了单一为了考试的一门课,其结果有的学生连最基本的实践操作也不会做。

3. 教学内容及方法的改革

学习程序设计不仅是为了掌握一种开发工具,更重要的是用计算机解决问题。因此在教学过程中,教师应改革传统的语法学习内容,将算法教学融入到语言教学中,通过实例由浅入深,使学生在解决具体问题的过程中掌握算法的精髓[2]。

在实践教学过程中,要对《C程序设计语言》教学内容进行调整和整合。首先,对书上的主要内容———I/O格式、控制结构、指针等内容,采用讲、练结合的方法让学生掌握精华部分,对结构体、公用体、文件等内容采用以学生自学为主、答疑为辅的方式让学生掌握这部分内容。其次,针对学生对语言课程学习的单调性和枯燥特点,采用多种教学方法,并在重点内容的教学上辅以大量的课内习题课和课外练习方式,让学生牢牢掌握基本内容。再次,让学生做针对性很强的练习来加强学生的理解。最后,对学生在作业过程中暴露的主要问题集中解决、个别问题单独解决,以此来弥补个体差异,同时兼顾到大多数学生的利益。

在教学过程中,要坚持“结构化程序设计”原则。所谓结构化程序设计,是组织人的思维,以便在合理的时间里,将计算任务用较容易理解的方式表示出来。结构化程序设计方法的基本思路是,把一个复杂的问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。因此,在学生初学程序设计时,这一方法可以养成良好的思维习惯。在教学中,应当向学生强调这样的几点:第一,程序质量的优劣首先取决于程序模块结构的清晰度,要按照一定的标准、一定的原则、一定的风格设计。第二,结构化程序的三种基本结构:顺序、分支、循环,它们是构成程序的基本单位。如果在程序中,所有的模块都只使用这三种单入口、单出口的基本控制结构,那么,不论程序包括多少模块,也不论一个模块包含多少个基本控制结构,整个程序仍然能够显示清晰的流程,这就实现了程序语言的“结构化”。第三,结构化程序设计的基本方法是自顶向下、逐步细化、模块化设计、结构化编码。逐步细化总是和自顶向下结合使用,一般也把逐步细化看作自顶向下的具体表现。

4. 加强实验环节,注重学生动手能力的培养

C程序设计是一门实践性很强的课程,要把学生在课堂上所学的知识在计算机上用程序设计反映出来,必须加强实验环节的教学,强化实验能力和学生的动手能力[3]。为此要做好以下几点:

(1)编写符合学生实际情况的实验讲义,注重学生综合实验能力的培养。

(2)每一堂实验课前,检查学生的实验预习报告,了解学生的预习情况,并对本次实验内容提出具体的要求,在实验课结束前对实验中存在的问题进行总结。

(3)加强实验环节注重学生动手能力培养。

在实验教学过程中注意培养学生的动手能力、独立科研能力及合作精神,绝不允许“一人动手大家看”这种“放羊式”现象出现。学生在做完实验后都由教师检查其结果,打分后方可离开,凡无结果或结果不理想者,必须补做或提供条件让其重做,促使学生在实验中勤动手,也使学生们具有成就感。对于部分综合型的实验尤其强调分工合作,实行小组长负责制,争取小组成员一起协调配合完成。

数字图像处理技术案例教学法探讨

(台州职业技术学院,浙江台州

摘要:笔者就案例教学法在数字图像处理技术中的应用作了初步的探讨,同时,简要介绍了在尝试数字图像处理技术案例教学中的一些体会。

关键词:数字图像处理技术案例教学法分析

1.引言

随着数码技术应用日益普及和深化,数码设备及其产生的数字图像信息的数量以惊人的速度急剧膨胀,而且对数字图像信息的要求与日俱增,数字图像处理技术日益显示其重要地位。数字图像信息的处理涉及多方面的知识,仅仅掌握理论知识不足以指导实践,通过案例教学法,将实践中的实际案例引入课堂,可以很好地衔接教学与实践,具有极好的指导意义。

案例教学法是以对案例的分析解决为主线,通过对案例中的问题进行分析,激发学生的求知欲,调动学生的积极性,使学生自觉主动地学习案例,掌握原理和方法,实行科学的教育思想观念的一种教学方式。它是一种互动式的教学方法,可以实现启发式教学,能够极大地提高学生的学习兴趣,实现真正的教学相长。它更是实现理论联系实际的现实可实施的途径。案例教学法在数字图像处理技术教学中的应用将在更大程度上激发学生学习的学习兴趣和参与的积极性,同时,有利于学生掌握理论知识,并运用知识解决软件开发中的实际问题,最终提高教学质量,达到学校教育培养的目标。

有鉴于此,本文有对案例教学法在数字图像处理技术中的应用作了初步探讨,以期对教育同行和广大学习者有所启发和借鉴。

2.案例教学法的含义

案例教学法(case methods of teaching)可简单地界定为一种运用案例进行教学的一种方法,它是美国当今教育行业中非常盛行而有效的一种方法,在我国正在慢慢推广开来。1910年,美国哈佛商学院最先使用案例教学,开创了案例教学的先河。案例教学法于20世纪80年代初传入我国,它有利于培养学

5. 改进考核方式

采用书面考试、上机考试、课程设计相结合的方式全面考核。计算机语言课的实践性决定了它不要求学生死记硬背各种语法规则和语句格式,而是要求学生在解决实际问题的过程中掌握程序设计方法,提高逻辑思维能力。因此,计算机语言课的考核宜采用书面考试与上机考核相结合的方式,辅之以对课程设计情况的考查。书面考试可以侧重对基本概念的理解和掌握方面,编程题目的涉及面可以较宽,以考查学生对基础知识的掌握情况。上机考核可以让学生在规定时间内对给定的程序设计题目编出程序,并在机上调试通过,题目可以是基础知识的综合运用,这样可以考查学生的综合应用能力和快速编程能力。课程设计的具体做法可以结合实验课,将学生分成若干小组,每组布置一个稍大的有实际应用背景的程序设计题目,组内分工各人完成一部分,再由其中一个人负责完成联合调试任务。通过对课程设计情况的

生分析问题、解决问题的能力,提高教学效果。

案例教学是在学生掌握了有关基本知识和分析技术的基础上,在教师的精心策划和指导下,根据教学目的和教学要求,运用典型案例,将学生带入特定的现场进行案例分析,学生通过独立思考和集体协作,进一步提高识别、分析和解决某一具体问题的能力,同时培养学生的沟通能力和协作精神的教学方式。通过案例分析,学生可以获得蕴涵其中的那些已形成的教育原理、教学方法等知识,同时可以提高和发展学生的创造能力及解决实际问题的能力。更重要的是,学生通过案例教学获得的知识是内化了的知识,是“做中学”获得自己理解了的能驾驭的知识,不再像传统教学下获得的抽象的、过度概括化的生硬知识,它能立即被用到类似的教学实践情境中去解决处理类似的疑难教学问题。所以从美国教育家舒尔1986年在美国教育研究协会(AERA)年会重要演讲中发出要发展关于教学的案例知识的呼吁,时至今日,在众多国家的教育研究领域中都能发现案例教学法的应用。

3.数字图像处理技术案例的选择

概括而言,案例是含有问题或疑难情境在内的真实发生的典型性事件。没有案例,案例教学无从谈起,没有好的案例,便没有有效的案例教学,所以案例的选择在案例教学中至关重要。一个高质量的案例应该具备以下几个特点。

(1)目的性。案例教学的目的是为了让学生理论联系实际,通过案例让学生掌握基本的原理和概念,提高发现问题、解决实际问题的能力。一个好的案例应该使学生在讨论中加深对教材中某一重点或难点知识的理解和把握,能利用课堂学习的理论知识来分析和解决案例中所涉及的问题。所以案例的选择一定要围绕教学目的和教学要求。如果脱离这两个中心,即使案例再生动,其教学效果也大打折扣。

(2)真实性。案例一定是现实中发生的真实事件,是常见又复杂的问题,有助于学生实践能力的提高。

(3)启发性。一个好的案例需要蕴涵一定的问题,能启发学生思考,发现多种解决的途径。问题越诱人深入,越能够给

考查,了解学生运用语言解决实际问题的能力和协作编程的能力。

6. 结语

以上是本人在C语言教学过程中的几点体会,现总结出来,谨供各位同行参考,不当之处,敬请指正。教师需要在教学过程中不断总结,在教学方式、教学方法、课题设计等方面进行探索,为C语言课程建设积累经验,促进计算机语言教学学科的建设。

参考文献

[1]谭浩强.C程序设计[M].北京:清华大学出版社,2001.

[2]张敏霞.程序设计语言课程教学方法改革的探索与实践.中国高教研究,2004,(2).

C语言教学探讨 篇10

一、明确课程目标

C语言课程一般是为应用性教学而设置的, 强调实践性是计算机语言课程教学中特别要注意的问题。C语言的内容繁多, 在有限的课时内不可能也没必要面面俱到, 所以必须突出重点, 突出实用性, 关键在于教会学生正确运用C语言编写程序, 一些细节、具体规则和进一步的知识可以让学生在今后的应用中查阅有关书籍。教师应始终坚持以应用为中心, 以算法为基础, 以培养学生的实践能力为核心, 突出技术实用性和再学习能力的培养。

二、实施教学改革

1、培养学生正确的思维模式

《C语言程序设计》注重由设计算法到书写程序并进行调试的整个过程, 在整个教学过程中应该把“解题思路、方法和步骤”当作授课的重点, 从而让学生明白如何分析、解决实际问题, 逐渐培养学生进行程序设计的正确思维模式。

在讲课中, 应集中精力对章节的知识结构进行详细阐述、对所要解决的实际问题进行深入剖析, 不应花太多的时间放在对语句语法的过多讲解。当遇到实际编程时, 需积极引导学生把“要想干什么”的问题, 直接转化为“要解决什么”的问题。当问题确定以后, 选择正确的算法。

2、“项目驱动”教学

在理论教学中采用“项目驱动”教学法, 整个课程教学围绕一个“工程项目”进行, 通过逐步拓展的实训项目和设计, 将每一阶段的学习进行小结性的贯穿与能力提高。将C的知识点都溶化到一个个实训项目的程序编写中。在课程初期, 主要是进行单项的编程练习, 重在掌握C语言的基本语句、数据类型与程序结构等。在进入数组、函数、结构、指针和文件内容教学时, 开始实训项目的编程实践, 逐步组建“学生信息管理系统”, 并且添加文本菜单, 整合扩展记录添加、排序、查询、统计和记录浏览等内容形成课程设计。

3、授课过程中始终把握五个要点

突出特点:在实际授课中, 要一直向学生强调, C语言是一种函数式语言, 这种函数式的特点正是结构化程序设计思想的很好体现, 讲课时多使用函数, 要求大家也多用函数来编程实现。

侧重分析:分析是解决的第一步。把典型问题从不同角度分析, 再比较各种方法的优劣, 取得最佳方法, 这个过程强化了学生分析问题的能力。

抓住重点、化解难点:讲授重点内容时, 应放慢速度、加重语气, 从而吸引学生的注意力。遇到难点时, 善于化解, 把问题逐渐细化, 所有小问题解决了, 难点自然就解决了。

强化实践:计算机语言的实践就是上机编程, 是培养学生综合运用相关知识解决问题的重要途径, 也是我们掌握教学反馈信息的主要渠道。只有亲自动手、亲自实践, 才能真正体会到语言编程的乐趣。通过上机练习也可以进一步加深对理论知识的掌握, 有利于培养学生的创造思维、独立分析问题和解决问题的能力。

注重反馈:教学过程实际上是一个教师与学生互动的过程。为了获得良好的教学效果, 教师应注重及时从每一个环节获得有关学生掌握所学知识的情况、存在问题的反馈信息, 进行有针对性的辅导。

4、在例题上下功夫

一题多解, 注重算法是程序设计的灵魂, 是教学重点, 也是教学难点, 而语言只是表示形式。没有正确的算法, 计算机将解决不了任何问题。对于C语言所涉及到的算法, 应进行部分精讲多练。

对说明语法规则和语法现象的例子追求尽量简单, 对说明算法的例子追求尽量典型, 除了综合演练外, 所有例子都不要太过复杂;不但要举正面的例子, 而且要特别注意举反例;一个程序例材用后不要轻易抛弃, 可尽量变化使用, 例如每次改一点, 看看情况会如何变化, 加深学生对程序中各项参数和要素的理解;一个题目原型, 可采用多种办法来实现, 讲解时不一定要一次操作完, 例材可以重复使用, 这样可节省背景介绍, 加深学生的印象;对一些典型算法 (如排序) 要注意提取其轮廓框架, 进一步浓缩其算法要点;对使用频度高、容易掌握的算法或程序结构可多讲, 反之, 可少讲;对非结构化的语言来说, 结构化的手段和例子要多讲, 非结构化的可少讲或不讲。

5、一题多解 (分组讨论) 刺激学习积极性

为了调动学生编程的积极性, 我们可以采取分组比较方式, 培养他们合作和竞争意识, 从而达到提高学习兴趣的目的。比如求“素数”数这个例子, 先介绍一种常见算法, 其他方法把全班同学分组自主去解决, 最后比较哪组使用方法最多, 最巧, 同时把这些好方法介绍给大家, 鼓励大家去发现新思路、新方法, 培养他们创造性思维。实践证明这种分组讨论方式不但可以帮助学生掌握多种语句的使用方法, 还能培养他们多种角度分析问题的能力以及集体协作能力。

6、课程考核方式改革

(1) 平时上机训练时给学生留一些编程习题, 每次根据学生编写情况进行测评并占据期末总成绩30%。

(2) 期末前, 给学生留一个综合实训题考核学生综合解决问题的能力, 要求同学们在一定时间内完成, 占据期末总成绩30%。

(3) 期末进行理论考试, 占期末总成绩的40%。

以上是本人在C语言教学中的一些体会, 希望能对大家有所帮助。

参考文献

[1]郭琴:对高职高专计算机专业程序设计教学的思考中国科技信息2008[1]

c语言 篇11

关键词:存储空间图;间接寻址;一级指针;二级指针;存储单元

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)16-31093-03

A Discussion about the Relation of C Language Pointer and Assemble Language Indirect Addressing——Giving Analysis from the Storage Space Digraph

WANG Hai-yan

(Computer Science Department of Suqian College, Suqian 223800, China)

Abstract: C language is a user-oriented procedural language. Pointer is the most flexible part in this language. Assemble language is a language which is processor-oriented and there is no definite conception of pointer, but the similar conception of pointer emergences everywhere. In this paper, it present the application of pointer in assemble language through indirect addressing mode. Depending on the storage space digraph and the relation between pointer of C language and indirect addressing of assemble language, it makes it easier to understand the application and relation between the two languages.

Keywords: Storage Space Digraph; Indirect Addressing; Pointer; Second Rank Pointer; Storage Unit

1 引言

作为最基本的编程语言之一,汇编语言的重要性勿庸置疑,即使是 Linux 程序员有时也需要使用汇编语言解决实际问题,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux 到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。我们常说汇编语言的抽象是C语言, 而C语言中最灵活是C语言中拥有“指针”这个数据类型。那么汇编语言和C语言中的指针有什么样的关系呢?我们也知道在汇编语言中,几乎所有对内存的操作都是对给定地址的内存进行访问来完成的,那么在汇编语言中,绝大多数操作也必然和地址(即指针)产生或多或少的联系。汇编语言和CPU以及内存,端口等硬件知识是连在一起的。汇编语言中存储数据的地方不仅有寄存器而且还有存储单元,更多的数据则保存在存储单元中。因此,对编程人员而言,他肯定迫切地希望访问内存,以保存

更多的数据,本文将重点阐述访问数据的方式。

2 存储空间图的概念

画一个图形,或者观察一个图形,能帮助我们把复杂的程序设计具体化、形象化,有利于掌握程序之间的内在联系,从而更好的理解程序,激发大家对程序设计语言的兴趣。本文用形象的图形解释C语言中指针以及汇编语言中间接寻址方式之间的相互关系。文中运用类似于存储空间图的方法对两门语言进行解释。说它类似于存储空间图是因为这种图形没有用真正二进制描述空间的值和空间的地址,姑且我把这种图形叫做存储空间图。

3 两门语言之间的内在联系

我们知道在计算机中,所有的数据都是存放在存储器中的,访问数据的方式并不是唯一的。在C语言中访问单元数据有两种常见方式,一是通过名字直接访问单元数据;二是通过指针访问单元数据。直接通过单元名字访问数据,两种语言都很简单,我在这篇文章中不加以阐述。接下来我就分一级指针和二级指针分别阐述汇编语言和C语言是如何间接访问内存单元数据,又是以怎样的形式加以表现的。

3.1 C语言中的一级指针和汇编语言中一次间接寻址的联系

3.1.1 C语言中一级指针定义

指针定义形如:数据类型 *指针变量,它的存储空间图表示如下:

图1中X就是一级指针,Y是一个整形变量,X、Y的本质区别在于X单元的值是用于存放内存单元的地址,Y单元是存放任意类型的数据。X之所以指向Y,是因为Y单元的地址赋予了X,同时X所指向的类型和Y同类型。

图1

3.1.2 汇编语言中的一次间接寻址是指通过寄存器或存储单元一次间接寻找操作数。

它的存储空间图表示如下:

图2中si是cpu中的一个寄存器,si中存放着Y所在单元的地址,Y是一个单元的名称,Y单元存放着普通操作数,si之所以指向Y,是因为Y单元的地址赋予了si。

图2

图1、图2中X和si都是用于存放内存单元的地址,我们从中可以得到启迪,汇编语言中也存在着类似C语言的指针。

3.1.3 以下从编程角度深入探悉二者之间的联系。

例1 用C语言指针的方法输出a单元中的数据:

main()

{int a=3,*p;

p=&a

printf("%d",*p); 3

}

例2 用间接寻址方法把a单元中的数据送往al寄存器中:

data segment

a db 3

data ends

……

lea si, a

mov al, [si]

……

以上程序均是操作存储单元中的数据,但都不是通过单元名字操作的。例1用C语言中一级指针的方法,例2用汇编语言中的寄存器间接寻址的方法。那么二者有怎样的联系呢?为了讲清楚这个问题,我把这两个程序分别用以下存储空间图表示:

图3 C语言编程的存储空间图图4 汇编语言编程的存储空间图

上图中p和si其实质都是一级指针,在C语言中是用指针指向的内容,即用*p的形式来取得单元的数据,而汇编语言是通过寄存器一次间接寻址方式来取得单元内容,当然这都要求指针p和寄存器si首先获得单元的地址。(p=&a/lea si, a)。

3.2 C语言中的二级指针和汇编语言中二次间接寻址的联系

3.2.1 C语言中二级指针的定义。

指针定义形如:数据类型 **指针变量,它的存储空间图表示如下:

图5中X相对与Z这个变量是二级指针,它和一级指针的区别在于X这个指针所指向的内容仍然是某个单元的地址(图中是Z单元的地址)。要想输出Z单元的内容,则需要通过两次指向才能完成。

图5

3.2.2 汇编语言中二次间接寻址是指通过寄存器或存储单元两次间接寻找操作数。

它的存储空间图表示如下:

图6中si其实就等价于图5中定义的X,都是二级指针。但在汇编语言中si是一个指针寄存器,无论是作为一级指针还是作为二级指针,我们在使用的时候都是不需要定义的。事实上汇编语言中根本没有一级指针和二级指针的定义,也就是说汇编语言中没有C语言中定义上的繁琐,但你仍可以用C语言的思想来解释汇编语言中的指针问题。

图6

3.2.3 以下从编程角度深入探悉二者之间的联系。

例3 输出以下字符串

main()

{char *p[] = {"ab", "cd", "ef"};

char **sp = p;

int i;

for(i=0; i<3; i++)

printf("%s", **(sp+i));

}

图7 C语言编程的存储空间图

例4 累加数组array中元素和的程序段

data segment

array dw 10,20,30,40,50,60,70,80,90,100

count dw 10

sum dw?

table dw 3 dup(?);地址表

data ends

code segment

main proc far

assume cs:code, ds:data

start:push ds

……

mov table, offset ary

mov table+2, offset count

mov table+4, offset sum

mov bx, offset table

call proadd

ret

main endp

proadd procnear

……

mov si, [bx]

mov di, [bx+2]

mov cx, [di]

mov di, [bx+4]

xor ax, ax

next: add ax, [si]

add si, 2

loop next

mov [di], ax

……

proadd endp

code ends

end start

图8 汇编语言编程的存储空间图

以上程序均是通过两次操作才找出单元中的数据,前者是用C语言中二级指针二次指向的方法,后者是用汇编语言中的两次间接寻址的方法寻找操作数。从上图可知这两门语言的内在联系,即两门语言最终都是通过指针两次寻址来访问操作数。所不同的是:前者是二级指针的概念,后者是两次间接寻址。这种本质相同,只是语言描述上有所不同的概念,从存储空间图的视角可以帮助我们更好的理解他们之间的联系。

依此类推,对于多级指针的学习,我们也可以借助存储空间图来帮助我们更好的分析程序,理解程序,对于一些复杂的问题给予简化,对于不同语言之间的关系我们也能进行更好的深入思考。

4 结束语

本文通过存储空间图深入浅出的探悉了两门语言在寻找数据方面的联系。可以说C语言的指针和汇编语言的寻址方式一直困扰着很多编程者,尤其对二级指针、二次间接寻址的理解及运用更加困难。文中的例题均以最简单的题型来说明这些深奥的道理,而且从存储空间图的视角分析了二者之间的联系。相信这篇文章,不仅能帮助我们运用存储空间图解释问题、分析问题,而且能帮助我们更好的思考不同语言之间的联系,更好的去思考程序设计。

参考文献:

[1] 裘宗燕. C++程序设计语言(特别版). 北京机械工业出版社, 2002.7.

[2] Standley B.lippman. C++ Primer中文版. 人民邮电出版社,20006.3.

[3] 谭浩强. C程序设计(第二版). 清华大学出版社出版,2005.6.

[4] 钱能. C++程序设计教程. 清华大学出版社, 2005.5.

[5] 沈美明. IBM PC汇编语言程序设计. 清华大学出版社,1993.9.

[6] 钱晓捷. 汇编语言程序设计. 电子工业出版社,2003.

C语言函数分析 篇12

1.1 函数

函数是完成某一指定任务的程序模块。一个C语言程序可由一个或多个函数组成, 每个函数完成一定的功能。函数在使用之前必须先行定义。

1.2 变量

变量是在程序运行期间可以改变的量。变量在使用之前必须先定义, 当一个变量被定义后, 可以从定义中获得这个变量的名, 变量的数据类型和变量的存储类型。同时, 根据这个定义所在的位置, 还可知道这个变量的生存期以及它的作用域。

1.3 形参与实参

函数的参数主要用于主调函数向被调函数传递数值。在函数定义时, 函数名后面圆括号内的参数称为形式参数, 简称形参;在函数调用时, 函数名后面圆括号内的参数称为实际参数, 简称实参。在函数调用时, 首先将实参传给形参, 然后才能执行函数体。在C语言中, 参数的类型不同, 其参数值的传递方式也不完全相同, 一般分为“值传递”方式和“地址传递”方式。

2 要求一个结果的程序

2.1 例如:求两个整数的最大值

从题设中已知两个整数, 将它们作为函数的形式参数, 题目的要求是输出两个数的最大值, 可以把它作为函数的返回值, 相应函数的返回值类型为整型。主函数包含三个功能, 输入已知条件、调用函数、输出结果。即:

2.2 传递方式的分析

在以上函数的调用过程中, 整型变量a、b作为实参分别把值传递给形参x、y, 但函数调用完毕, x、y的值没传递给实参a、b。也就是说在简单变量作为实参传递数据的过程是值传递, 即单向传递。

3 求多个结果的程序

3.1 采用全局变量

例如:求一组数据的最大值, 最小值, 平均值。

4 求一组结果的程序

4.1 将一组数据逆置

按照上述的方法已知条件是字符串, 可以将它作为字符数组进行处理, 这样字符数组就成为函数的形式参数。然而, 题目的要求是输出字符串的长度, 若将它作为函数返回值, 这只能返回该字符数组的起始地址, 即通过指针来返回。

4.2 参数传递数据

在函数调用的过程中, 通过参数传递数据甚为常见, 比如上题在数组的应用中, 如果我们把数据元素作为实参传递给形参, 因为每个数组元素实际代表内存中的一个存储单元, 故和简单变量一样, 对应的形参必是类型相同的变量, 这时数据只能从实参单向传递给形参, 如果我们把数组元素的地址 (即数组变量的名字, 它代表数组首元素的起始地址) 作为实参, 对应的形参必是相应基类型的指针变量, 这时数据既可以通过实参传递给形参, 又可以从形参传递给实参, 后者在应用过程中更为常见。

4.3 按值传递与按地址传递

上题可采用函数的参数传递来返回结果。函数的参数传递有两种方法:一种是值传递, 一种是地址传递。值传递, 是指形参的改变不影响实参, 而地址传递, 即形参和实参公用一段内存空间, 形参的改变也就改变了实参。一个数组名是该数组的起始地址, 可以通过数组名作为实参来实现地址传递, 从而解决这个问题。

从以上函数调用过程可以看出, 地址传递事实上把字符数组的地址传递给形式参数 (s) , 形参又把它指向的对象传递给了实参 (str) , 也就是借助于地址实现了双向传递。

5 结语

C语言程序是由函数构成的, 函数间需要交换数据, 函数间交换数据的通道主要有三个:一是函数的返回值, 它一次能返回一个值, 并且是单向传递, 可通过调用该函数引用返回值;二是全局变量, 它可双向导通, 函数既可以直接引用, 也可以通过函数调用, 从而达到双向传递的目的;三是函数的参数, 它既可以是单向导通, 又可以是双向导通, 它是函数间交换数据的最主要的方式。所以C语言中函数如何通过参数交换数据即形参与实参的结合方式是学习的一个重点内容, 同时由于形参与实参的结合方式的复杂性, 它也是学习的一个难点。C语言函数形参与实参的结合方式从总的方面来看和其他高级语言大同小异, 都是“按传传递”方式与“按传地址传递”方式两种。

摘要:本文通过总结自己的学习经验, 简单的分析了C语言程序设计课程中的函数, 就C语言模块化程序设计中函数的参数设置、函数返回值的确定, 以及主函数中函数的调用等, 给出了一些函数分析。

上一篇:留白下一篇:社团组织的创新与发展