汇编语言与C语言比较
汇编语言与C语言比较(精选12篇)
汇编语言与C语言比较 第1篇
一、比喻与比较
比喻, 即打比方。《学论》中说:“君子之教, 喻也。”教学如此, 自然学科的教学尤其如此。越是抽象难懂的内容, 越需要形象性的描述和想象。若能从学生已有的可感知的知识结构 (如日常生活经验、熟知的各种事实等) 找出某种相似性, 借以打个比方, 那么抽象的知识就可以得到很好地理解。比较, 是人类认识事物的一种重要方法。对许多复杂的事物只有通过比较和鉴别, 我们才能形成正确的认识与评价。在教学中, 通过比较, 可以帮助学生克服易混点、易错点, 培养准确运用语言能力的有效途径。在计算机C语言教学中, 有些内容比较抽象, 不容易被学生接受和理解, 作为教师可尝试应用比喻和比较的教学手段, 化繁为简, 化难为易。
二、比喻和比较在C语言教学中的应用
(1) 帮助学生认识程序设计语言。C语言属于程序设计语言中的一种语言, 是学生学习的第一门程序设计语言。学生在毫无知识背景的前提下, 我认为首先要理解什么是程序设计语言, 才能具体去学习程序设计语言。可以将程序设计语言与人类的语言相比较, 比如汉语言、英语言, 就可以很容易理解程序设计语言。 (1) 人类语言是用来交流沟通的。有一方说, 并且有另一方听, 必须有两方参与, 这是语言最重要的功能。语言就是用来表达意思传递信息的。说的一方传递信息, 听的一方接受信息;说的一方下达指令, 听的一方遵从命令做事情。程序设计语言是人与计算机交流沟通的一种语言, “说”的一方是人类, “听”的一方是计算机。我们把计算机比喻为我们的仆人, 我们是计算机的主人, 主人要告诉仆人去完成某一件事。 (2) 语言有独特的语法规则。交流双方都了解明白并遵守这些规则。一个只会说汉语的中国人和一个只会说法语的法国人, 因为互相不知道对方的语法规则, 相互肯定听不懂对方所讲的话, 沟通会失败。很自然, 学生会想到请翻译。同样, 如果人掌握了程序设计语言的语法规则, 但是计算机不一定能直接听懂, 所以人与计算机之间也要请翻译, 这个翻译就是编译程序, 它能将程序设计语言“翻译”为计算机能听懂的语言, 这样人和计算机就能互相沟通了。
(2) 帮助学生对概念的理解。要学好C语言, 必须得对C语言的知识与语法清晰, 就好比学习英语时, 首先要知道英语的语法特点和规则。英语的字符集是26个英文字母, 通过英文字母来构成单词, 再由这些单词构成语句。在C程序设计语言中也有它的字符集, 通过这些字符来构成常量、变量、类型标示符 (关键词) 等, 再由这些构成C语言的语句。如果对常量、变量的概念不清晰, 就不能理解程序。比如:变量是其值可以改变的量, 并且在内存中占据一定的存储单元。变量之所以能改变其值, 是因为它可以被赋值 (把数据或数据的备份存到该变量的内存单元中) 。可以把变量比喻为一个瓶子, 给变量赋值比喻为给这个瓶子中装液体, 并且只能装一种, 新的东西会把原来的东西覆盖掉。
(3) 帮助学生对程序执行过程的理解。如:在进行IF语句的教学中, 为了能让学生对执行过程有深刻的理解, 在介绍IF语句的执行过程时可以作如下比喻:if语句有三种形式, 最基本的是第二种:if (表达式) 语句1、e ls e语句2。执行过程应该是当表达式成立时, 则执行语句1, 否则执行语句2。可以比喻为买衣服, 口袋里只有50块, 想买一件衣服, A、B两款看着都不错, B款标价39, A款的价格标签不见了, 但从做工和质地看来, A款明显要好一点, 这时, 你也许会在心里盘算, 问一下A款的价格, 如果价格低于50, 就买A款, 否则, 就买B款, 这种“两条岔路中选一个”的流程, 在C语言中对应着if-else结构。又如:在讲解两个变量中的值进行交换时, 设交换的两个变量是整型变量a、b, 把变量a、b作为瓶子, 把a、b中的值比作瓶子中装的酱油和醋。原来的程序片段是:
b=t。学生本来写这段程序有些困难, 我就把这段程序转换为做个游戏:交换a、b两个瓶子中的液体。显然, 直接交换不行, 必须要第3个瓶子t来过渡。实施过程:把酱油倒进空瓶t, a瓶就空出来了, 再将b瓶的醋倒进a瓶, 将t瓶中的酱油倒进b瓶, 完成了交换, 并引到变量交换上来。
三、在C语言教学中应用比喻和比较后的作用
(1) 增加课堂的趣味性, 激发学生的学习兴趣。教育家第斯多惠曾说过:“教学成功的艺术就在于使学生对你教的东西感兴趣。”通过应用比喻和比较, 使C语言课程内容不再枯燥乏味, 学生可以产生愉悦的情绪, 增强了课堂的趣味性, 从而激发学生的学习兴趣。同样, 也使教学的内容直观、易懂、易学, 容易混淆或抽象、不易理解的概念, 能比较快地理解, 学生不再对程序设计语言“恐惧”。课堂气氛活跃与否, 是衡量教学效果的标准之一, 也是学生理解知识、消化知识的最佳时机。教师在教学过程中, 根据学生情绪反应, 随机应变地穿插一些生动活泼的比喻, 将课堂教学气氛重新转入正轨。
(2) 有助于培养学生的想象能力、思维能力和记忆能力。通过运用比喻, 学生产生丰富的联想, 而比较本身就是一种对比的思维过程, 它能揭示某些事物之间的共性、不同点和相互之间的联系。通过联想和对比, 学生在记忆相关知识点或概念时就印象比较深刻。
结束语:对C语言教学方法的探讨, 是提高教学质量和提高学生对计算机应用水平的一件有益的事情。程序设计是一些老师认为比较难教好的学科, 为了提高程序设计教学的有效性, 这就自然要求在教学上有一套比较好的适合学生学习特点的教学方法, 使学生在短暂的课堂学习时间内学到尽可能多的C语言的概念和用C语言的编程方法, 甚至编程技巧。在短暂的课堂教学时间内, 引导学生运用计算机解决实际问题是一件难事。本文提出的观点, 主要是想打破传统教学过分注重对语言本身的概念和语法规则的条条框框, 而想尽早引导学生解决问题, 在应用中求完善。实践证明, C语言教学中应用了比喻和比较后, 一定程度上把学生从枯燥无味的程序设计中解脱出来, 也相对提高了学生学习与理解程序的能力。
摘要:尽管当今流行的面向对象程序设计语言很多, 如ja-va、C++、C#等, 但是C本身的设计理念以及对现有C++/C#等语言的深刻影响, 使其至今仍是程序设计入门的首选语言, 在许多学校中仍然开设了C语言。可以说掌握了C语言后, 再去学习其他面向过程的语言, 最多一个星期就能学会。下面, 是笔者在教学中的一些心得。
关键词:C语言,比喻,程序设计
参考文献
[1]廖雷.C语言程序设计[M].北京:高等教育出版社, 2002.
[2]谭浩强.C程序设计[M].北京:清华大学出版社, 1999.
汇编语言与C语言比较 第2篇
7.引用与指针有什么区别? 1)引用必须被初始化,指针不必。
2)引用初始化以后不能被改变,指针可以改变所指的对象。2)不存在指向空值的引用,但是存在指向空值的指针。
8.描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性
9.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈 10.什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1 11.堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源
12.什么函数不能声明为虚函数? constructor 13.冒泡排序算法的时间复杂度是什么? O(n^2)14.写出float x 与“零值”比较的if语句。if(x>0.000001x<-0.000001)16.Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理层
17.Internet物理地址和IP地址转换采用什么协议? ARP(Address Resolution Protocol)(地址解析協議)18.IP地址的编码分为哪俩部分?
IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分 哪些是网络位哪些是主机位。
2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出
C程序。
循环链表,用取余操作做
3.不能做switch()的参数类型是: switch的参数不能为实型。
華為
1、局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。要用全局变量,需要使用“::” 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不 会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环 体内
2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在 头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用ex tern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初 值,此时连接不会出错
4、语句for(;1 ;)有什么问题?它是什么意思? 答:和while(1)相同。
5、do„„while和while„„do有什么区别?
答:前一个循环一遍再判断,后一个判断以后再循环
6、请写出下列代码的输出内容 #include
1、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么 区别?static函数与普通函数有什么区别?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就 是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文 件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作 用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可 以避免在其它源文件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的 生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明 为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以 外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其 他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依 据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调 用中维持一份拷贝
2、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存 在于(堆)中。
3、设有以下说明和定义:
typedef union {long i;int k[5];char c;} DATE;struct data { int cat;DATE cow;double dog;} too;DATE max;则语句 printf(“%d”,sizeof(struct date)+sizeof(max));的执行结果是:___52____ 答:DATE是一个union, 变量公用空间.里面最大的变量类型是int[5], 占用20个字节.所
以它的大小是20 data是一个struct, 每个变量分开占用空间.依次为int4 + DATE20 + double8 = 32.所以结果是 20 + 32 = 52.当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20
4、队列和栈有什么区别? 队列先进先出,栈后进先出
5、写出下列代码的输出内容 #include
7、请找出下面代码中的所以错误
说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
1、#include“string.h”
2、main()
3、{
4、char*src=“hello,world”;
5、char* dest=NULL;
6、int len=strlen(src);
7、dest=(char*)malloc(len);
8、char* d=dest;
9、char* s=src[len];
10、while(len--!=0)
11、d++=s--;
12、printf(“%s”,dest);
13、return 0;
14、} 答: 方法1: int main(){ char* src = “hello,world”;int len = strlen(src);char* dest =(char*)malloc(len+1);//要为分配一个空间 char* d = dest;char* s = &src[len-1];//指向最后一个字符 while(len--!= 0)*d++=*s--;*d = 0;//尾部要加 printf(“%sn”,dest);free(dest);// 使用完,应当释放空间,以免造成内存汇泄露 return 0;} 方法2:
#include (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;(3)将栈B的栈顶元素pop出; 这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。3.在c语言 库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么? 函数名: atol 功 能: 把字符串转换成长整型数 用 法: long atol(const char *nptr);程序例: #include 4.接入网用的是什么接口? 5.voip都用了那些协议? 6.软件测试都有那些种类? 黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口 7.确定模块的功能和模块的接口是在软件设计的那个队段完成的? 概要设计阶段 8.enum string { x1, x2, x3=10, x4, x5, }x;问x= 0x801005,0x8010f4;9.unsigned char *p1;unsigned long *p2;p1=(unsigned char *)0x801000;p2=(unsigned long *)0x810000;请问p1+5=;p2+5=;三.选择题: 1.Ethternet链接到Internet用到以下那个协议? A.HDLC;B.ARP;C.UDP;D.TCP;E.ID 2.属于网络层协议的是: A.TCP;B.IP;C.ICMP;D.X.25 3.Windows消息调度机制是: A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;4.unsigned short hash(unsigned short key){ return(key>>)%256 } 请问hash(16),hash(256)的值分别是: A.1.16;B.8.32;C.4.16;D.1.32 四.找错题: 1.请问下面程序有什么错误? int a[60][250][1000],i,j,k;for(k=0;k<=1000;k++)for(j=0;j<250;j++)for(i=0;i<60;i++)a[i][j][k]=0;把循环语句内外换一下 2.#define Max_CB 500 void LmiQueryCSmd(Struct MSgCB * pmsg){ unsigned char ucCmdNum;......for(ucCmdNum=0;ucCmdNum 3.以下是求一个数的平方的程序,请找出错误: #define SQUARE(a)((a)*(a))int a=5;int b;b=SQUARE(a++);4.typedef unsigned char BYTE int examply_fun(BYTE gt_len;BYTE *gt_code){ BYTE *gt_buf;gt_buf=(BYTE *)MALLOC(Max_GT_Length);......if(gt_len>Max_GT_Length){ return GT_Length_ERROR;}.......} 五.问答题: 1.IP Phone的原理是什么? IPV6 2.TCP/IP通信建立的过程怎样,端口有什么作用? 三次握手,确定是哪个应用程序使用该协议 3.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种? 4.列举5种以上的电话新业务? 微软亚洲技术中心的面试题!!1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于 进程的资源.(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销 明显大于创建或撤消线程时的开销。2.测试方法 人工测试:个人复查、抽查和会审 机器测试:黑盒测试和白盒测试 2.Heap与stack的差别。Heap是堆,stack是栈。 Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。Stack空间有限,Heap是很大的自由存储区 C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。 程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传 递也在栈上进行 3.Windows下的内存是如何管理的? 4.介绍.Net和.Net的安全性。 5.客户端如何访问.Net组件实现Web Service? 6.C/C++编译器中虚表是如何完成的? 7.谈谈COM的线程模型。然后讨论进程内/外组件的差别。8.谈谈IA32下的分页机制 小页(4K)两级分页模式,大页(4M)一级 9.给两个变量,如何找出一个带环单链表中是什么地方出现环的? 一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方 10.在IA32中一共有多少种办法从用户态跳到内核态? 通过调用门,从ring3到ring0,中断从ring3到ring0,进入vm86等等 11.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现? 用内存映射或全局原子(互斥变量)、查找窗口句柄..FindWindow,互斥,写标志到文件或注册表,共享内存。.12.如何截取键盘的响应,让所有的‘a’变成‘b’? 键盘钩子SetWindowsHookEx 13.Apartment在COM中有什么用?为什么要引入? 14.存储过程是什么?有什么用?有什么优点? 我的理解就是一堆sql的集合,可以建立非常复杂的查询,编译运行,所以运行一次后,以 后再运行速度比单独执行SQL快很多 15.Template有什么特点?什么时候用? 16.谈谈Windows DNA结构的特点和优点。 网络编程中设计并发服务器,使用多进程 与 多线程,请问有什么区别? 1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他 线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。两者都可以提高程序的并发度,提高程序运行效率和响应时间。 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正 相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。思科 1.用宏定义写出swap(x,y)#define swap(x, y)x = x + y;y = xy;2.数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字 .时间复杂度必须为o(N)函数原型: int do_dup(int a[],int N)3 一语句实现x是否为2的若干次幂的判断 int i = 512;cout << boolalpha <<((i &(ib;a = a-b;or a = a^b;// 只能对int,char..b = a^b;a = a^b;or a ^= b ^= a;3.c和c++中的struct有什么不同? c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。 c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而clas s默认为private 4.#include 长度不一样,会造成非法的OS 6.列举几种进程的同步机制,并比较其优缺点。 原子操作 信号量机制 自旋锁 管程,会合,分布式系统 7.进程之间通信的途径 共享存储系统 消息传递系统 管道:以文件系统为基础 11.进程死锁的原因 资源竞争及进程推进顺序非法 12.死锁的4个必要条件 互斥、请求保持、不可剥夺、环路 13.死锁的处理 鸵鸟策略、预防策略、避免策略、检测与解除死锁 15.操作系统中进程调度策略有哪几种? FCFS(先来先服务),优先级,时间片轮转,多级反馈 8.类的静态成员和非静态成员有何区别? 类的静态成员每个类只有一个,非静态成员每个对象一个 9.纯虚函数如何定义?使用时应注意什么? virtual void f()=0;是接口,子类必须要实现 10.数组和链表的区别 数组:数据顺序存储,固定大小 连表:数据可以随机存储,大小可动态改变 12.ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点? 应用层 表示层 会话层 运输层 网络层 物理链路层 物理层 tcp /udp属于运输层 TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与 TCP 不同,UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单,UDP 头包含很少的字节,比 TCP 负载消耗少。tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好 udp: 不提供稳定的服务,包头小,开销小 1:(void *)ptr 和(*(void**))ptr的结果是否相同?其中ptr为同一个指针.(void *)ptr 和(*(void**))ptr值是相同的 2:int main(){ int x=3;printf(“%d”,x);return 1;} 问函数既然不会被其它函数调用,为什么要返回1? mian中,c标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息 1,要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? *((void(*)())0x100000)();首先要将0x100000强制转换成函数指针,即:(void(*)())0x100000 然后再调用它: *((void(*)())0x100000)();用typedef可以看得更直观些: typedef void(*)()voidFuncPtr;*((voidFuncPtr)0x100000)();2,已知一个数组table,用一个宏定义,求出数据的元素个数 #define NTBL #define NTBL(sizeof(table)/sizeof(table[0]))面试题: 线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈? 进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候 操作系统就帮你创建了一个主线程。每个线程有自己的堆栈。 DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL 中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调 用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创 建的线程所执行,那么是不是说DLL有独立的堆栈? 以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的 内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中 删除,很有可能导致程序崩溃 unsigned short A = 10;printf(“~A = %un”, ~A);char c=128;printf(“c=%dn”,c);输出多少?并分析过程 第一题,~A =0xfffffff5,int值 为-11,但输出的是uint。所以输出4294967285 第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是12 8,所以输出-128。 这两道题都是在考察二进制向int或uint转换时的最高位处理。分析下面的程序: void GetMemory(char **p,int num){ *p=(char *)malloc(num); } int main(){ char *str=NULL; GetMemory(&str,100); strcpy(str,“hello”); free(str); if(str!=NULL){ strcpy(str,“world”);} printf(“n str is %s”,str);getchar();} 问输出结果是什么?希望大家能说说原因,先谢谢了 输出str is world。 free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL.此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储 空间是可能被重新分配给其他变量的, 尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出 world来。 这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用 内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你 是可以继续访问这块地址的,只不过。。。。楼上都说过了,最好别这么干。 char a[10],strlen(a)为什么等于15?运行的结果 #include “stdio.h” #include “string.h” void main(){ char aa[10];printf(“%d”,strlen(aa));} sizeof()和初不初始化,没有关系; strlen()和初始化有关。 [关键词]C 语言;教学改革;案例教学;课程设计 一、传统教学中存在的问题 学生对学习该门课程没有明确的学习目的与兴趣。很多同学认为这门课就是介绍 C 语言的概念、 语句、 语法规则等内容;另外一些同学了解到现在流行的程序开发语言是Java 和C#,觉得 C 语言用处不大。C 语言的教学仍停留在传统的教学模式上,把授课重点放在程序设计语言的基本语法的讲授和掌握上, 这种灌输模式能较好地保证所讲授知识的系统性与完整性,却忽略了程序设计能力与思维的培养,造成学生学习的积极性不高,教学效果较差。实验课环节效果差,在上机过程中学生过分依赖书本,多数学生上机就是拿书本上的例子来验证,缺乏动手编写程序的训练。 在课后教师虽然布置了一些练习题目,让学生重温教学内容以巩固所学的知识。 但是由于缺乏有效的监督检查,学生往往通过网络或者书本等其他途径来寻找答案,而不是通过自己独立思考完成。C 语言课程考核方式单一,一般通过笔试手段来考核学生掌握 C语言的情况,学生通过最后几天时间背题库、 背书本,就可以轻松通过考试。 二、 C 语言教学改革探讨与实践 1.上好 C 语言教学的第一堂课 C 语言教学的第一堂课很重要:第一要讲明 C 语言的重要性;第二可以结合一个生动的 C 语言编程实例,使学生对 C 语言的学习产生兴趣;第三提出课程学习要求与方法,给出平时作业、 上机实验、 考试方式等具体要求。 2. 课堂上采用多种教学方法 可以考虑在课堂上采用多种教学方法。案例教学以程序设计为主线,以编程应用为驱动,通过案例和问题引出教材内容,重点讲解程序设计的思想和方法,穿插讲解相关的语法知识。 这样教学效果既有深度又有广度,学生实际动手能力大为增强。 同时对于比较典型的问题,可以安排少量课时实施“学生示范教学法”。在课堂的实践环节中,教师可以让一个学生上讲台编程,学生所有的操作会通过投影仪展现给全班同学。 如果讲台上学生出现编程错误,教师应以此为例加以更正和讲解,并介绍一些可避免错误的编程技巧。 3. 实验教学严格把关 在实验课环节中应严格把关。 让学生课前认真准备,每次进实验室时,应写好完整代码。 上机调试中发现问题的同时解决问题,要求认真完成实验内容,并在课后书写实验报告。 鼓励学生多动手写程序,多调试程序切实把握实验教学的质量。 4. 精心安排课程设计 在课程设计阶段以软件公司的项目小组为模仿目标,以 3 个学生为一个学习小组,选出一个组长,老师要求组长对自己的组员进行考核与具体的编程安排。课程设计的原则既要使学生有切入点动手又要使各章的内容之间有联系。课程设计选题可以以五子棋游戏、 扫雷游戏、 家庭财务管理、学生成绩管理系统等生活实际为例,一方面易于理解,另一方面可以激发学生对项目的兴趣。 学生最终完成一个课程设计大作业,以小组为单位不仅能使学生相互学习,相互勉励,能培养学生们的组织管理能力和团队合作能力。而且项目的完成可以帮助学生加深对书本理论知识的理解又可以让学生勇于实践、积极思考,激发了学生的学习潜力。 项目的成功使学生有成就感,有效地调动了学生学习的积极性。 课程设计以项目答辩结束,要求项目小组成员在讲台上讲解他们的作品,教师和其他项目小组成员在讲台下评分和提问,所有的学生在一问一答间可以学到更多知识。 5.改变单一的考核方式 大多数院校仍采用笔试考试这一考核方式。其实可以采用平时考核、 期末理论考试、 上机考试、 课程设计项目考察多种考核方式相结合。平时考核以布置作业、 到课、 听课情况为主,考查学生的学习态度占 20%;期末理论考试采取闭卷考试,主要考查学生对基本知识的理解和阅读别人的程序的能力占 40%;上机考试主要考查学生调试程序的能20%;课程设计项目主要考察学生实际动手能力和团队协作能力占 20%。 三、教学改革中需注意的问题 1. 选用适合的教材 对于那些刚入大学不久就学习 C 语言程序设计的新生而言 , 他们往往不能很快适应大学的学生生活和学习方式 , 还保留着高中时比较依赖教科书的习惯 ,所以教材对他们来说是非常重要的 。此外 ,由于大多数学校的课时与以前相比都有不同程度的压缩 , 一些内容只能让学生课下自学 , 那就更需要一本能够启发他们思路 、达到辅助自学这一目的的教材 。 目前 ,市面上的 C 语言教材可谓琳琅满目 , 但大多数教材的结构安排都是先讲基础知识 , 再讲变量与运算符 ,然后是控制语句 ,即使后面的章节涉及到完整的编程 , 也总是在讲如何编程之前介绍一大堆琐碎 、枯燥乏味 、难以理解和记忆的语法规则 。不知从何时开始 ,学生觉得无趣 , 记不住 ,最终导致学习的积极性和自信心双双受到打击 ,学习效果可想而之 。经过调查 , 学生们普遍认为 :编写 C 语言的程序与他们以前养成的逻辑思维 ,尤其是数学思维有很大的不同 ,他们希望有一本由浅入深的 , 能够通过对一些实用问题的分析 , 逐步地引导读者自己动手编程的教材 。这里边其实就包含着我们选择教材时应考虑的几方面因素 。 首先 ,教材体系要合理 , 符合学生的认知规律 : 应从需要解决的问题入手 , 以启发式的方法 ,引领学生去分析问题 、解决问题 ,并从中学习到相应的基础知识 , 这种方式更有利于培养出学生的编程思维 。其次 , 教材内容应由浅入深 、循序渐进 。再次 ,例题 、习题要实用 、有趣 ,易于激发学生的学习兴趣 , 有利于培养学生实际应用的能力 。目前 ,能满足这些要求的书几乎没有,因此 , 这应该也是我们教材改革的目标之一。 2.案例选用的原则 采用案例教学,一定要设计好案例,好的案例是成功的关键。 以知识线索和围绕教学内容来组织与设计案例,对学生的知识和能力训练具有很强的针对性。处理好具体实例与思想方法的关系,局部知识应用与综合应用的关系,强调实用性,培养应用能力。通过强化案例与实验教学,加深学生对理论知识的理解与掌握。案例教学突出学习方式的转变,以提高学生分析问题、 解决问题的能力,进而提高综合素质。在案例设计中要注意对案例难度的把握。如果太难,学生通过努力还是没有什么进展,编程通不过,学生的学习兴趣和主动性就逐渐减退,教学效果很难达到预期目标。 如果太简单起不到培养学生掌握知识和应用知识的能力。 3.以鼓励为主评价学生 教师对学生平时作业与实验环节以及课程设计中多给学生鼓励,多给学生积极正面的评价。 对学生提出的问题要耐心地指出问题的根源,引导学生自己去找出原因改正错误,不要一开始就给出答案,更不要刻意去批评学生。对学生学习效果的评价遵循如下原则:鼓励性原则,即对学生有创意的程序设计思想和方法要多鼓励,对学生在实验报告中深入分析和总结要在评语中给予特别肯定;及时性原则,即对学生在实验过程中的一些闪光点,当场给予口头表扬。需要特别强调的是,对学生学习效果的评价,不应该只对学生进行横向的比较,更应关心学生学习过程中的点滴进步,鼓励学生在原有基础上不断争取新的进步。 四、结 语 实施以上的改革措施后,学生的程序设计思想和编程能力明显增强。为学生们后续课程的学习打下了坚实的基础。C 语言教学改革不是一蹴而就的,应该重视理论与实践相结合,在今后的教学过程中不断地去完善。 作者简介:卫军超(1982-3),男,陕西韩城人,西北农林科技大学信息工程学院硕士研究生,西安交通工程学院计算机讲师。 关键词:C语言,逐点比较数控插补法,教学仿真软件 由于数控设备价格昂贵, 且在数控设备上完成相关实验的成本也较高, 很多院校的数控实验设备资源配置不能满足实际需要, 为了便于学习、理解数控机床控制刀具和工件的相对插补运动规律, 笔者利用C语言开发设计了逐点比较法数控插补教学仿真软件。 1 逐点比较插补法 在数控机床中, 刀具 (或机床运动的运动部件) 不能严格地按照要求加工的曲线运动, 只能用折线轨迹逼近所要加工的曲线。刀具 (或机床运动的运动部件) 的最小移动量是一个脉冲当量。直线和圆弧是基本的曲线, 加工的各种工件, 大部分由直线和圆弧构成。数控系统依照一定方法确定刀具运动轨迹的过程称为插补 (interpolation) [1]。插补的实质是在一个线段的起点和终点之间进行数据点的密化。 逐点比较插补法的基本思路:每走一步都要将加工点的瞬时坐标与规定的图形轨迹相比较, 判断其偏差, 然后决定下一步的走向。如果加工点走到图形外面, 下一步就要向图形里面走;如果加工点走到图形里面, 下一步就要向图形外面走, 以缩小偏差, 这样就能得到一个非常接近规定图形的轨迹, 最大偏差不超过一个脉冲当量。逐点比较法直线插补、逐点比较法圆弧插补其插补过程, 每走一步要进行以下四个步骤。 Step1:偏差判别。根据偏差值确定刀具相对加工的位置。 Step2:坐标进给。根据偏差判别的结果, 控制刀具沿相应的坐标轴移动一步, 使刀具向零件轮廓靠拢。 Step3:偏差计算。刀具进给一步后, 计算新加工点的新偏差值, 为下一步偏差判别提供依据。 Step4:终点判别。偏差计算的同时, 进行终点判别, 以确定刀具是否已经到达零件轮廓的终点。 逐点比较法直线插补法对于不同象限的直线插补法, 无论哪个象限, 其插补进给方向为: (1) 当F (偏差值) ≥0时, 都是沿着X方向步进, 不管是+X向还是-X向, 都是沿着|X|增大的方向步进, 走+X还是-X由象限标志控制 (一、四象限走+X;二、三象限走-X) ; (2) 当F<0时, 总是沿着Y方向步进, 不管是+Y向还是-Y向, 都是沿着|Y|增大的方向步进, 走+Y还是-Y由象限标志控制 (一、二象限走+Y;三、四象限走-Y) 。 逐点比较法圆弧插补法对于不同象限、不同方向圆弧 (逆圆弧、顺圆弧) , 插补公式和插补进给方向也不同, 用SR1、SR2、SR3、SR4分别表示第Ⅰ、Ⅱ、Ⅲ、Ⅳ象限的顺时针圆弧, 用NR1、NR2、NR3、NR4分别表示第Ⅰ、Ⅱ、Ⅲ、Ⅳ象限的逆时针圆弧, 四个象限圆弧的进给方向及插补计算公式如表1所示。 2 逐点比较插补法教学仿真设计 为了便于学生学习、掌握数控机床插补运动规律, 笔者利用C语言开发设计逐点比较法数控插补教学仿真软件, 能完成二维平面内直线、圆弧插补轨迹的插补运算仿真, 其教学仿真软件功能主界面如图1所示。 逐点比较法直线插补法可以完成不同象限的直线插补法运算仿真;逐点比较法圆弧插补法能实现不同象限、不同方向圆弧 (逆圆弧、顺圆弧) 插补法运算仿真。仿真软件可以通过提示输入曲线参数, 主要有直线终点坐标和圆弧的起点、终点坐标等有关参数, 仿真软件系统自动判断象限、逆圆弧、顺圆弧等完成相应的补法运算仿真。该插补算法C语言主函数代码如下: 3 实验结果 假设加工第一象限直线, 起点为坐标原点O (0, 0) , 终点坐标为A (5, 3) , 用该插补教学仿真软件进行插补运算, 插补从直线的起点开始, 故F0, 0=0;终点判别寄存器N存入X和Y两个坐标方向的总步数, 即N=5+3=8, 每进给一步减1, N=0时停止插补。插补仿真程序运行结果如图2所示, 运算后得到插补轨迹过程如图3所示。 假设加工第一象限逆圆弧, 起点为坐标原点A (10, 0) , 终点坐标为B (6, 8) , 圆心在O (0, 0) 上, 用该插补教学仿真软件进行插补运算, 插补从圆弧的起点开始, 故F10, 0=0;终点判别寄存器N存入X和Y两个坐标方向的总步数, 即N=|1 0-6|+|0-8|=12, 每进给一步减1, N=0时停止插补。插补仿真程序运行结果如图4所示, 运算后得到插补轨迹过程如图5所示。 4 结论 该插补教学仿真软件实现了逐点比较法对直线和圆弧进行插补, 软件界面简单、明了、操作方便, 程序运行正确。目前, 在学校实验设备资源配置不能满足实验需要的情况下, 大力发展计算机仿真软件, 对提高实验水平非常有益, 同时也使得实验手段与时俱进、不断发展。 参考文献 [1]何雪明, 吴晓光, 刘有余.数控技术[M].武汉:华中科技大学出版社, 2010. 本文地址:www.cnblogs.com/archimedes/p/c-interfaces-implementations.html,转载请注明源地址。 接口 接口只需要指明客户调用程序可能使用的标识符即可,应尽可能地隐藏一些无关的表示细节和算法,这样客户调用程序可以不必依赖于特定的实现细节。这种客户调用程序和实现之间的依赖--耦合----可能会在实现改变时引起错误,当这种依赖性埋藏在一些关于实现隐藏的或是不明确的假设中时,这些错误可能很难修复,因此一个设计良好且描述精确的接口应该尽量减少耦合。 C语言对接口和实现的分离只提供最基本的支持,但是简单的约定能给接口/实现方法论带来巨大的好处。在C中,接口在头文件声明,头文件声明了客户调用程序可以使用的宏、类型、数据结构、变量以及例程。用户使用C语言的预处理指令#include导入接口。 下面的例子说明了本篇文章的接口中所使用的一些约定、接口: arith.h 该接口的名字为Arith,接口头文件也相应地命名为arith.h,接口的名字以前缀的形式出现在接口的每个标识符中。模块名不仅提供了合适的前缀,而且还有助于整理客户调用程序代码。 Arith接口还提供了一些标准C函数库中没有但是很有用的函数,并为出发和取模提供了良好的定义,而标准C中并没有给出这些操作的定义和只提供基于实现的定义。 实现 一个实现导出一个接口,它定义了必要的变量和函数以提供接口所规定的功能,在C语言中,一个实现是由一个或多个.c文件提供的,一个实现必须提供其导出的接口所指定的功能。实现应包含接口的.h文件,以保证它的定义和接口的声明时一致的。 Arith_min和Arith_max返回其整型参数中的最小值和最大值: int Arith_max(int x, int y) { return x > y ? x : y; } int Arith_min(int x, int y) { return x > y ? y : x; } Arith_div返回y除以x得到的商,Arith_mod返回相应的余数。当x与y同号的时候,Arith_div(x,y)等价于x/y,Arith_mod(x,y)等价于x%y 当x与y的符号不同的时候,C的内嵌操作的返回值就取决于具体的实现: eg.如果-13/5=2,-13%5=-3,如果-13/5=-3,-13%5=2 标准库函数总是向零取整,因此div(-13,2)=-2,Arith_div和Arith_mod的语义同样定义好了:它们总是趋近数轴的左侧取整,因此Arith_div(-13,5)=-3,Arith_div(x,y)是不超过实数z的最大整数,其中z满足z*y=x。 Arith_mod(x,y)被定义为x-y*Arith_div(x,y)。因此Arith_mod(-13,5)=-13-5*(-3)=2 函数Arith_ceiling和Arith_floor遵循类似的约定,Arith_ceiling(x,y)返回不小于实数商x/y的最小整数 Arith_floor(x,y)返回不超过实数商x/y的最大整数 完整实现代码如下: arith.c 抽象数据类型 抽象数据类型(abstract data type,ADT)是一个定义了数据类型以及基于该类型值提供的各种操作的接口 一个高级类型是抽象的,因为接口隐藏了它的表示细节,以免客户调用程序依赖这些细节, 下面是一个抽象数据类型(ADT)的规范化例子--堆栈,它定义了该类型以及五种操作: stack.h 实现 包含相关头文件: #include #include “assert.h” #include “mem.h” #include “stack.h” #define T Stack_T Stack_T的内部是一个结构,该结构有个字段指向一个栈内指针的链表以及一个这些指针的计数: struct T { int count; struct elem { void *x; struct elem *link; } *head; }; Stack_new分配并初始化一个新的T: T Stack_new(void) { T stk; NEW(stk); stk->count = 0; stk->head = NULL; return stk; } 其中NEW是一个另一个接口中的一个分配宏指令。NEW(p)将分配该结构的一个实例,并将其指针赋给p,因此Stack_new中使用它就可以分配一个新的Stack_T 当count=0时,Stack_empty返回1,否则返回0: int Stack_empty(T stk) { assert(stk); return stk->count == 0; } assert(stk)实现了可检查的运行期错误,它禁止空指针传给Stack中的任何函数。 Stack_push和Stack_pop从stk->head所指向的链表的头部添加或移出元素: void Stack_push(T stk, void *x) { struct elem *t; assert(stk); NEW(t); t->x = x; t->link = stk->head; stk->head = t; stk->count++; } void *Stack_pop(T stk) { void *x; struct elem *t; assert(stk); assert(stk->count > 0); t = stk->head; 关键词:C++;程序设计;教学方法;教学改革 0引言 C++语言运用范围非常广,在软件设计、网络通讯、游戏娱乐等等领域都能涉及到,也是当前世界上使用最广的编程语言。但是行业的发展受到多方面局限,人才的缺失是行业发展最大的阻碍,许多高校都意识到这个问题,相继的开始《C++语言程序设计》课程,主要就是让计算机专业的人才能够多涉及这方面课程,提高学生的自主学习与独立思考能力,增加就业的几率。传统教学方式,存在教学目标不清晰以及教学方式古板的问题,很多学生对这门学科的重要程度认知不足,教学方式与内容的乏味让学生对此课程并无多大兴趣。本文是根据多年来的经验总结以及市场调查,从教学目标与内容多方面进行研究,以此追求有效的教学改革。 1教学中存在的普遍问题 1.1学生学习目标不明确 教学的主要目的是为了培养学生的兴趣以及软件编程能力,提高学生的独立思考、分析与解决问题的能力,提高就业的几率。以往的课程都是由不同教师来传授,每一个教师都只关注自己本科教学,并没有从全局效果分析,学生对自己的学习目标不明确,导致学习兴趣降低。没有目标的学生犹如行驶中迷失了方向的帆船,不知所措。当学生对自己的学习有了清晰的规划,就会不断朝着目标的方向努力前进。 C++涉及的概念都是较为复杂的,在学习过程中灵活多变,出错可能性非常大,可以说想要学好此课程是相对较难,所以很多学生都产生退却念头;同时C++不仅是纯对象语言,当中还涉及到程序设计语言,面对对象并不是单一的。这种特性导致了C++语言与C语言能够兼容存在。两种语言之间有时不需修改就能够使用,所以在刚开始学习时,学生觉得相对简单。[1]。然而,这两种语言也必然存在不能共通之处,学生要真正掌握两种不同的语言,就必须对其进行对比,找到其相同之处和不同点。 1.2教学重点偏向语法,课后延伸匮乏 在语言教学中侧重与语法[2]。在传统的教学当中,不管是老师教授还是教材讲解,都是先把概念推从出去,再理解规则,最后用案例讲解。概念知识相对来说不仅枯燥,要想记住也是较难的,在教学过程中,要引起学生兴趣非常难。虽然传统教学中有案例分析,但是案例分析都是各自孤立的,只是针对某一部分的知识,学生无法从中感受到实际运用价值。枯燥无味的文字不仅不能引起学生的学习兴趣,反而会让他们觉得反感。被动地接受理论知识只会让学生很快就忘记了教学内容,只有生动的教学方式才能激发起学生的兴趣。 教材课程中有课时限制,所以教学过程基本上都是从语法、规则、案例等等形式来落实。每一堂课讲解的时间都有限,再加上教师的课前准备不足,那么这堂课的实际效用就非常低。如果在课后没有进行延伸与巩固,那么学生要掌握更深层次的知识是不可能的。在这种情况下,学生掌握的知识只是皮毛,甚至可以说有些接收能力比较差的学习是掌握不了课堂知识。如果没有进行课后巩固,基本上这堂课的知识就是一闪而过了。对于老师传授的知识,学生不可能过目不忘,因此,只有不断对知识进行巩固和复习,才能让学生牢牢记住知识。 1.3教学方式无结合企业实际需要 学生在C++语言的学习中,通常都是局限在一部分知识中,并没有顾全大局的理念。传统的教学都是采用循序渐进的形式,每一节课都给学生灌输新概念、新规则,学生没办法从所有学习的知识中进行融合使用。[3]。就算是在教学中加入了大量的实验课程,也只是围绕某一个章节某一个知识进行实验安排。这种实践课程也只是一时兴趣,学生在学习一段时间后就会产生厌倦,学到的知识进而就无法使用到企业公中。单调的教学模式显然已经让学生失去了兴趣,这对于提升学生的思考能力和动手能力毫无帮助。每一个学生在毕业后都会步入社会,因此,了解社会环境和企业对于人才的要求对于学生来说尤为重要。如果教师一味地向学生传授课本知识,即便学生能够牢牢记住这些理论知识,也不知道如何将其应用到实际操作中。因此,在教学过程中,教师应该注重理论与实际的相互结合,把学生培养成为综合型的人才。 2教学改革策略 针对上述对C++语言教学存在问题的概述,本文从以下几个方面进行策略研究,在实际使用中也取得了不错的反馈。 2.1明确学习与教学目的 学习的动机是学生能够持续进行的基础,完成整个学习与巩固过程都需要学习动机来维持。现在大学生在学习过程中会考虑到今后就业方向,如果在课堂当中能够开展与今后就业相关的内容,那么学生会非常重视这次学习,效果自然就非常明显。对于不同的教学内容,学生往往会表现出不一样的兴趣程度,因此,老师首先要了解学生在学习过程中最为关注的问题,并且针对这些问题设计和安排教学内容。学生对于感兴趣的教学内容往往会表现出更强的积极性和主动学习性,学习效果也会有所提高。结束校园学习后的学生都会走向社会,他们对于未来的就业环境和企业的人才需求表现出更强的兴趣,因此,老师在教学过程中可以适当插入这部分的内容。 2.2教学内容要结合整体与具体两个方面 教材的编排几乎都是从概念、规则、举例这样的形式,但是知识的分散导致每一个章节的内容都联系不上,学生感受不到整体的编程效果。所以,在教学当中,应该注重整体到具体的方式,让学生能够先了解整个C++编程过程,然后再在每一个程序中融入教学内容,把教学具体到每一个知识点中,巩固学生的知识能力,学生在学习完所有知识后就已经完成整个设计。这种教学思路对程序类型的课程学习有极大作用。教学首先必须具备清晰的规划,才不会显得杂乱无章。教师应当确定一个大致的教学方向,然后再对教学内容展开详细的安排,在规划教学内容时,必须充分考虑不同学生对于教学任务的完成程度,从而对教学内容的难度进行适当的调整,尽可能地让更多的学生掌握教学内容。 2.3教学方法注重同中求异、异中求同 教学当中注重同中求异,异种求同的话,能够让学生抓住事物的本质,对事物的理解加深,有利于思维拓展。为了能够让学生的学习更加深入,可以用对比学习的方式,这样的教学效果会更加好。比如说,把c++语言与C语言进行对比教学,这样学生不仅能够学习到新内容,还能够巩固旧知识,得到双收益效果。其实两种语言在设计思路上有较大差异,一种是面对程序语言,把数据与数据捆绑起来,另一种是面对整个过程的语言设计,用分块的模式教学。教学内容的不同并不是意味着教学方法也截然不同,把相似的内容集中起来教学,有利于学生更好地把握知识,采用不同的方法对相同的内容进行教学,有助于老师找到教学中的平衡点,发现更合适的教学方法。 2.4校园学习与企业联合,为就业作准备 很多计算机相关专业的学生为了能够快速就业,在校园里就会选择去外面机构培训。当然培训并不意味就是能提高就业率,主要还是看学生的态度以及掌握情况。如果在高校的C++语言学习中,可以用校园与企业合作的方式来教学,在教学当中可以加入机构培训的方式;在每一次学完知识后就加入实践活动,对于今后的就业帮助极大。同时,提高学生的学习能力以及适应能力方面也有很大帮助。学校更加注重的是理论知识的传授,而企业更加注重的是实际的操作,企业提出人才要求,学校能够更加有针对性地为学生制定学习任务,从而让学生更好地掌握相关的专业技能,让自己离开校园后尽快适应到社会的工作中。 3结语 本文提出了《C++语言程序设计》课程的教学改革思路,通过教学方法、模式的改变,来激发学生的学习兴趣与能力培养,用校企联合的方式来为今后就业奠定基础,累积学生经验的同时还能提前模拟就业。有教学实验证明,这些教学改革方式是能够在一定程度上提高教学效果,并且对编程类型的课程来说都有极大的借鉴作用。传统的教学方式显然已经不能满足人们日益增长的需求,社会环境是不断进步的,竞争是越来越激烈的,为了使学生具备更强的社会竞争力,学校必须转变教学方法,一方面要让学生掌握基础的理论知识,另一方面需要注重学生的操作能力培养。总体来说,就是要理论知识与实践操作相互结合,培养全能型的学生,对他们的知识掌握以及今后的就业都有极大帮助。 参考文献: [1]杨庚.面向对象程序设计与C++语言[M].北京:人民邮电出版社,2012. [2]杨杰,陈雪兆.《C++程序设计》教学中存在的问题及改进建议[J].湖南科技学院学报,2013,11(26):190191. C语言是一种高级程序设计语言, 具有简洁紧凑、功能丰富、应用面广等特点。汇编语言是一种十分依赖于机器硬件的计算机原始语言, 可移植性较差, 但效率高、程序精炼, 可对计算机底层硬件直接操作。汇编语言的学习, 可以引导学生深入的理解计算机硬件系统。设置C语言与汇编语言混合编程的实践类课程, 融合二者各自的优点, 更好的体会应用高级语言的特点, 并加深底层编程的理解。让学生从软件角度更好的理解计算机系统的整体工作原理, 不仅知其然更知其所以然。 一、课程的教学现状 目前C语言实践课程与汇编实践语言课程是独立开设的两门不同的实践课程。大多数院校开设C语言实践课程的目的是希望通过大量的实例, 加强学生动手实践的能力, 并且对高级程序设计语言及其基本的语法规则和整体的大型程序设计有一个简单的了解。本校也是以此为基点, 开设课程。但是, 从目前的教学效果反馈看, 缺乏层次性、后续性, 教学单一, 学生只对C语言有一个简单的了解。理论、实践教学考试后, 大多数同学基本将这门课程丢弃。我们教学的目的是为了激发学生学习的兴趣, 加强学生解决问题的能力, 并通过课程的前后延续性, 使得学生对计算机系统有更深刻的了解。 汇编语言作为C语言的后续课程, 在实践教学方面, 主要是以实验为主, 汇编语言本身内容复杂, 与实际硬件相关联, 即抽象又枯燥。而教师在实践课程中也是主要以验证理论课程中的基本知识点为目的进行实验, 学生实践调试时遇到问题, 给予解决。没有从本专业整体体系结构的角度, 对整个知识点架构有个整体的了解。 整个计算机类专业课程的开设, 不应该是以某门课程为中心点或单独学好某门课程, 而应该是作为一个整体, 让学生融会贯通, 再以此为基础结合学生各自的特点, 发展其具体的小专业方向, 提高学生的素质。实践类课程的开设使得该问题能更好的解决。 二、利用混合编程解决教学连续性问题 实践类教学对于提高学生的动手能力, 激发学生的兴趣, 提高学生就业的能力具有重要意义。广西科技大学是普通二本院校, 学生四年大学毕业后, 大部分同学参与就业, 所以如何使学生能更好的适应社会以及建立良好的专业素质, 使得学习和工作不产生脱节, 实践教学就尤为重要。本文从以下几个方面讨论C语言程序设计与汇编语言程序设计的混合实践教学。 (一) 明确实践教学对象与目标 针对本校软件专业方向生源质量的特点, C语言与汇编语言混合实践教学是在学生具有一定的C语言和汇编语言知识的基础上进行的, 以培养学生的动手能力并与实际工程项目相结合为目标。课程内容测重于理论与技术在工程中的应用, 使学生能够把理论与实际结合起来, 教学过程中上应尽可能结合具体的实例来讲解相应的技术和理论。 (二) 实践教学方法 计算机类偏软件专业实践教学的重点是以应用型为主导。但是, 大多数院校实践教学只注重理论性, 与实际应用联系较少, 并且由于部分教师缺乏实际实践能力, 造成学生很难有学习的兴趣和积极性。针对这些问题在本门实践教学课程中, 采取以下几方面进行改进。 1. 实践教学内容 教师在实践教学开展前进行调研, 针对目前本专业方向热门的课题结合C语言与汇编语言相结合的特点, 列出几个课程题目方向供学生选择, 学生也可根据自身的兴趣自主提出题目。例如进行驱动程序的开发、开发一些小型游戏以及设计一些小型操作系统等。此类题目即可以让学生对虚拟的理论得到实际的验证, 又可以对计算机整个体系架构有更清晰的理解。 实践课程开展的过程中, 将每个课题划分为相应不同的阶段, 由浅入深、由易入难不断加深, 教师针对每个阶段设定需完成的任务以及完成时间, 每个阶段进行相应的检查, 给出分数并指出学生存在的问题, 调动学生的潜能。实践课程结束时参照毕业设计答辩的形式, 以组为单位进行答辩。 2. 分层次以组为单位 针对实践课程上机时指导教师所指导的人数有限, 而学生自身的能力又各不相同, 提出将学生以组为单位, 每组5~6人, 优秀的学生与能力较差的同学相结合。这种方式与IT行业工作模式相对应, 培养了学生间互动合作关系, 即以能力强的同学带动能力差的同学, 又能够使教师有针对的快速的解决问题, 而学生又锻炼了动手解决问题的能力。 3. 培养学生文献查找能力 鼓励学生在课题开展前, 以及课程开展的过程中查阅资料, 丰富专业知识, 加强对实践课程题目的了解。IT行业是一个知识变换更新非常快速的行业, 如何能更快速的掌握好程序设计, 对于学生工作前景非常关键。 三、结语 计算机类偏软件实践类课程本身的目的就是通过实践验证理论, 并且加强学生的专业技能, 利于今后的就业。通过实践教学效果来看, C语言与汇编语言混合编程实践课程, 教学过程中与具体实际应用相联系, 增加了学生学习的兴趣, 扩大、整合了学生的知识体系, 取得更好的实践教学效果。 参考文献 [1]郑利平, 周国祥, 张冬艳, 李扬.结合高级语言的汇编语言教学方法研究[J].合肥工业大学学报 (社会科学版) , 2008. [2]谢文阁, 周军, 姚爽.计算机软件类课程教学模式的研究与实践[J].福建师范大学学报 (自然科学版) , 2012. [3]王新海, 王永贵, 张海涛.软件工程专业工程化实践教学研究与实践[J].辽宁工程技术大学学报 (社会科学版) , 2010. [4]马艳, 王浩.C语言实践教学方法探究[J].长江大学学报 (自然科学版) 理工卷, 2009. 1 C语言程序设计技术方法 (1) 可以在C语言程序之中确定汇编程序的常、变量。 (2) 可以在C语言编程当中适当的增加语句编辑, 保证实现C语言无法控制硬件的缺陷。 (3) 然而使用C语言程序时可以通过内部函数的使用加入汇编语言中的相应语句。 2 汇编程序设计技术及方法 在C语言编程当中, 可以将汇编语言的代码直接的编写进去, 并且融入汇编语言的过程当中可以不使用分号, 详细的语法是: 若想要将一组汇编语句融入到C语言中, 必须要将语句括到括号{}当中。 一般想要在C语言程序当中编入汇编语言, 有四种类型, 分别是一般指令、跳转指令、串联指令和局部定义指令。 汇编语言子程序应用在C语言中, 一般情况下汇编语言的子程序其基本格式是: 3 C语言汇编语言需要调用其它子程序的语言格式 把被调用程序其格式和普通汇编语言程序分布情况加以比较能够发现: 因为C语言程序和进行汇编的子程序需要共用同一个程序运行区间, 所以在刚刚开始进行子程序的C语言汇编时就需要运行PUSH BP和MOVE BO, SP这两个命令。 必须要把将会被修改和汇编到C语言程序中的子程序进行局部调用的PUBLTC操作, 通过进行PUBLTC的操作来表示该段C语言子程序已经参与到其他的操作中, 被其他程序所调用了。 虽然已经被调用的子程序会接受程序的控制, 但也需要对该段子程序利用SI和DI进行局部变量的保存, 但是仅在变量高于120分钟时, 才能将其在堆栈当中加以存放。因此, 这一模式进行过程中, 我们可以清楚的看到PUSH DI还有PUSH SI的语句。 在经过汇编的程序C语言中, 要把MYCODE的代码段、初始数据段、修改数据段进行分别的定义, 并且把这几个分段的汇编程序组合成为一个有效段组, 保证该段段组基址的共用性。 在汇编之后的程序语句之前必须要增加一段函数值语句, 保证语句可以有效的返回, 进行下一段的程序循环, 并且设置的返回值要在RET语句的前方。 值得注意的是, 不同意调用过的子程序必须要用RET的命令增加返回功能, 并且在结束语句后编辑结束END。这个END语句代表的是最终的终止, 没有相应的启动功能。 通过C语言子程序的汇编, 可以有效的保证其调用功能, 同时也节省了相应的程序编辑空间。例如在程序输入时, 不用修改程序的进位制就能准确的进行数据的读取, 也就是说参与汇编的C语言子程序在格式上不会有太大的改变, 只需要在原本子程序的起始部位增加相应的语句就可以了。 EXTERN函数名, 主要作用是为了反应出这个函数是C语言的子程序, 且是外部调用的、。原本的主程序语句, 可以利用外部程序来实现原本语句的调用功能, 具体的调用格式如下:CALL NEAR PTR函数名, 而在将C语言程序当做是子程序的过程中, 只包含有C函数, 并不需要EXTERN来进行进一步的说明。 4 连接两种语言 由于汇编语言和C语言二者均存在着一定的问题, 通过将两种语言混合编程, 能够弥补两种语言各自存在的不足, 因此, 下面阐述如何连接这两种语言。 4.1 传递参数 在调用C语言及汇编语言时, 可能会存在汇编语言的参数传递问题, 通常都是利用堆栈来进行传递, 通常在汇编C语言的过程中, 要把BP基址当作原数据的储存器, C语言的汇编参数全部储存在堆栈储存器当中, 如果在需要使用储存参数时, 可以把存储在堆栈当中的数据进行清除处理。 4.2 调用关系的确定 对于即将要调用的函数或者是过程, 要在调用开始之前明确的说明, 建立完整的调用关系, 详细的说明被调用的子程序是属于那个外部过程当中的, 并且被调用的子程序应用在什么模块当中。另外要根据调用模块和储存方式的不同, 对被调用的C语言汇编子程序进行格式的确定, 一般情况下被调用的在大模式下与原本程序类型基本相似, 小模式下存在微小的变化 4.3 模块连接 原有的C语言模块想要和汇编C语言的模块进行准确的连接, 就需要做到以下两点: (1) 原有C语言模块必须与汇编C语言模块的储存方式相同。 (2) 要求汇编模块要遵守和C语言模块兼容的相同命名。 因为编译系统在编译C源程序的过程当中, 将会在函数名以及变量名称的前面画有下划线, 想要保证连接前后相同, 全部被C语言调用的汇编子程序其标识符前面都要标记下划线。并且, 想要使汇编语言的标识符在C语言当中能够看见, 需要用PUBLIC来定义。要求汇编语言当中其C语言的变量以及函数, 必须要在二者前面加上下划线, 同时, 要求汇编程序开头的所调用C函数以及变量必须要用EXTERN对其进行说明。 为了有效保证C语言及汇编语言二者混合情况下设计的程序标准, 能够有效的实施, 必须要保证主要参数在变成函数被调用的过程中具有有效的传递作用, 并且要求针对程序设计具体的情况来确定两个语言之间相互调用的关系。 在C语言的程序当中包括六种储存形式, 分别是微型和小型以及中型和金丑行, 还有大型和巨型这六种储存的模式。通过这点我们可以知道, 主要由空间的大小来区别储存模式。在这当中微型的储存模式其程序和蹲站都在同一段中, 而小型的储存模式拥有数据以及代码段, 详细的数量为同一个。如果想要混合编程, 首先必须要保证这两个程序所使用的是一个储存模式, 对于汇编语言来讲, Model表示程序当中用到的伪指令, 之后需要连接的内容便是储存的模式, 通常是上面所讲的储存模式当中的一种模式。若C语言程序所使用的储存模式是小型的, 那么汇编语言当中就会表示成Model Small, 并且在这个时候这两种程序使用的储存模式一定是相同的类型。因为小型储存模式将Near当做是基础指针, 因此, 这种储存模式其运行效率极高, 所以说在实际混合编程的情况下, 如果符合条件这种情况下最好选择小型储存模式。 在编译C语言的过程当中, 在变量以及函数名称的下面将会添加下划线, 为了保证连接的质量, 调用子程序的过程当中, 任何标识符其下方都应该添加下划线。站在C语言程序的角度去看, 将会把所调用的对象其中实际的变量和函数作为伪命令, 进而起到说明的作用。一般把命令放在函数和变量的外部。除此之外, 由于想要保存汇编语言程序标示符的完整性, 应该使用PUBLIC定义相应的标示符。 5 结束语 通过本文对汇编语言与C语言的混合程序设计技术的进一步阐述, 使我们了解到在开发软件的过程当中使用这两种语言混合的程序设计的技术, 能充分发挥两种语言各自的特点, 扬长避短, 大大提高了软件开发的效率, 缩短开发的周期, 达到事半功倍的效果。通过本文对二者之间混合程序设计技术的具体阐述, 希望能够给使用汇编语言及C语言混合程序设计方面提供一定的帮助, 对于我国软件开发方面起到促进的作用。 参考文献 [1]陈久娅.C语言与汇编语言的混合程序设计技术研究[J].电子制作, 2013 (04) :61. [2]康晶晶.汇编语言与C语言的混合程序设计技术[J].计算机时代, 2013 (06) :1-2. 1 软件总体设计 作为翻译软件, 其存在的意义就是要将汇编语言的函数翻译成标准的C语言函数, 在这一过程中软件首先要做的是对汇编语言函数进行数据读取, 通过合理的软件总体设计, 让翻译软件按照设计路径读取目标文件, 在整体结构分析之后对汇编函数文件进行具体翻译, 并将翻译好的C语言函数输出到指定路径的文档中。 在汇编语言的翻译工作中, 因为汇编语言自身包含着严谨的逻辑关系, 所以不可能像普通语言翻译那样进行词对词的翻译, 而需要对汇编语言的整体逻辑进行分析, 完成了汇编语言的逻辑结构分析以后, 设定翻译工作的逻辑框架, 整个翻译工作都要在这一逻辑框架之下进行, 保证翻译输出的C语言函数对汇编语言函数的逻辑继承性。 在具体的翻译工作中, 为保证翻译工作的进度往往会将汇编语言分成几个逻辑模块, 针对模块中的汇编语言进行具体的翻译工作, 在翻译完成之后再对不同的模块进行重新组合, 其设计如图1所示。 2 软件各模块的设计 2.1 设计翻译前预处理的模块 翻译前预处理的模块主要可以实现四大功能:把原始的汇编代码读入到系统;把原始汇编代码分成块;把分好后的代码进行标准化处理;把标准化后的的代码模块进行提炼, 剔除原始数据信息只留下相应的指令信息, 并对剔除的数据信息和数据信息所在的位置信息妥善保存[1]。 原始代码的系统读入是翻译软件的翻译材料获取过程, 在这一过程中翻译软件对汇编语言的原始代码执行搜索、定位、获取等一系列的指令, 最终保证汇编语言的原始代码能够按照翻译软件的格式、内容要求输入到翻译软件中;对汇编语言的分块活动是一个关键的活动, 因为接下来的翻译工作将会以此为基础进行, 所以在原始代码的分块活动中一定要注意原始代码的逻辑关系, 尽量在原始代码的自然分隔区域进行分割, 保证每一个模块的逻辑完整性;模块分割完成以后, 对每一个代码模块都要执行一次代码的标准化程序, 将代码中存在的与翻译工作本身并无密切关系的次要信息剔除, 保证每一个模块代码的标准性;在模块标准化工作完成后, 要对模块代码信息进行提炼, 这一提炼过程主要是对汇编语言代码中的数据信息进行剔除, 保证在代码模块中存在的只是简单的汇编语言命令代码, 在对数据信息进行剔除的同时在数据信息的剔除位置预留关联信息, 保证在翻译工作完成以后, 能够将原有的汇编语言代码中的数据信息还原到他原本存在的位置[2]。之所以要进行这一环节是因为在翻译过程中汇编语言向C语言的翻译只是对编程语言逻辑的翻译, 让其由一种语言形式变为另外一种语言形式, 其中的数据信息是不会改变的, 所以在翻译之前要将数据信息剔除, 以防止其影响翻译工作的准确性, 在翻译完成之后再将数据信息还原到其原本存在的位置, 保证翻译信息的完整性。 2.2 破解汇编函数逻辑结构模块设计 与传统的语言翻译不同, 汇编语言作为一种计算机编程语言, 其本身存在着极为严谨的逻辑性, 而翻译的目标语言C语言也是一种应用于计算机编程的语言。所以, 一旦语言代码的逻辑性出现问题, 软件系统在计算机系统中的运行就会产生逻辑陷阱, 给软件系统的应用造成困难甚至会对计算机系统造成一定程度的伤害。所以这一翻译工作不仅对翻译的准确性有极高的要求, 同时对翻译过程中目标语言对翻译语言的逻辑继承性也有很高的需求, 翻译工作伊始就要对汇编语言的逻辑结构进行全面系统的分析, 在汇编语言基础上建立完整的逻辑框架, 保证之后各个模块的翻译工作都要遵守原始代码的逻辑框架要求, 让翻译工作的目标语言与原始代码语言有较高的逻辑继承性[3]。 2.3 原始数据内容嵌入结构体模块设计 在翻译工作完成以后要对原始代码语言中的原始数据进行重新嵌入, 这一过程是输出语言的完善过程, 在其进行过程中要保证原始数据信息的准确性, 同时还要保证数据信息位置的准确性, 这就需要原始数据的嵌入工作与原始数据的剔除工作系统的结合起来, 在数据的剔除过程中对剔除数据的内容和位置信息进行准确的记录并妥善保存, 同时在原始数据信息的位置建立一个映射, 链接到相应的原始数据信息的储存位置, 在翻译过程中对原始数据信息的映射链接原址带入就可以了, 在翻译工作完成后由翻译软件利用原始数据的映射进行数据恢复, 存在于目标语言各个位置的原始数据映射链接, 会按照预先设置好的路径找到相应的原始数据信息, 进而在目标语言中恢复原始数据信息, 保证目标翻译语言的完整性[4]。具体结构步骤如图2所示。 2.4 构建C语言函数结构模块设计 作为翻译软件的翻译目标语言, C语言是对原始语言汇编语言的一种新形式的诠释, 除了表现形式不一样之外, 应该在内容、逻辑和功能上和汇编语言保持高度一致, 只有这样才能保证翻译软件存在的意义, 因为只有在翻译过程中保持较高的准确率才能保证翻译出来的C语言能够直接应用, 如果相应的翻译软件不能保证这样的翻译准确率, 在翻译工作完成之后就要进行浩大且繁复的C语言代码检查工作, 这一工作还是需要有大量人员花费大量时间来进行, 就会造成翻译软件设计初衷的扭曲。针对C语言函数结构的模块设计, 可以建立一个函数翻译的树状结构, 保证翻译工作是严格按照科学合理的树状图进行的, 那么客观上就能保证输出结果的正确性[5]。 3 软件的测试分析 软件的可靠性的测试, 主要是测试软件在运行过程中对一些异常数据的反应, 这一测试的主要方法是对软件运行过程中的数据录入和数据分析环节进行数据输入式的测试, 首先进行的是异常原始代码数据的录入, 在这一测试过程中, 录入人员通过手动录入的方式向软件翻译系统提供异常数据, 如汉字、十进制字符串等, 测试结果显示软件翻译系统在面对这些异常的原始翻译数据时, 无法进行分析和翻译工作也没有相应的翻译数据输出。接下来进行翻译数据量的测试, 在翻译工作中翻译软件的同时翻译数量, 是对翻译软件工作效率进行评价的一个重要指标, 如果一个翻译软件能够在同样时间内完成更多的原始代码处理、翻译工作, 其整体的工作能力就必然更高, 在测试中输入录入人员用数据生成系统生成了5000行代码数据, 在同时录入翻译软件后翻译软件只接受了前2000行, 并进行了相应的数据分析和翻译过程, 保证输出了正确的翻译功能。 测试软件翻译的准确性, 要先测试各种逻辑结构语言翻译的准确性, 在翻译软件运行过程中, 翻译软件的破解汇编函数逻辑结构模块、原始数据内容嵌入结构体模块, 能否针对各种原始代码数据正常运行是影响翻译软件准确性的关键因素, 所以在测试过程中数据录入人员向翻译软件系统输入了各种结构的测试汇编语言, 在测试用汇编语言中设置了关键逻辑的标识符号, 在翻译软件完成翻译工作之后, 对关键逻辑的标识符号位置进行分析, 可以对测试汇编语言在翻译软件中都经历了那些翻译环节有全面的了解, 通过对关键逻辑标识符号经历的翻译环节反推翻译软件的逻辑分析是否有错误[7]。 在这一过程中对测试汇编语言中的if和else语句的逻辑分析要格外注意, 因为这种语句具有极强的内容结合性和语言逻辑性, 用人脑进行分析是很简单的, 但是对于只从数据角度出发的电脑逻辑分析能力是极大的考验, 很多翻译软件之所以会失败, 就是因为编译的翻译软件系统对需要翻译的汇编语言逻辑无法做出正确的分析, 输出的目标语言无法满足使用的要求, 其中出现的隐性逻辑错误需要进行人为的分析, 在分析过程中使用的人力资源甚至会高于人工翻译需要的人力资源, 这就违反了翻译软件开发的本质意愿。让翻译软件的存在没有实际意义[8]。 4 测试结果分析 在软件的可靠性上, 翻译软件可以很好的识别能力, 对输入的异常数据不会做出反应。针对软件翻译的准确性, 只要输入的汇编代码的行数小于2000行, 翻译的准确率就可以达到90%以上, 并且每一次输入的行数越少准确率越高。达到了翻译软件的初步设计目标, 起到了为后续翻译软件编辑工作提供借鉴的作用。 5 结论 随着电子信息技术在社会经济生活中的广泛应用, 编程语言的翻译工作必然会大量出现, 在这样的编辑工作形势下, 开发一种智能翻译软件是社会经济发展的需求, 本文从汇编语言向C语言的翻译领域进行了翻译软件的设计尝试, 希望能够为后续的翻译软件设计工作提供借鉴。 参考文献 [1]王志颖, 马卫东.一种PL/M语言到C语言自动翻译器的设计与实现[J].计算机工程与应用, 2004 (30) :109-112, 141. [2]张超.面向汽车电子OS的模型驱动开发方法的研究与实现[D].电子科技大学, 2013. [3]赵政文.FORTRAN语言到C语言程序变换系统的设计与实现[J].微电子学与计算机, 1991 (12) :17-20. [4]欧阳清华, 赵其峰, 唐正力, 等.反编译到VAXC的设计与实现技术——兼论反编译面临的难点[J].武汉大学学报:自然科学版, 1991 (3) :35-48. [5]阿米妮古丽·奥斯曼.维汉/汉维机器翻译译后编辑器的设计与实现[D].新疆大学, 2013. [6]曹少琨.基于Power的XL编译器性能自动化测试工具的设计与实现[D].西安电子科技大学, 2014. [7]李悝.MSP430单片机C语言和汇编语言混合编程刍议[J].信息通信, 2013 (1) :72-73. 一、汇编语言和C语言混合编程的方法 C语言和汇编语言实现混合的编程, 一个任务能够被分成不同的模块, 然后进行同步的编程, 这样可以提高编程的效率, 每个模块都可以运用函数来表达, 而且还可以借助子程序的形式存在, 按照不同模块的特点, 选择不同的语言编程的程序, 从而能够运用语言的编译系统, 生成想要的程序, 然后将每个模块的文件编程好以后结合在一起。在C语言程序中, 要借助汇编语言表达变量和常量的关系, 可以将汇编语言直接嵌入到C语言中使用, 从而能够实现对计算机硬件的强大控制功能。 1、C语言主程序的调用。 为了能够确保在C语言程序中对汇编语言的使用, 汇编语言的程序要按照要求来编写, 而且要按照一定的顺序进行。在对汇编语言的程序进行编写的过程中, 一般是先定义函数名, 然后定义变量, 形成初始化的数据, 最后是编写程序的语句。 2、汇编语言的主程序使用C语言的子程序。 在汇编语言中, 很多功能是C语言所不具备的, 所以, 在对汇编程序输入的过程中, 应该采用不同的进制数, 将汇编语言作为主程序, 将C语言作为嵌入式程序进行使用。汇编语言的主程序具有一致性的结构, 其是由不同的函数名构成的。在C语言中, 对汇编语言进行使用时, 首先要设计汇编的代码, 在C语言的程序中各个代码是用分号区分的, C语言的嵌入到汇编语言中, 可以采用一般指令和跳转指令的方法。 二、汇编语言与C语言连接的问题分析 汇编语言和C语言进行编程时混合使用, 需要分析函数在建立的过程中参数的传递问题, 分析汇编程序和C语言程序模块的有效连接的问题。 1、参数的传递。 在汇编语言和C语言共同使用的过程中, 由于其参数是不同的, 在两种语言混合使用时, 就需要实现参数的过度, 要对参数进行调节, 一般情况下是运用堆栈的方法实现参数的传递的。在汇编语言中, 地址寄存器一般是运用BP, 在程序调用之前, 应该先将C语言的参数放入到堆栈中, 这些参数在传递的过程中, 就要运用BP实现不同的偏移量的整合操作。 2、调用关系的确定。 在汇编语言和C语言调用的过程中, 应该要对其函数进行分析, 建立调用的关系, 在被调用的语言中应该分析函数的类型, 然后使语言能够被外部的模块使用, 调用的程序也需要例举出外部模块的形式。在对调用的关系进行分析的过程中, 要按照不同的储存方式进行, C语言是针对小模式进行的, 汇编语言是针对大模式进行的。 3、汇编语言和C语言的模块的结合。 在汇编语言和C语言混合使用之前, 实现正确的结合是关键, 要实现二者的正确结合, 首先要确保二者的储存模式是相同的, 而且汇编语言的模块要与C语言的模块具有兼容性特点, 采用相同的名称命名, 其函数和变量名称也应该是一致的。 在C语言中, 可以采用不同的储存模式, 比较常见的储存模式有小模式和紧凑模式, 在实现两种混合编程语言混合使用时, 要实现储存模式的一致。在汇编语言中, 一般使用的是伪指令的方法, 如果在C语言中采用的是小模式, 那么在汇编语言中也要采用小模式。在运用编译系统对C语言的程序编译的过程中, 应该确定其变量的名称, 在函数名称中, 应该是由不同的字母和下划线构成, 为了能够使程序保持一致性, 在汇编语言的程序中, 应该在所有的符号中都加有下划线, 为了能够使汇编语言的字符都能够子啊C语言中呈现, 一般都是采用PUBLIC操作符来定义的。 结语:在语言编程中, 将汇编语言和C语言混合使用, 能够充分发挥出二者的优势, 实现了参数的调节, 在传递信息的时候效率更高。所以, 在软件开发的过程中将二者结合使用, 提高了软件的实用性, 而且软件的可靠性得到了完善。两种语言结合使用能够提高软件的开发效率, 而且能够在编程的时候占据较小的空间, 实现空间的高效利用。 摘要:本文分析了汇编语言与C语言的混合技术, 在对大规模的程序进行设计的过程中, 要运用汇编语言和高级语言的合成, 从而能够展现出各自的优点, 实现两种语言之间的转化。在计算机程序设计的过程中, C语言能够对汇编语言起到调节的作用, 汇编语言的主程序也能够提高C语言程序的编程效率, 可以采用嵌入式的方法, 实现两种语言的共同使用。在对汇编语言和C语言共同使用的过程中, 实现参数的连接和模块的结合是重点问题。 关键词:汇编语言,C语言,混合编程 参考文献 [1]王文东, 李竹林, 尚建人.汇编语言与C语言的混合程序设计技术[J].计算机技术与发展, 2011, 08:18-20. [2]印德彬.汇编语言与C语言的混合程序设计技术[J].电子技术与软件工程, 2015, 02:254. [3]蒋仁祥.浅谈汇编语言与C语言的混合程序设计技术[J].大众科技, 2015, 02:16-18. 通过这样一个系统,学生可以随时随地进行C语言练习,巩固基础知识,强化专业素养;并且,系统可自动生成C语言试题,减轻教师工作量;在考试结束后,系统能够自动阅卷并评分,提高试题评测的准确性;综上所述,C语言试题生成系统将提高高校的办公效率和学生的专业素养。 关键词:C语言;自动组卷;在线评测;B/S 中图分类号:TP311.52 文献标识码:A 文章编号:1674-7712 (2014) 18-0180-01 一、国内外现状 国内外学者一直都热衷于试题生成系统的研究,试题生成系统主要包含两大主要模块:自动组卷模块和在线考试模块。自动组卷模块在长时间内一直有学者进行深入探讨,但至今并没有一个很好的算法方案。主要问题存在于采用经典的数学方法很难解决试卷生成过程中的收敛过程。目前的自动组卷模块根据其所使用的策略大致可以分成五类:基于随机抽取的自动组卷;基于深度与广度搜索算法的自动组卷;基于遗传算法的自动组卷;基于项目反应理论的自适应测试;基于数据挖掘和知识发现的自动组卷理论。而在线考试模块中,已经出现了ACM/ICPC的源代码在线评测系统,并且在实际应用当中效果显著,明显增加了阅卷人的效率。然而其要求运行环境苛刻,并且不具备通用性(只能应用于源代码的测试),所以并不能很好的应用于国内的科学教育工作当中。我国国内也自主开发了一些在线评测系统,如等级考试的机试测试部分,这就是一个很好的应用实例,每年有数千万的考生参加,也取得了显著的应用效果。然而由于其源代码的封闭性,致使其无法应用于其他高等院校。并且其系统当中也存在一定的效率问题。 二、系统概要设计 试题生成系统采用的是模块化的设计思想,不同的模块化对应不同的功能,而不同的用户对系统有不一样的功能需求。但总体来说本系统的功能需求主要包含包括几方面:(1)对用户的管理。用户在进入系统时,必须要注册用户,登录基本信息。在这项功能里,要实现对用户的有效管理,本系统的用户包括对学生、管理员、老师。在系统的数据库中队用户的基本信息进行记录管理。(2)对试题管理。系统在对试题管理的过程中,系统可以随机分组试题,自动合成试卷,或者通过手工调整、编辑试卷和打印试卷等。老师还可以添加试题,删除试题,修改试题,查询试题。系统会及时更新试题库,对试题库进行备份,同时对不同的试题内容和属性进行分类管理。(3)在线评测。学生在登录系统后,确认考试信息等内容,系统就会及时生成试题,考生就可以进行在线考试,不受地域的影响。而在选择套题的同时,系统会根据考生选择的套题,而列出考试范围的试题,给出每门课程合适的题型,而考生必须在规定的时间来完成。(4)成绩的管理。考生考试完成后,成绩将会保存在数据库中。而老师或者学生在考试完成后,通过任何一台联网的计算机上就可以通过网页方就可以查询学生的成绩。 总的来说,无论是学生考试还是教管理员对系统的管理还是老师对试题的添加修改,都能够随时随地通过网络完成对应的工作。 三、系統的功能模块 通过对系统的需求分析,明确了本系统需要包含题库管理、试卷管理、考试管理、成绩管理、学生管理、教师管理以及系统维护等七个模块。 四、核心模块详细设计 自动组卷模块是本系统设计的重中之重,其只需要教师进行简单的操作,便可根据教师设定的参数完成自动组卷,并且,在组卷之后还能够提示教师修正题目,对不适合的题目进行修改。在整个执行过程中,首先判定用户是否拥有操作权限,若没有操作权限则自动终止;若有操作权限,则要求用户输入试卷生成时用到的必要信息,如试卷难度、试卷类型等,以及各种类型题目的数量,然后根据上述信息构成Z(X),U(X)数组,使用随机选择法生成所要求的试题;在生成试题之后,询问用户是否需要进行修改,若需要进行修改,则根据输入的题目编号,修改对应的题目信息。如此往复直到节后,最后将相关信息分别存入试卷信息表和试题试卷对应表中。 五、结束语 系统的实现有效地提高了教学的管理,大大提高了工作效率。在系统的详细设计开发过程中,采用模块化的设计,采用当前比较流行的ASP技术,AJAX技术,基于B/S应用体系结构,让系统更加健壮和灵活,能够适应系统的不断变化和发展。一个良好的试题生成系统它所涉及的内容和知识面较多,由于时间和条件的限制,系统仍存在一定的问题,今后的研究着重从以下几个方面着手:(1)完善试题生成系统各模块的功能的实现。(2)更深入地完善试题生成的算法,让试题的调度更加合理科学。(3)更深入地学习考试数据的备份与恢复。(4)由于在本系统中主观题还需要老师亲自去修改,在以后的研究方向中需要进一步研究主观题的网上考试的自动打分。(5)在题库的建设问题上做更深入的研究。(6)进一步的做好系统的安全工作,防止黑客的入侵导致试题的泄露。(7)考试的监控系统,功能还有待完善,例如能够实现人脸识别等功能。 参考文献: [1]谭浩强.C程序设计(第三版)[M].北京:清华大学出版社,2007:10-12. [2]宋云娴,白鹏.智能教学系统设计与实现[M].北京:电子工业出版社,1995:60-90. [3]师书恩.信息技术教学应用[M].北京:高等教育出版社,2004:19-35. [4]郑玉.基于Web的计算机辅助教学系统[J].电子工程师,2001(02):15-17. [5]深泉,胡宁静.数据库设计和自动组卷中的几个问题[J].湘潭大学自然科学学报,2002(03):27-31. 关键词:PIC单片机,PICC编译器,C语言,汇编语言 目前,最常用PIC单片机C语言编程环境是MATLAB调试环境和HI-TECH编译器PICC。虽然还有众多支持PIC单片机的C语言编译器,但PICC因为稳定、可靠、编译生成的代码效率高,而受到青睐。用C语言来开发PIC单片机系统软件最大的好处是编写代码效率高,软件高度直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等。因此用C语言编程,在进行系统设计和开发的工程师群体中得到广泛认可。既然C语言是一种强有力的程序设计语言,那么是不是就可以抛弃汇编语言?写单片机C程序最关键的一点是单片机内设资源非常有限,同时,要求控制的实时性高,这就要求对单片机体系结构和硬件资源有详尽的了解,而这些恰恰是汇编语言的优势,所以对于PIC爱好者,尤其初学者而言,C语言与汇编语言混编是不可避免的。实际上,C语言和汇编语言混合编程可以使单片机应用程序的开发效率和程序本身的运行效率达到最佳的配合。 1 PICC对RAM的特殊要求 下面,我们通过一个引例的不同编程来看PICC对RAM的特殊要求。 例:将RAM中的BANK0的0X20~0X2F共16个单元置为55H。 1.1 采用汇编语言编程 程序1: 程序1经过调试,运行后能实现引例功能。 1.2 采用C语言编程 程序2: 程序2中运用指针知识,经过调试没有发现错误,但运行后根本无法满足引例的要求。 修改程序2第2行为:“bank2 unsigned char i;”,即变量i改到RAM的BANK2。运行的结果是将0X56~0X64共15个单元置为55H。再次将程序2第6行修改为:“tmp=0x21;”,运行后,RAM的0X21~0X30共16个单元置为55H,离要求还有一点距离。 1.3 采用C语言绝对定位技术 程序3: 程序3将定义的指针定位在BANK0的0X30单元开始的区域,与0X20~0X2F区域没有冲突。经过调试运行能实现引例功能。 1.4 采用C语言与汇编语言混编 程序4: 程序4中唯一变量i定义在RAM的BANK2区域,程序经过调试运行能实现引例功能。要说明的是,C语言与汇编语言混编时,汇编语言部分的特殊功能寄存器名必须采用下划线引导和大写字母。 从以上不同方法的编程出现的结果,可以看出在C语言环境下,PICC对File Registers(RAM数据存储器)中的20H~7FH单元具有绝对使用权,这些单元位于BANK0的最后,即通用寄存器的96个字节。所以,在编程时若要应用这部分单元,那么,则在C必须放在除BANK0外的RAM中,否则运行结果不可预料。 2 PICC混编时对传递参数的要求 2.1 采用局部变量进行主函数与自定义函数之间的数据传递 PICC规定,应用局部变量传递数据,在汇编语言部分引用参数时,第2个形参要写成?_函数名,第3个形参要写成?_函数名+1,以此类推。而第1个形参以及函数内部自定义变量必须分别命名为?a_函数名,?a_函数名+1,,至于?a_函数名先分配给第1个形参或是第1个自定义变量则不确定。 程序5: 程序5中的自定义函数名为Test,共有inVar1~inVar4等4个形参,函数内部还有1个自定义变量tmp1。在汇编语言中inVar1写成?a_Test+1、inVar2~inVar4分别写成?_Test~?_Test+2、而tmp1写成?a_Test。需要说明的是: 1)程序中C语言部分若不对第1个形参inVar1进行操作,则在汇编语言部分中对inVar1处理是无效的!也就是不分配内在单元给inVar1。 2)程序中C语言部分若不对函数内部的自定义tmp1进行赋值或运算,则在汇编部分对tmp1处理是无效的,也就是不分配RAM空间。 以上两点,在进行C语言与汇编语言混编时应特别关注。 2.2 采用全局变量进行主函数与自定义函数之间的数据传递 程序6: 程序6采用全局变量传递数据,共定义tmp、tmp1、tmp2三个全局变量,分别定义在RAM的BANK0、BANK1、BANK2,其中tmp、tmp1用于函数之间传递函数,在汇编语言部分要使用这两个全局变量时,只要在变量名前加下划线作为引导就可以了。但要注意的是,若这些全局变量定义在非BANK0,如程序中的tmp,则在汇编语言部分使用时,必须写成_tmp1^0x80。若是定义在BANK1,就得写成_tmp1^0x100,若是定义在BANK2,就得写成_tmp1^0x180。 程序7: 程序7除定义了全局变量,还在自定义函数中定义了一个自定义变量tmp1,同样在汇编部分要换名为?a_Test,需要说明的是,若对tmp1不赋初值,那么在汇编时会出现“找不到?a_Test”错误信息,而无法通过汇编。 使用全局变量最大的好处是寻址直观,只需在C语言定义的变量名前增加一个下划线,即可在汇编语句中寻址,使用全局变量进行参数传递效率比形参传递高。 3 C语言主函数内含汇编语言的情况 程序8: 程序8在主函数内定义两个变量,这两个变量在汇编语言部分使用时,必须换名为?a_main和?a_main+1,需要说明的是,第1个自定义变量tmp,在汇编语言部分使用?a_main前,在C语言部分必须先进行赋初值或计算,否则会出现错误。 程序9: 程序9在主函数外定义了两个全局变量,它们在汇编语言部分使用比较简单,只要在变量前加下划线引导就可以。 4 结束语 可以看出,C语言和汇编语言混合编程在具体实施时,一定要注意许多细节问题,否则运算结果不可预料。 一般来说,在项目开发过程中,程序量较大且PICC进行后道编译优化,采用C语言编写的代码不会比全部用汇编编写的代码差多少。所以,既然用了C语言编程,就尽量避免使用嵌入汇编指令或整个地编写汇编指令模块文件。对于非得采用C语言和汇编语言混合编程,一定要注意:1)尽量使用嵌入汇编;2)尽量使用全局变量进行参数传递。 参考文献 [1]李荣正.PIC单片机原理及应用[M].北京:北京航空航天大学出版社,2006. [2]周坚.PIC单片机轻松入门[M].北京:北京航空航天大学出版社,2009.C 语言教学改革探讨与实践 第3篇
汇编语言与C语言比较 第4篇
C语言接口与实现实例 第5篇
汇编语言与C语言比较 第6篇
汇编语言与C语言比较 第7篇
汇编语言与C语言比较 第8篇
汇编语言与C语言比较 第9篇
汇编语言与C语言比较 第10篇
汇编语言与C语言比较 第11篇
汇编语言与C语言比较 第12篇
汇编语言与C语言比较
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


