C语言分析(精选12篇)
C语言分析 篇1
1 基本概念
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语言模块化程序设计中函数的参数设置、函数返回值的确定, 以及主函数中函数的调用等, 给出了一些函数分析。
关键词:C语言,函数,参数,调用
C语言分析 篇2
如果我们不多加一个字符空间,会发生致命的错误,那么我们通过案例来说明。
-------------我是分割线------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include
#include
#include
intmain
{
charstr[]=“MengLiang”;
//此处分配空间没有考虑到'
char*New_str=(char*)malloc(strlen(str));
strcpy(New_str,str);
printf(“TheNew_str=%sn”,New_str);
free(New_str);
New_str=NULL;
system(“pause”);
return0;
}
-------------我是分割线------------------
我在注释中已经写了,那么这小段程序的结果呢?
-------------我是分割线------------------
正确的修改为:
-------------我是分割线------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include
#include
#include
intmain()
{
charstr[]=“MengLiang”;
//此处的加1就是为'来服务的
char*New_str=(char*)malloc(strlen(str)+1);
strcpy(New_str,str);
printf(“TheNew_str=%sn”,New_str);
free(New_str);
New_str=NULL;
system(“pause”);
return0;
}
-------------我是分割线------------------
C语言的自由意味着我们要自制!
----------------------------------------------
C语言分析 篇3
2008年下半年二级C语言程序设计的全国报考人数为50.99万人,笔试试卷的整卷难度为0.57,整卷的信度达到了0.89。本次考试二级C全国取证率为32.3%。全卷的难度适中,信度较好。现就将本次考试中的部分难题做简要分析,以帮助考生复习备考,取得满意的成绩。
选择题第32题:
有以下程序
#include
void fun( int a, int b )
{intt;
t=a; a=b; b=t;
}
main()
{intc[10]={1,2,3,4,5,6,7,8,9,0}, i;
for (i=0; i<10; i+=2)fun(c[i], c[i+1]);
for (i=0;i<10; i++)printf("%d,", c[i]);
printf("n");
}
程序运行后的输出结果是
A)1,2,3,4,5,6,7,8,9,0,
B)2,1,4,3,6,5,8,7,0,9,
C)0,9,8,7,6,5,4,3,2,1,
D)0,1,2,3,4,5,6,7,8,9,
【答案】A
【分析】
(1)该题考生答对率只有29.6%,59.1%的考生选择了错误项B。
(2)这是一道典型的调用函数与被调用函数之间数据传递的问题。在调用函数时,实参的值将传送给对应的形参,但形参的变化不会影响对应的实参。教材例7.3(P.82)深刻地说明了这个过程。估计很多考生知道这一点,但理解不够深刻,故一旦试题更换格式,就会出错。
(3)这道题区分度较高,达到0.347,说明是一道好题。
选择题第40题:
有以下程序
#include
main()
{ FILE *pf;
char *s1="China", *s2="Beijing";
pf=fopen("abc.dat","wb+");
fwrite(s2,7,1,pf);
rewind(pf); /*文件位置指针回到文件开头*/
fwrite(s1,5,1,pf);
fclose(pf);
}
以上程序执行后abc.dat文件的内容是
A)ChinaB)Chinang
C)ChinaBeijingD)BeijingChina
【答案】B
【分析】
(1)只有28.5%的考生答对,有37.9%的考生选择了D。属于本套试卷里最难的选择题。
(2)在文件使用方式上,本题使用的是“wb+”,意思是为写建立一个新的二进制文件,并在读和写过程中,可以由位置函数设置读和写的起始位置。为降低试题难度,本题特地在语句rewind(pf);后面有注解提示:文件位置指针回到文件开头。因此,在写入字符串“Beijing”后,文件指针回到文件头,再写入“China”,文件的内容就成为“Chinang”,正确答案是B。
(3)该题区分度0.375,属好题。
填空题第8题:
以下程序的输出结果是___。
#include
main()
{int i,j,sum;
for(i=3;i>=1;i--)
{sum=0;
for(j=1;j<=i;j++)sum+=i*j;
}
printf("%dn",sum);
}
【答案】1
【分析】
(1)本题只有19.2%的考生答对。
(2)该题考核考生做题时的细心。在第一个for循环体中,由于每次循环都将sum置0,因此,影响sum值的因素就只与最后一次循环语句相关,此时,i为0,j为1,sum只能是1了。
(3)这道题本身不难,如果考生能够仔细阅题,掌握关键点,就不会出错了。
填空第9题:
以下程序的输出结果是___。
# include
main()
{ intj, a[]={1,3,5,7,9,11,13,15}, *p=a+5;
for(j=3;j;j--)
{switch ( j )
{ case1:
case2:printf("%d", *p++);break;
case3:printf("%d", *(--p));
}
}
}
【答案】9911
【分析】
(1)本题只有16.3%的考生答对,是难题。
(2)该题主要考核考生三个方面的知识,一是选择结构switch语句,一个是自加减运算,另一个是指针。j=3时,执行printf("%d", *(--p));语句,结果是输出9;j=2时,执行printf("%d", *p++); break; 结果是输出9,这是答对本体的关键!*p++指的是使*p作为表达式的值,然后使指针变量p本身增1;j=1时,执行空语句后,继续执行case2语句,此时输出11。所以本题的答案是9911。
C语言发展历史分析 篇4
1 C语言简介
1.1 C语言的概念
C语言是一种计算机程序设计的语言, C语言将高级语言和汇编语言的特点集为一体。C语言是在1972 年, 由美国的贝尔进行研究发明, 并首次应用于计算机之上, 经过六年之后, C语言开始在各种大型、中型、小型及微型计算机上应用, 应用范围有了很大的扩展。由于C语言具有很强的数据处理能力, 对软件及系统的开发有着很重要的意义, 被应用在众多的领域, 因此C语言是目前世界上最为流行的一门高级程序设计语言。
1.2 C语言特点
C语言之所以被应用在各个领域, 就有很广泛的用途, 成为世界上最为流行的高级程序设计语言, 主要是因为C语言具有以下几个特点:C语言虽然是一种高级程序设计语言, 但是C语言可以将低级程序设计语言的语句和结构, 同高级程序设计语言的语句和结构进行紧密的结合, 有很好的实用性;C语言具有其他程序设计语言没有的功能, 数据类型多种多样, 功能较为齐全。为了提高程序的效率, C语言引入指针概念, 使C语言的计算功能和逻辑判断功能得到了进一步的提升;C语言的适用范围很广, 可以应用于各种类型的计算机和操作系统之中;C语言程序设计的文件是由数据序列构成, 保证了C语言程序设计的稳定。
2 C语言的发展历史
C语言的发展是从1972 开始的, 1972 年贝尔实验室发明了B语言, B语言是C语言的前身, 但是由于发明B语言的团队干了一件与电话通讯没有关系的事, 因此该团队被立即解散。解散之后改项目被Dennis Ritchie接接收, Dennis Ritchie将B语言进行了重新的设计与定位, 将其定位于软件系统方面的应用, 并设计了指针系统, 这样就保证了每个程序都会超过500 行, 这就是刚开始的C语言。经过多年的发展, 到了1982 年, C语言程序设计员发现了“缓冲区溢出”的问题, 但是采取的措施并没有对此问题进行有效地解决;到了1984年, C语言程序设计又出现了“错误指针”的问题, 并且数量急剧增加, 这些问题经过C语言程序开发人员一年的研究之后, 找到了解决的办法, 具体解决办法是将C语言进行商业化, 也就是我们后来熟知的C++;到了1986 年, 越来越多的人意识到C语言的好处, C语言可以运用到很多的不同平台之上, 从而C语言得到了较为广泛的应用。C语言虽然得到了广泛的应用, 但是其仍存在一些不足之处, 在1994年, 人们意识到C语言对机顶盒开发很不合适, 为解决这一问题, 程序设计人员对C语言进行了完善, 加入了互联网的特征, 并将其正式更名为Java, 使其实现了跨平台的移植;但是Java的使用存在的很多的问题, 在1996 年末, 程序员用Java创建了Web页面, 但其打开速度慢, 随后的几年当中, 人们一直在对C语言进行不断研究, 对C语言在应用过程中出现的问题进行解决;经过三年之后, 程序开发人员又开发出了J2EE (Java 2 Enterprise Edition) , 但是由于其不成熟, 价格也比较昂贵, 因此采用J2EE的人特别少;到了2000 年, J2EE的运转好了一点, Java的开发者也加大对其开发研究的投资, 取得了一些成就。经过多年的发展, C语言一直在不断的完善, 不断的改变着人们生活, 从而促进了信息技术的发展。
3 C语言发展现状
3.1 C语言对于程序设计人员的重要性
C语言的发明给程序设计人员既带来了机遇又带来了挑战, 因此C语言程序对于程序设计人员极其重要。具体的重要性主要体现在三个方面:首先, C语言程序的语法结构非常简单, 程序设计人员只需要编写简短的程序就可以达到很好的效果, 具有很高的效率, 同时C语言给算法的描述带来了很大的便利, 因此, 学习C语言程序设计是当前程序设计人员必学的一门技术;其次, 通过对C语言程序的设计, 程序设计人员可以对系统的本质有很清晰的了解, 掌握的知识不管是对于Linux、Windows、Unix还是Unix等系统都适用;最后, C语言程序设计有助于新型语言的产生。
3.2 C语言在市场中应用现状
当前C语言具有很广阔的应用市场, 由于C语言具有自己独特的优势, 因此在市场上受到绝大多数企业及程序设计人员的青睐。目前国内外的知名企业对于C语言程序开发人员极其重视, C语言为计算机系统提供了很好的程序, 让计算机发挥出更多有效的功能, 同时, 有很多的语言编辑器的开发也需要借助C语言程序设计来完成, 此外, 智能手机里面的应用软件也是由C语言开发出来的, 可见C语言在当今市场上具有很广阔的应用前景。
4 结语
C语言的发明给人们的生活带来了很大的改变, 在市场上具有很广阔的应用前景, 也在很大程度上推动了信息技术的发展。C语言经过多年的发展, 在给人类带来便捷的同时也在不断的发展与完善, 针对C语言在使用过程中的不足之处, 有关程序开发人员一直在需求解决的方法, 当前社会对于C语言程序设计的人员的需求量较大, 本文对C语言概念、特点及发展历史进行详细描述, 从而加强对C语言的了解。
摘要:随着社会的发展, 世界渐渐的连成了一个整体即“地球村”, “地球村”的形成离不开信息技术的发展, 信息技术在很大程度上改变了我们每一个人的生活。C语言作为计算机软件的一门基础性的入门语言, 被广泛的应用到各个领域, 在市场上具有较好的应用前景。基于此, 对C语言进行了简单的介绍, 对C语言的发展历史进行了分析, 同时阐述了当前C语言的应用现状, 希望为C语言爱好者提供一些借鉴资料。
关键词:C语言,语言特点,程序设计
参考文献
[1]侯昌昌, 朱玉龙.汇编语言与C语言在编程中的交叉应用[J].安徽工业大学学报, 2003 (2) .
[2]郭小梅.汇编语言与C语言的混合编程及应用[J].南京农专学报, 2002 (4) .
C语言分析 篇5
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语言分析 篇6
【关键词】C语言;编程技巧;学习技巧;教学效果
前言:我国高校已经普遍开展C语言的学习,对培养知识经济时代下高素质、复合型人才起到了重要的推动作用。然而在实践过程中却发现,学生学习C语言的动力不足、掌握及运用能力较低,为C语言进一步发展蒙上了一层阴影。所以本文首先对C语言学习过程中的难点进行分析,随后探讨C语言编程技巧的应用内容,以为学生学习及课堂教学效果的提升提供帮助。
一、当前C语言学习难点
(一)函数的定义和应用
由于C语言是一门较为高级的计算机汇编语言,在学习过程中包含了大量的函数,而相应函数如何定义和使用成为当前学生学习的难点之所在。众所周知,C语言编程过程中往往会通过汇编语言来将函数功能在相应代码中实现[1]。然而,在实际运用及学习过程中经常会出现函数嵌套的事情发生,而产生该现象的原因则是在C语言编程过程中已經定义了一个函数,但是操作者并没有注意到此种情况,当使用不同定义的函数时,系统就会提示不能在函数体内定义函数。所以在C语言学习过程中关于函数的定于和使用是困扰学生的主要问题。
(二)编写程序的工整严谨性
运用C语言编写程序是当前知识经济时代下较为常用的程序编写方式,需要操作人员具有较强的逻辑思维能力以及编写水平,并且耐心要足够良好。编写程序主要是通过计算机检验来实现相应的功能,在编写过程中每一个细节问题都需要处理到位。一旦某个环节某个字母没有正确书写,那么将会导致编写的整段程序无法运行,降低了程序编写效率。而编程工整性和严谨性是考验每一个学生学习效果及能力的重要指标。但是对于当前大多数学生来说,编写程序仍然是一个难点问题,出错几率始终居高不下,导致学生在经过了很长时间学习后依然无法掌握正确的编写技巧,继而丧失了继续学习的兴趣和信心。所以C语言学习过程如何运用编程技巧来提高编写程序的工整严谨性成为当前亟待解决的问题。
二、C语言编程技巧在C语言学习中的应用
(一)指针技巧的掌握与运用
C语言编程技巧中指针是一个较为特殊的变量,在其中存储着大量的数值,可以被称作是内存地址之一。指针技巧可以通过分解来将各部分内容展现在学生面前,以促使学生明确指针的使用。当前C语言学习中指针由指针类型、指针指向类型、指针值、指针自身所占内存区所组成。指针类型是C语言学习及编程中最为常见的知识点,学生可以通过去除指针声明语句中所包含的指针名字来判断该指针类型,如:int*ptr、char*ptr,将指针名字ptr去掉后剩下的int*、char*即为指针类型。学生通过该技巧的使用可以在短时间内明确所有C语言指针的类型,为其应用提供了便利条件。指针指向类型相较于指针类型稍稍复杂一些,上例中去掉*后剩下的int、char等即为指针指向类型。所以指针技巧的掌握与运用主要在于学习者的耐心及细心程度,加强其主观重视程度后,学习C语言将会更加得心应手。
(二)C语言特有函数技巧的掌握于应用
C语言编程中函数的应用是实现特定功能的基础与前提,学生往往在函数的定义及使用过程中出现不同程度的问题,造成其学习效果不佳。因此,在C语言课堂教学中教师可以在函数定义所包含的名字、参数名称、类型以及函数返回值类型逐步分解并一一明确其各组成部分的功能,并且将独立的函数存储在编译系统数据库中,使用时输入#include指令即可将想要使用的头文件放入本文件中,使得C语言特有函数能够在短时间内被学生掌握及利用[2]。随着计算机技术快速发展,C语言特有函数的编写已经可以通过程序化步骤来实现,在方便了使用的同时,也降低了学生学习难度,使得C语言教学效果得到大幅提升。
(三)算法技巧的掌握与应用
算法是程序编写工作的重要组成部分,也是学习过程中花费时间较长的环节。为了能够提高学生学习效率,教师需要在课堂教学中将常用流程符号普及给学生,并且利用流程图来讲算法的应用逐一分解,向学生直观展示算法的应用。当前还可以利用自然语言来表示算法,同时与流程图讲解相结合,使得具备一定数学知识的学习者能够熟练掌握算法技巧,并运用在具体的程序编写工作中。C语言是建立在数学思想基础上的应用学科,数学思维在算法技巧掌握及应用中起到了重要的辅助所用。所以,在通过系统展示及分步讲解基础上拓展数学思维去寻找C语言程序编写规律,可以为其血气起到事半功倍的效果。
(四)位运算技巧的熟练掌握与应用
C语言之所以独立于其他计算机语言,就在于位运算使用。位运算是一种以二进制为对象、进行各种程序、数据、结果运算的一种基本算法。特别是在计算机文件中其应用更为频繁,掌握了位运算技巧,就相当于掌握了打开宝藏大门的钥匙。比如:数独时需要使用大量Hash表来统计九宫格里已经存在那些数据,如果在一个九宫格之中已经存在数字2和5,那么采用位运算后该九宫格可以使用数字18来表示;如果某一行或某一个九宫格为运算状态为511,则代表了该九宫格空间已满。要想改变其状态,只需要对其进行位操作,而省去了将数据重新转换成为二进制修改之后在转回来的步骤,使得整个C语言学习效率得到大幅提升[3]。
结论:综上所述,本文通过对当前C语言学习难点的分析得出了困扰学生的主要问题在于函数的定义及使用和编写程序的工整严谨性。并以此为依据提出了C语言编程技巧中指针、特有函数、算法、位运算等技巧熟练掌握是提高C语言学习效率的关键。希望通过本文的分析能够为我国高校改进C语言教学提供帮助,以促使C语言知识正迁移。
参考文献:
[1]段煅.C语言编程技巧在C语言学习中的应用[J].电脑编程技巧与维护,2010,12(20):150-151.
[2]余勍,王捷.浅谈C语言编程技巧在C语言学习中的应用[J].信息通信,2013,25(07):108.
用GO语言实现C语言词法分析器 篇7
编译器在计算机科学中有着重要的作用。词法分析器是编译程序的第一阶段, 其通过读入源程序的字符流, 把这些一个个连续的字符分解成有意义的词法单元, 而后输出给语法分析器。又由于词法分析器相对简单性, 大多数编译器实现都采用手工实现, 而不是自动实现, 所以理解并实现词法分析器, 是一个重要的技能。而GO语言是一个新的极具潜力的系统级语言, 两者结合, 即用GO语言实现C语言词法分析器, 在教学上有重要意义, 可帮助学生学习GO语言的同时, 帮助掌握和设计实现词法分析器。
2. GO语言介绍
GO语言是谷歌2009年发布的系统级程序语言。谷歌之所开发该语言, 因自重要的系统级编程语言诞生距今已超过十几年了, 这段时间计算机世界已经发生了很大的变化, 尤其过去十多年间软件开发的难度令人沮丧, 仍没有哪种主流的编程语言能很好适合软件的大型并行开发。例C语言是简单, 但不适合大型开发;C++语言过于复杂;而java语言性能有问题, 繁琐, 并也逐渐走向复杂;python灵活, 但性能也有问题。
GO语言简洁明了, 需要记的语言细节少, 能快速编译、快速执行, 可用于编写核心层和驱动层, 而以往这些都是C或C++的支配领域;GO语言灵活, 内置类Python的list, map等常用数据结构, 使得开发快速;GO语言大量简化了指针, 更安全, 绝大部分问题都能消灭在编译过程中;完善的模块支持, 友好的并行架构, 适合于大型软件的并行开发, 尤其适合云计算的今天。GO语言可以说结合了C语言和python语言的优点。
3. C语言词法单元
词法分析器的功能就是从左到右读入程序语言的源文件, 而后以尽量最长为原则形成词法单元流。C语言的词法单元由以下5类组成:标识符、关键字、常量、运算符和分隔符, 另外两个特殊结构:注释、预处理器。
(1) 标识符由大小写拉丁字母、数字和下划线组成的序列, 但不能以数字开头。与关键字相同的标志符则作为关键字, 如if、int、then等等。
(2) 常量分为四种不同的类型:整型 (如14、0x13等) 、浮点型 (如3.14、1.0e3等) 、字符型 (如’A’、’B’等) 和字符串型 (如”copy”、”enter”等) 。
(3) 运算符, 如+、>、<等。
(4) 分隔符为 (、) 、{、}、...、, 、;、:。
(5) 注释作为空格处理, 其分为多行注释和单行注释。多行注释由/*开头, 以*/结束。单行注释由//开始, 至行结束。
(6) 预处理器用特殊的预处理命令行控制, 这些命令以#打头。
4. 设计实现
4.1 查找表
本系统构建了几个查找表, 用于简化程序, 尤其GO语言内置实现了字典数据类型, 使得查找表的构建方式更为简单。
字符类型查找表, 由一个数组构成的查找表实现, 用于把字符的数值映射为8种类型:运算符、数字、字母、空格、回车、单引号、双引号、null (非法字符) 。如把‘A’映射为字母类型, ‘0’映射为数字类型。
关键字查找表 (包括预处理命令) , 使用字典方式实现。标识符在该字典中查找到的就是关键字, 以与一般标识符区分开。
运算符查找表 (包括分隔符, 但不包含单引号和双引号) , 使用字典方式实现。若运算符在该字典中查找到, 则说明存在;若获得的第1项为“1”, 说明该运算符识别结束;若获得的第1项为“2”, 则运算符识别尚未结束, 还需要读入新字符来判断。如刚读入“+”, 则可能是“+”, 或者是“++”, 或者是“+=”, 所以还需要再读入新字符才能判断。
4.2 主流程
本系统的主流程图见图1, 其首先读取一个字符, 而后跳到当前的词法单元状态去处理该字符;处理完该字符后就跳出到读取字符处。本系统的处理方式并非是传统方式, 在某个词法单元识别循环中不断读取字符, 至该词法单元识别完成, 再跳出到主程序。主要是想给学生留下些修改空间, 学生能自己比较两种方式的优劣。
4.3 运算符态处理
运算态处理函数的流程图见图2, 若输入是运算符 (或者分隔符) , 会查找clang_op_map表, 而后看其返回值在进行相应处理。
4.4 数字态处理
数字态处理函数是词法单元识别中最复杂的, 其要处理8进制、16进制、浮点数, 以及长整数的结尾u、l等等, 其流程图见图3。
4.5 其他处理过程
空闲态处理函数, 根据读入的类型为运算符、数字、字母、空格、回车、单引号、双引号等不同类型, 把状态设置为相应的状态。数字若为0, 则还要标为8进制;而回车类、空格类型则忽略。
标识符态处理函数, 对输入字符进行判断, 若为字母或者数字则继续退出去读下一个字符;否则识别完成, 并查找关键字clang_key_map字典, 若有存在, 则该字符串为关键字。
预处理态处理函数, 对输入字符进行判断, 若不为字母, 则识别完成, 并且也查找关键字clang_key_map字典, 若不存在, 则错误处理;若为“#include”, 则进入#include态。新增#include态, 主要是想把“<文件名>”作为一个词法单元。
字符串态处理函数, 对输入字符进行双引号判断, 若是双引号, 且“”不为有效, 则识别完成。单字符态、多行注释态、单行注释态处理函数也有相应的处理过程。
4.6 结果输出
对本系统以大量linux内核源代码文件进行了测试, 均未出错, 结果也验证正确。如用linux内核源代码“include/linux/cpumask.h”文件做测试, 该文件第78行代码为“extern const struct cpumask*const cpu_possible_mask;”, 输出如下:
其第1列为行号;第2列为列号;第3列为该词法单元的类型:关键字为0, 整数为1, 浮点数为2, 字符串为3, 标识符为4, 字符为5, 运算符为6, 预处理命令为7。
5. 结语
本文用GO语言设计并实现了C语言的词法分析器, 利用GO语言内置的字典数据类型实现了查找表, 使得程序更为简单。同时, 本系统教学上可让学生参考、做实验, 以及做二次开发。
摘要:词法分析器是编译器的第一阶段, 其从左到右读入程序的源文件, 而后分解出有意义的词法单元。大多数编译器的词法分析器都采用手工实现, 所以学习、实现词法分析器在教学上有重要意义。本系统使用新的系统级程序语言GO语言, 并利用其内置的字典数据类型, 构建出几个查找表, 简化了程序, 实现了C语言的词法分析器。
关键词:词法分析,编译程序,GO语言
参考文献
[1]孙悦红.编译原理及实现[M].清华大学出版社, 2005
[2] (美) Harbison.C语言参考手册 (第五版) [M].机械工业出版社, 2003
[3]温敬和.编译原理实用教程[M].清华大学出版社, 2005
C语言分析 篇8
1 汇编语言和C语言的特点
1.1 汇编语言
汇编语言是人们基于初级计算机语言,也就是二进制语言的基础,将原本“0”和“1”组成的二进制字符串,换用较符合人类思维逻辑的符号来表达,比如,用“ADD”代表加法指令,用“ADC”代表加进位的加法指令,用“INC”代表加1指令,以更简明的方式来表达指令要求的符号化计算机语言。
由于符号化表达更符合人类思维逻辑的特征,也更易读易编写,汇编语言比二进制语言更易理解,人们在编程时更容易及时发现错误并修正错误,且后期的软件维护也变得相对简单。根据计算机的硬件系统来编制完成的汇编语言程序,可以将计算机不能识别的汇编语言翻译成计算机可以识别的二进制语言,从而完成信息指令的传输。用汇编语言进行编程时,数值运算比较复杂,数据处理的工作量大而繁琐。但汇编语言的优点在于编程效率高,可以充分发挥计算机硬件系统的功能,程序相对精准简练,软件质量比较高,所以汇编语言依旧是现在进行软件开发的重要工具。
1.2 C语言
C语言是面对过程的程序语言,摆脱了对计算机硬件系统的依赖,移植性比较强,在不同型号的计算机上都已成功移植,应用范围广且数据处理能力强。加上C语言处理数据的灵活性强,在各领域的实际软件应用编程时都普遍采用了C语言,例如单片机软件系统开发、三维图编写、动画编写等。
1.3 混合编程的意义
在进行程序设计时,C语言可以高效地生成目标代码,但是汇编语言生成的目标码质量更高,而且利用汇编语言完成对计算机硬件的特殊操作更快捷准确。利用汇编语言编程时,数据运算较繁琐,但C语言具有强大的库函数,可以高速完成对数据的处理。所以合理地混合使用两种语言进行程序设计,可以有效提高工作效率和工作质量。在混合编程时,C语言的主程序和汇编语言的主程序允许互相调用其子程序,也将汇编子程序插进C语言程序中,同时如何进行参数传递及确定调用关系非常重要,也要考虑到不同功能模块之间的连接问题。运用混合编程技术既可以发挥汇编语言的精确性优势及充分运用计算机硬件的功能,又可以利用C语言强大的数据处理能力,可以有效解决在大型程序设计中遇到的问题[1]。
2 混合编程的注意事项
2.1 注意保护堆栈和寄存器,以完成参数传递
汇编语言程序利用寄存器来完成参数信息的传递,C语言程序利用堆栈传递参数数据给汇编语言程序。C语言程序在调用汇编语言的变量和过程时,按下述的过程输送数据:C语言调用程序将参数按顺序压入堆栈→汇编语言用BP寄存器加上对应的偏移量来存取堆栈中C语言程序传递过来的参数→汇编语言进行程序转换→C语言从堆栈按顺序弹出的参数中获得操作数据。
所以在编程之前,应充分熟悉并掌握所用编程语言的多类别的堆栈的结构、生成和入栈模式。对汇编语言而言,应根据变量和过程的参数个数来选择合适的寄存器。当参数小于或等于4个时,将参数数据按次序一一传送到R0、R1、R2和R3寄存器;当子程序的参数个数大于4个时,将多出的参数数据按照原次序的反方向分别传送到数据栈[2]。
在C语言程序调入使用汇编变量和过程时要注意保护各种重要的寄存器,如DS、BP、SI、DI、AX和DX等,根据需要将数据用PUSH指令压入堆栈来保护,以保证参数的顺畅传递,否则会导致出现失误。
2.2 注意汇编子程序的返回值
返回值通过AX和DX寄存器来传递。少于16位二进制的返回值存放于AX,而32位的返回值中的低16位仍存放于AX,而其余的高16位则存放于DX寄存器中。大于32位(如浮点)的返回值存放于静态变量存储区[3]。
2.3 应统一两种语言的存储模式
汇编语言是使用Model来生成符合用户已选存储模式的段定义。而C语言则有6种存储模式可供选择,所选择的存储模式不同,其定义的代码段就不同。在混合编程时,汇编语言和C语言最好选择统一的存储模式,例如汇编语言选用Model Small模式来适应C语言的Small模式,以确保不同功能模块的准确衔接。
2.4 变量和函数的互相调用时命名方式的约定
在运用C语言进行程序设计的过程中,如需要使用汇编语言程序的过程和变量,汇编语言应加public标识,并在过程和变量名前加下划线,比如public_fun。
而汇编程序在调用C语言程序的函数或者变量时,应在调用部分的代码前添加下划线,并在汇编语言程序的命名时用extern加以说明,其格式分别是:extern_变量名:变量类型或者extern_函数名:函数类型[4]。
3 汇编语言和C语言混合编程方法
在完成功能复杂的软件的设计时,需首先将软件划分成不同的功能模块,每个功能模块以子程序或函数的形式存在,针对每个功能模块的不同特征,合理选用恰当的计算机语言来单独编程,而后将每个模块编译为相应的目标文件,所有文件组合后形成所需命令。
3.1 C语言程序直接插入单独汇编指令
C语言程序可执行汇编语言的ASM指令,故可运用ASM在C语言程序中嵌入所需汇编指令,不同的情况下,嵌入格式不同。
单个语句插入格式为:
“asm汇编语言指令代码”
如语句多,格式应为:
格式要求:(1)必须在对应的汇编程序代码前加入ASM;(2)必须按照C语言的环境要求使用分隔符“;”与注释分界符“/*”和“*/”。
这种混合编程方法虽然简单易行,但是直接插入的模式一旦出现细微偏差,就会影响原来的C语言环境,出现差错。所以此方法适用于需要汇编语言程序为程序实现一些特殊的硬件功能,且汇编程序简短时采用。此方法不适用于嵌入较复杂的汇编程序[5]。
3.2 以C语言为主,插入汇编语言
在运用C语言编程时,如果出现需要用汇编语言编程来实现特定功能的情况,且对应的汇编语言程序较为复杂,需要大量的汇编语言才能实现软件所需功能,则不应选择直接嵌入的方式,而应考虑将这部分软件程序划分为独立的功能模块,用汇编语言独立编制程序代码后,整体插入C程序对应位置。
在C语言主程序调入使用汇编语言的子程序的过程中,必须保证汇编源代码的正确性,才能确保调入使用过程的正确,最终顺利实现软件所需功能。因此,汇编源程序要严格依照系统要求来编制。
二者对照如表1所示。
必须用public和下划线来标明汇编子程序的外部函数属性,也就是严格按照下述格式:public_变量类型(或者变量名称),以保证C语言顺利地调入使用汇编子程序。
3.3 以汇编语言为主,C语言为辅
汇编语言具有在输入程序时能够直接采取二进制数据、控制硬件操作等C语言不具备的编程特长,因此汇编语言允许以主程序的方式调入使用C语言的函数和过程。
在调入使用时,要注意如下事项:(1)在被调用C语言函数前要加上extern标识,以表明其外来性质,以免跟原程序的代码弄混;(2)注意在调用时,要按照反向顺序依次将C语言函数的参数压入对应的任务堆栈,也就是保证最后子程序的最末位参数首先压入堆栈;(3)同时,在汇编主程序中用“call near ptr函数名”的形式完成调入使用C函数,不再加入原针对堆栈的指令[6]。
操作示例:
C子程序:
其过程为:前4个参数保存在r1-r4中→后两个参数留在堆栈用b1指令调用C程序模块→r0中得出结果。
4 结语
对于一些特殊领域的特殊应用需求的软件而言,混合编程可以解决很多难题。整个编程过程中交互使用两种语言,完成数据模型的搭建和数据的共享,以按照软件的功能需求,最终成功地完成程序编制。
摘要:C语言虽是高级计算机语言,但汇编语言可以高效率、高质量地发挥计算机硬件操作系统的功能,在程序编写时将二者有机结合并加以利用,可以事半功倍。
关键词:汇编语言,C语言,嵌入,相互调用,程序调试,混合编程
参考文献
[1]史斌.ARM汇编语言和C/C++语言混合编程的方法[J].电子测量技术,2006,(6).
[2]陈百良.单片机C语言与汇编语言的混合编程[J].科技信息,2008,(6).
[3]牟淑杰.C语言与汇编语言的混合编程[J].电大理工,2004,(1).
[4]杨加国.单片机C语言与汇编语言的混合编程[J].成都大学学报(自然科学版),2008,(3).
[5]左艳丽.C语言和汇编语言混合编程的方法和实现[J].职教与经济研究,2008,(3).
C语言常见错误分析与思考 篇9
简单语句:以分号结束的一条语句。复合语句:用一对花括号括起来的一组语句。空语句:只有一个分号, 而没有表达式的语句。注释语句:注释语句以“/*”开头并以“*/”结尾。用来给程序加注释。
2 C语言的特点
1) 比其他高级语言更接近硬件, 比低级语言更容易描述算法, 程序易编、易读、易查、易修改。可以说兼有高级语言和低级语言的优点。
2) 数据类型和运算符十分丰富, 既有系统定义的简单类型:整型、实型、字符型等。又有用户自定义的构造类型:数组类型、结构体类型、共用体类型等。程序设计和算法描述更为简单和方便。
3) 语法结构简单, 语句数目少, 简单易学。
4) 它是一种结构化程序设计语言, 提供了完整的程序控制语句 (选择语句和循环语句) , 很适合结构化的程序设计方法。
5) 它是一种模块化程序设计语言, 适合大型软件的研制和调试。
6) 它提供了大量的库函数供调用, 简化了程序设计工作。
7) 生成目标代码质量高, 一般只比汇编生成的目标代码效率低10%~20%。
8) 用C语言写的程序可移植性好。一般不用修改就能用于各种型号的计算机和各种操作系统。
9) C语言学习难度较大, 特别是指针、地址、函数调用等内容较难度大, 需要认真学习才能掌握。
3 对C语言常见错误分析
1) 使用标识符时, 混淆了大小写字母的区别。
编译程序时候, 编辑系统会提示A1和A2这两个变量未定义而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上, 符号常量名用大写, 变量名用小写表示, 以增加可读性。
2) 遗漏分号出现的错误, 这个错误一般常出现在初学者所编程序中。
3) 忽略了“==”与“=”的区别。
在高级语言BASIC程序中, 用“=”符号作为关系运算符“等于”。如在程序中可以这样写
但C语言中, “==”是关系运算符, “=”是赋值运算符。例如:
前者是比较运算, 判断z和10是否相等, 如果相等, 后者则是把x值赋给z。由于习惯成自然。初学者在这方面很容易出错。
4) 忘记必要的逻辑运算符, 例如:
此表达式的含义为x>4并且x<5, 但在C语言中。关系运算符遵循左结合性, 即结合性从左向右, 在此规则下, 4<x<5的求值是先求x>4, 得到一个逻辑值0或1, 再继续拿这个数与5比较, 结果恒为真, 失去本题目本意。对于类似情况, 正确的做法是, 应使用逻辑表达式, 写成:
5) 地址运算符“&”不能正确合适添加。
这类做法是错误的。Scanf函数的作用是:按照x、y在内存的地址将x、y的值存进去。“&x”指x在内存中的地址。“&y”指y在内存中的地址。
应写成:
6) 输入数据的方式与要求不符。
(1) 例如:scanf ("%d%d", &c, &d) ;。输入时, 不能用逗号作两个数据间的分隔符, 如下面输入不合法:5, 6。输入数据时, 在两个数据之间以一个或多个空格间隔, 也可用回车键, 跳格键tab。
(2) scanf ("%d, %d", &c, &d) ;
C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符, 则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:5, 6回车。但此时不用逗号而用空格或其它字符是不对的。例如:56回车, 或者5:6回车。
7) 输入数据的同时时, 规定了输入数据的精度。例如:scanf ("%8.3f", &c) ;应该是输入数据的时候不能规定精度, 此种做法不合法.
8) switch语句中忘掉了必要的break语句。
例如:根据考试成绩的等级打印出百分制数段。
由于漏写了break语句, case只起标号的作用, 而不起判断作用。因此, 当x值为1时, 输出为:Spring Summer Autumn Winter Error!
原因是丢失了break语句, 正确的写法是:
9) 忽视了while和do-while语句在细节上的区别。
可以看到, 当输入W的值小于或等于20时, 二者得到的结果相同。而当W>20时, 二者结果就不同了。因为while循环是先判断后执行, 而do-while循环是先执行后判断。对于大于20的数while循环一次也不执行循环体, 而do-while语句则要执行一次循环体。
10) 使用未赋值的自动变量, 例如:
运行结果是-858993460, 这里的-858993460是一个不可预知的数, 因此, 在引用自动变量时, 必须对其初始化或对其赋值。
11) 使用库函数时, 没有用“#include”命令将该原型函数的头文件包含进来, 例如:
输出结果为:w=0.000000, 这显然是错误的, 正确的写法是:
12) 在定义数组时, 将定义的“元素个数”误认为是可使的最大下标值。
C语言规定:定义时用c[10], 表示c数组有10个元素。其下标值由0开始, 所以数组元素c[10]是不存在的。
13) 初始化数组时, 未使用静态存储。
int a[3]={3, 4, 5};这样初始化数组是不对的。C语言规定只有静态存储 (static) 数组和外部存储 (exterm) 数组才能初始化。应改为:static int a[3]={3, 4, 5};。
14) 定义形参时同时定义了函数中的局部变量。
形参应该在函数体外定义, 而局部变量应该在函数体内定义。应改为:
15) 对指针变量赋予非指针值, 如:
由于p是整型, 而q是指向整型的指针, 它们的类型并不相同, q所要求的是一个指针值, 即一个变量的地址, 应该写成:
int p, *q;q=&p;这样才是正确对指针变量赋予非指针值。
4 结语
对于任何一种程序语言的学习, 没有捷径, 只有反复上机实验, 发现问题不断解决问题, 熟能生巧, 举一反三。
摘要:就C语言的语句展开分析, 介绍了C语言中的语句分类、C语言与其他许多语言相比具体有什么特点, 最后通过实例例举C语言常见错误及简析。
关键词:C语言,语句分类,常见错误
参考文献
[1]李建华.C语言程序设计[M].上海:上海复旦大学出版社, 2014.
[2]郑凯.二级C语言程序教程[M].武汉:华中科技大学出版社, 2011.
C语言指针常用形式的分析 篇10
众所周知, 在C语言中, 我们使用到的数据 (此处的数据不包含程序指令) 通常有两类:一类是数值不可改变的, 我们称为常量, 另一类是数值可以随时更改的, 我们称为变量。常量与变量的这种区别仅仅是表面的现象, 深层次的区别在于:常量是以固定的方式被编写到了最终的计算机指令中, 而变量却是存放在计算机内存中, 每一个不同的变量都会在计算机内存中占据一块独立的存储空间, 在一个通用的32位计算机系统中, 一个char数据类型占用1字节的存储空间, 一个int或者long或者float数据类型占用4字节的存储空间, 一个double数据类型占用8字节的存储空间, 其他还有很多不同的数据类型, 各自占用存储空间。
既然变量在计算机内存中会占用一定的存储空间, 那我们就有必要并且也必须知道这些变量到底被放在了计算机内存的哪个位置。所以, 我们首先需要对计算机内存中的每一个存储单元进行编号, 这些不重复的编号就被称作内存单元地址, 简称地址。通常为了使用上的便捷, 我们在对这些地址进行记录的时候采用十六进制的方式, 如果是8051系列的CPU, 最大内存支持64K, 也就是0x0000—0xFFFF, 而如果是通用的32位x86系列CPU, 最大内存支持4G, 也就是0x00000000—0x FFFFFFFF, 这种记录方式给我们带来的最大好处就是编号整齐, 读起来一目了然。
什么是指针, 指针就是一个内存单元的地址。前面提到了计算机内存的每一个存储单元都有一个唯一的地址, 每一变量在计算机内存中都会占用一定的存储空间 (通常变量都占用不止一个单元的存储空间, 我们用它们的首地址作为整个变量在内存中的地址) , 以一个通用的32位计算机系统为例, 这个地址的长度是一个8位的十六进制数。而在C语言中, 有一类非常特殊的变量, 它们在内存中占用的空间恰好就是4个字节, 而存储的内容就是一个以8位十六进制数表示的内存单元地址, 这就是指针最本质的揭示。不论什么类型的变量, 他们的首地址肯定都是一个8位的十六进制数, 所以, 任何一种数据类型的指针都占用4个字节。
2 常用指针类型的解析
2.1 基本类型指针
此种情况下, 定义整型数据的指针p (即p变量中存放了一个内存单元的地址, 该地址是某个整型变量在内存单元中的位置) 。所以, 可以将整型变量a的地址 (&a) 赋值给整型指针p。
2.2 指针与数组
此种情况下, 定义整型数据的指针p, 同时定义了整型数组a, 对一个一维数组而言, 数组名称即为该数组中第一个元素的地址, 也就是数组的地址。所以可以将整型数组的地址a赋值给整型指针p。
2.3 二级指针
此种情况下, 定义了整型变量a和整型指针p, 和我们分析的第一种情况完全一样。但又定义了int**pp, 即为一个二级指针。怎么理解二级指针呢?前面分析过指针的本质就是一个变量, 该变量在内存中占用4个字节的存储空间, 而该变量区别于其他普通变量的就是其存放的内容 (值) 是另外某个内存存储单元的地址。既然指针也是一个变量, 那么很显然指针变量本身也具有一个内存单元, 即指针本身的地址, 我们通常使用一个二级指针来表示这一概念。同理, 可以派生出更多级次的指针, 但因为其过于复杂, 一般没有实用价值。
2.4 指针数组
此种情况下, 定义了一个指针数组a, 数组中共有4个成员, 每一个成员都是一个整型指针, 而指针p是一个二级指针。
2.5 数组指针
此种情况下, 定义了一个指针p, 指针p指向一个有4个元素, 且每个元素都是整型的数组。而a是被定义为一个有4个整型变量的数组, 所以可以将a赋值给p。对比第二种情况和第五种情况, 在第二种情况下, 是将一个整型数组的地址赋值给了一个整型指针, 而在第五种情况下, 是将一个整型数组的地址赋值给了一个整型数组的指针, 考虑到赋值关系左右两端应该具有的一致性, 第五种应用方式似乎比第二种应用方式更完美。
2.6 结构体指针
在此种情况下, 定义了一个结构体类型struct Stu, 并且定义了一个该结构体变量a和一个该结构体指针p, a和p的最大区别就在于:a表示一个实际存在的结构体内容 (即a变量中有一个整型成员和一个字符数组成员, 共占有24字节的存储空间) , 而指针a仅仅表示了一个内存单元的地址, 共4个字节 (一个基本数据类型的指针和一个极其复杂的结构体类型的指针都分别只有4个字节的存储空间) 。
2.7 指针函数
此种情况下, 定义了一个函数func, 该函数有两个整形变量作为参数, 返回值类型为整形指针。这就是通常称的指针函数, 其本质仍然是在定义一个函数。
2.8 函数指针
此种情况下, 定义了一个指针 (而不是一个函数) func。该指针指向了一个函数 (即该指针变量中存放了一个函数在内存中的存储地址) , 这个被指向的函数具有两个整形变量构成的参数, 返回值是整型。在对该函数指针赋值的时候, 必须采用一个类型完全一致的函数的名称。当使用这个函数指针对函数进行调用的时候, 可以采用下面两种方法:
在通过函数指针调用函数的过程中, 以上两种方法完全是等效的, 但结合C语言的语法分析, 似乎第二种方法更合理:func为一个指针, 通过*将其中的值 (地址) 取出来, 再到该地址空间开始函数的调用。
3 指针类型的强制数据类型转换
在指针的各种应用中, 强制数据类型转换是很常见的。对指针的强制数据类型转换通常都不会有语法的错误 (编译器通常都认为是合理的) , 而这些转换到底是否有意义, 则需要程序员自己进行逻辑分析, 下面就以一个比较常用的示例说明该问题。
此处定义了两个结构体类型, struct Stu和struct Cls, 其中struct Cls类型中包含了一个struct Stu数组。接下来定义指针如下:
这是一个struct Cls类型的指针, 它指向一个struct Cls类型的变量, 当我们对其进行强制数据类型转换如下:
此时指针p就被强制转换成为了一个指向struct Stu类型的指针了。
高职院校C语言教学探讨 篇11
关键词:C语言;教学改革;教学方法
一、引 言
《C语言程序设计》是计算机专业的必修课和其他理工科学生的重要基础课程,由于覆盖面广、应用广泛,对于学生的基本编程素质的培养有较大的影响而备受重视。如何更好地完成教学目标,让学生真正掌握C语言,深入了解其精髓,值得每个C语言教学工作者不断探索。
当前,在高职高专院校,《C语言程序设计》课程一般都设置在一年级,学生从高中的基础教育转向学习全新的编程性的语言,学习难度比较大。主要有以下几个原因:一是学生的英文底子普遍薄弱,而C语言英文运行环境,对于运行过程和提示错误根本看不懂,导致上机调试困难重重;再加上对程序主观上认识过难,无形中挫伤了学习的积极性。二是学生的数学基础也比较差,一些编程算法都需要数学思想来支撑。诸多原因造成了C语言教学效果不佳,而对其掌握的程度如何,直接影响到后继相关课程的学习和掌握,甚至是整个专业的后继发展。
笔者根据多年的程序设计课程的教学实践,对《C语言程序设计》课程从教学内容、教学手段、教学方法等方面行了一些改革,并取得较好的教学效果。
二、教学改革措施
1.精简内容,培养兴趣
C语言语法繁多,学生初步接触容易有惧难情绪,因此第一堂课的教学显得尤为重要,它是能否激起学生学习热情的关键因素。一般建议在第一堂课介绍一些应用C语言的小项目,比如嵌入式开发驱动程序的编写、学生注册信息系统的管理。向学生演示运行一些信息管理系统及遥控电风扇运转的一些代码,让学生了解这门语言的一些基本功能,激发他们的学习兴趣。同时用每年获得大赛的学生的事迹激励他们,讲讲学好这门课的方式方法,帮助他们树立学好这门课的信心。
2.案例引导,项目驱动
以谭浩强主编的教材《C程序设计为例》为例,教学内容主要包括C语言语法基础、程序控制结构、数据类型、数组、指针、函数、文件以及它们的应用等。教材在内容组织上,虽然依逻辑思维方式进行了归类,但难点还是较为集中,跨度大;概念讲得多,分析少。再加上高职高专院校的学生,有相当一部分入校时,分数低,数学基础较差,逻辑思维能力不是很强,如果按照书本章节一步步讲下来,学生会产生畏难情绪,学习兴趣开始降低,以往一些学生在第三章节数据类型及表达式还没有完全上完心底就已经开始放弃这门课了。所以在上这门课的时候,建议采用“案例引导、项目驱动”[1],把课程学习内容联系真实环境,提出各种问题并形成主题任务,进行任务驱动式教学;将学生置于发现问题、提出问题、思考问题、探究问提、解决问题的动态过程中学习。比如第二次授课,就可以提出做一个管理信息系统,先和学生进行基本的功能分析,然后逐步地以实现每一个功能将各个章节的知识点融入进去讲解,以任务驱动教学[2],让学生真正了解语法为编程服务,而不是单纯的死记硬背一些语法知识。
3.建立良好的网络资源平台,促进师生互动
教学中涉及到的很多知识较抽象和难于理解,因此需要学生课下对课程的重点难点进行进一步消化和理解。因此,应该采用行之有效的办法来帮助学生解决在自主学习中可能遇到的一些问题,比如学生需要进行自主学习的一些教学资源,需要一个进行问题探讨交流的空间,以及教师需要及时地掌握学生自主学习的情况等等。为此,需要建立关于这门课程的学习网站,分别设置课程学习模块、在线练习及在线测试、学习资源建设、参考文献资料、教学论坛等。笔者在完成一个院级项目的过程中建立了一个关于C语言的重点课程建设网站:重难点动画演示课程中涉及的比较难理解的算法以及知识;常见问题解答以章为单位,由课程老师共同建设,不断的加以充实,逐年积累;利用留言板功能建立课程的论坛,教师可以根据自己的教学内容在其中创建话题(发帖),学生也可以在上面对自己的疑问发帖,针对这些话题学生被允许在课题后面发表自己的看法并与教师或其他同学交流,这一功能消除了传统教学中教师只能当面答疑的时空限制,学生能在讨论板上提出自己的问题,而教师可以对具有代表性的问题做出统一解答,避免重复解答,从而提高了教学效率及学习的主动性,同时教师可通过总结学生提出的问题对教学内容做出适时调整。
4.重视上机实践,注重综合考核。
C语言是一门实践性很强的学科,除课堂上的理论讲解外,实验教学也是至关重要的。由于学生是第一次接触程序设计,许多概念都是很抽象的,因此,要求在课程内容的安排上循序渐进,由浅入深,逐步引导。实践课除了需要携带教材以外,另外还需要与之相配套的实验指导书和实验报告册,对于实验指导书可以选择与课本相配套的,教师也可以根据自己的教学需要和学生的实际情况编写合适的实验指导书。对于这门课程学习结果如何,不是一张试卷就能给出答复。我们追求的不是学生懂了多少语法,而是能做出什么,所以对于这门课程,对学生学习成绩的评定,建议采用综合考核法,将平时的实践成绩与期末卷面成绩进行综合,得出本课程综合考评分。这样才能更加客观地反映学生的学习情况,同时也能更好地促进学生平时的学习。
三、结 语
C语言的教学需要不断探讨,我们应在教学过程中不断模索,化繁为简,多钻研教材教法,使学生将所学知识转化为实际工作的能力,提高学生的实际工作水平、综合素质和就业竞争能力,为企业提供适用型的人才。
参考文献:
[1] 邓云洲.案例教学在教学基本要素上与传统教学的区别.教育发展研究,2001,(12).
基于C语言的软件编程分析 篇12
关键词: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) {Read Ai () ;ADconvert (unsignedchar address) ;
Data Change () ;Dis Play () ;…}
整个系统由于需要不停的对工厂数据进行采集, 所有主程序的结构就设置成了循环结构, 当通风控制系统有序的进行准备工作之后, 通过调用初始化函数, 程序就开始进入主循环, 主循环中通过调用采集程序, 完成对测量对象的循环检测以及对显示程序, 数据处理函数的循环调用。一遍又一遍的不停循环执行主程序。在这个主程序循环的过程中, 如果有异常情况发生, 则随着中断触发事件的发生, 将进入中断响应, 实现对中断函数的调用。
4 总结
C语言作为编程语言中经典的一类程序设计语言, 因其结构化、可移植化、编程简介的特点, 被广泛的应用国民生产的各个领域。而随着信息技术、互联网技术以及物联网技术的飞速发展, 未来C语言的应用领域将变得更加广泛。对C语言在软件编程方面的研究和分析将变得更有意义。
参考文献
[1]顾泰龙, 李远静.基于C语言的计算机软件编程实验研究[J].软件工程师, 2013 (08) .