c语言程序设计解析

2025-02-17 版权声明 我要投稿

c语言程序设计解析(精选11篇)

c语言程序设计解析 篇1

大多数计算机系统的内存储器是由众多的存储单元构成的。在微机中,每个存储单元是1个字节,它由8位二进制数构成,可以表示28=256种信息,各位的编号从0~7,最左边的位(第7位)是最高位,最右边的位(第0位)是最低位。由于二进制本身的特点,各位上的数字不是1,就是0。

本章中的位就是指上述提到的二进制位,本章中的位运算就是指对这些二进制的位进行逻辑运算、移位运算等操作。

2.数的编码

数在计算机中是以二进制表示的,但是它并不是简单地以它本身的数值的二进制形式来直接表示,而要进行一定的编码,以方便计算机进行处理。常用的编码有原码、反码、补码三种。

3.真值与原码

我们将一个十进制数的二进制表示称为这个十进制数的真值,它代表了这个十进制数本身的数值。下表列出了一些数的真值。

真值举例

数二进制表示真值(16位)

1

70

1

1110000000000000000

0000000000000001

0000000000000111

15

1111

0000000000001111

255

4095

6553511111111

111111111111

11111111111111110000000011111111

0000111111111111

1111111111111111

用真值表示的数只能是正数,对于负数,要用“一”号标明,例如:

-7的真值为-0000000000000111-65535的真值为-1111111111111111

这势必造成用计算机表示数时的不便,故引入了原码表示法。

在原码表示法中,最高位代表符号位,用“1”表示负数,“0”表示正数;余下的数位用来表示真值的绝对值。

数字零存在着两种表示方法:+0与-0。

4.反码

若采用反码表示,则对应的原码应按照以下方法进行转换:

(1)如果真值为正,则它的反码与原码相同;

(2)如果真值为负,则反码的符号位为1,其余各位就是对原码取反(即原码的1变为0,原码的0变为1)。

5.补码

(1)为什么要引入补码

补码具有许多独特的优点:首先它可以变减法运算为加法运算,使得计算时步骤统一,速度提高;其次,在这种系统下的“0”只有惟一的一种表示方法,这就是现代的计算机系统中大多采用补码的原因。

(2)补码的规定

①正数的原码、补码、反码均相同;

②计算负数的补码时,先置符号位为1,再对剩余原码的位数逐位取反,最后对整个数加1。

在微机上以8位二进制数为一字节的存储单元中采用补码系统,它可以存放的最小整数为-128,最大整数为+127。若采用两个字节来表示一个整数,则可表示的最小整数为-32768,最大整数为+32767。

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

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

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

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

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

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

7.计算机二级C语言程序设计考点解析:程序设计基本

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

9.计算机二级C语言程序设计考点:C语言的应用

c语言程序设计解析 篇2

一、常见错误分类

1. 语法错误

指违背了C语法的规定, 对这一类错误, 编译程序一般能给出“出错信息”, 并且告诉在哪一行出错, 但经常出现出错位置不准确, 导致初学者无法完成程序的调试。

2. 逻辑错误

程序并无违背语法规则, 但程序执行结果与原意不符。这是由于程序设计人员设计的算法有错或程序编写有错, 导致逻辑上出现错误, 这一类错误往往是最难于解决的, 对于初学者更是难于解决。

3. 运行错误

程序无语法错误, 也无逻辑错误, 但在运行时出现错误甚至是停止运行。比如程序不具有“健壮性”就会出现此类错误。

二、常见语法错误解析

1. 变量未定义

当程序编译运行时, 出现“undefined symbol‘x’in function main”错误信息时, 就是提示在主函数里变量x没有定义;可能在程序定义变量x就漏掉没定义或者大小写混淆了, 加上变量x的定义语句或者大小写统一后该问题就解决了。

2. 语句丢分号

当程序编译运行时, 出现“statement missing;in function main”错误信息时, 就是提示在主函数中某行语句少了分号, 找到丢了分号的语句加上分号该问题就解决了。

3. 复合语句丢右半边花括号

当程序编译运行时, 出现“compound statement missing}in function main”错误信息时, 就是提示在主函数中某个复合语句少了右半边的花括号, 找到对应位置加上}就可以了。

4. 复合语句丢左半边花括号

当程序编译运行时, 出现很多个错误, 而且错误信息都一样, 即“declaration syntax error”, 基本可以确定是某个复合语句少了左半边的花括号, 就导致复合语句中所有语句都出现这样的错误提示信息, 找到复合语句的起始位置加上{就可以了。

5. 错把“=”当成“==”

在使用条件表达式时, 若错把“=”当成“==”使用会导致运行结果与题意不符, 如:

程序运行时, 无论输入多少运行输出结果都是1, 原因就在错把x==1写成x=1了, x=1相当于对变量x赋值1, 使得if语句后面的表达式永远为真, 所以输出都是1。所以要正确理解使用“=”和“==”。

6. 在不需要加分号的地方加了分号

在进行选择结构和循环结构程序设计时, 一定记得不要在if和while等后面的表达式后括号外加上分号, 否则会导致程序出错。

若有以下程序段:

按照语法要求, if的子句若是两条以上语句必须形成复合语句, 在if (a>b) 后面本不该加上分号, 但错误的加上了以后运行会报错, 提示你else位置出错, 没有正确和if相匹配, 原因是错误加上分号以后分号就成了if语句的子句, 如果想在if语句成立时可以执行语句a>b就必须去掉分号或者将分号和语句max=a一起复合成复合语句。

若有以下程序段:

程序的本意是求输入的正数的和, 但在编译运行时, 输出的结果却不是正数之和, 原因在于错误的在语句while (a>0) 后面加了分号, 加了分号导致该分号成为了while语句的子句, 当a>0时相当于什么都不做, 所以无法实现将正数进行累加, 若加正确实现程序本来功能, 应该将分号去掉或者将分号和语句s=s+a;一起用花括号复合成复合语句。

7. 在scanf函数语句里没有正确使用取址符&

按照语句要求, 在使用格式输入函数scanf时, 必须使用地址表列对变量进行赋值, 否则变量无法正确得到所赋的值, 但程序编译运行时并不报错, 只是运行结果与预期不符, 这就需要编写者自行进行调试, 利用断点或单步调试来测试每一步执行的结果, 最终解决问题。

若有以下程序段:

程序编译运行时并没有出错报告, 运行时输入2, 3输出结果是a=2, b=x。x是变量b在内存中所占单元里初始化的数值, 预先无法知道x到底是多少, 为什么会得到这样的输出结果?原因就是变量b前的取址符丢掉了, 导致无法正确将数值3存储到变量b在内存中所占的存储单元, 因此变量a可以正确得到赋值而变量b却无法得到正确赋值。

8. 输入的数据形式与要求不符

在用scanf进行数据输入时, 要求输入格式必须与格式提示符格式保持一致, 否则尽管变量前都正确加了地址符&也无法使变量正确得到赋值。

如在7的程序段中, 运行时输入的两个数据之间必须用逗号进行分隔, 即2, 3;而且不能加有其他的输入成分, 否则都会导致变量无法正确被赋值, 如输入2 3, 2;3等等都不正确, 这样输入变量a可以正确得到赋值, 但变量b无法正确得到赋值;若输入a=2, b=3诸如此类的话将导致变量a和b斗无法正确被赋值。

以上各种语法错误是初学者在编写调试程序时会经常遇到的, 还有很多其他的错误信息随着学习的时间的推移都会遇到, 如在学习数组时会遇到一些与数组相关的错误信息, 经过不断的学习, 积累调试经验这些问题都会迎刃而解的。

三、初学者编程时的注意事项

1. 先纸上编写然后上机运行

对于初学者来说, 如果采用直接上机进行编写编调试的话效果肯定不好, 加上对语法的理解应用不够熟练常常导致束手无措;如果能在上机前先将程序在纸上写好然后再上机运行效率将大大提高。

2. 在人工检查无误后才可以上机调试

在编译运行时, 有时提示的出错行并不是真正出错的行, 如果在提示出错的行上找不到错误的话应该到其上下各一行查看。另外, 有时提示出错的类型并非绝对准确, 由于出错的情况繁多而且各种错误互有关联, 因此要善于分析, 找出真正的错误。

3. 运行结果不对, 多数属于逻辑错误

逻辑错误比较难于修改调试, 要经过一段时间的学习积累, 才能较快的解决这一问题。

参考文献

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

[2]刘若华, C语言程序设计教学中常见错误及分析[J], 农业网络信息, 2011.02

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

试题1:

void test1

{

char string[10];

char* str1 = “0123456789″;

strcpy( string, str1 );

}

试题2:

void test2()

{

char string[10], str1[10];

int i;

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

{

str1[i] = ‘a’;

}

strcpy( string, str1 );

}

试题3:

void test3(char* str1)

{

char string[10];

if( strlen( str1 ) <= 10 )

{

strcpy( string, str1 );

}

}

试题1字符串str1需要11个字节才能存放下(包括末尾的’’),而string只有10个字节的空间,strcpy会导致数组越界;

对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;

对试题3,if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’’所占用的1个字节,

剖析:

考查对基本功的掌握:

(1)字符串以’’结尾;

(2)对数组越界把握的敏感度;

(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的.总分值为10,下面给出几个不同得分的答案:

2分

void strcpy( char *strDest, char *strSrc )

{

while( (*strDest++ = * strSrc++) != ‘’ );

}

4分

void strcpy( char *strDest, const char *strSrc )

//将源字符串加const,表明其为输入参数,加2分

{

while( (*strDest++ = * strSrc++) != ‘’ );

}

7分

void strcpy(char *strDest, const char *strSrc)

{

//对源地址和目的地址加非0断言,加3分

assert( (strDest != NULL) && (strSrc != NULL) );

while( (*strDest++ = * strSrc++) != ‘’ );

}

10分

//为了实现链式操作,将目的地址返回,加3分!

char * strcpy( char *strDest, const char *strSrc )

{

assert( (strDest != NULL) && (strSrc != NULL) );

char *address = strDest;

while( (*strDest++ = * strSrc++) != ‘’ );

return address;

}

从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊!

(4)对strlen的掌握,它没有包括字符串末尾的’′,

读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为: int strlen( const char *str ) //输入参数const

{

assert( strt != NULL ); //断言字符串地址非0

int len;

while( (*str++) != ‘′ )

{

len++;

}

return len;

}

试题4:

C语言程序设计实验 篇5

1.编写一个程序,求出给定半径r的圆的面积和周长,并且输出计算结果。其中: r的值由用户输入,用浮点型数据处理。

2.给一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上

为’A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。

3.输入两个正整数m和n,求其最大公约数和最小公倍数。

4.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

5.求sn=a+aa+aaa+…+aa...a(n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222

(此时n=5),n由键盘输入。

第二次试验

1.有一分数序列:,,23581321,...求出这个数列的前20项之和。1235813

2.求一个33矩阵对角线元素之和。

3.将一个数组中的值按逆序重新存放,例如原来的顺序为:8,6,5,4,1。要求改

为:1,4,5,6,8。

4.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格、以及其他字符的个数。

第三次实验

1.将字符串computer赋给一个字符数组,然后从第一个字母开始输出该串。请用指针实

现。

2.将无符号八进制数字字符串转换为十进制整数。例如,输入的字符串为556,则输出十

进制整数366。用指针实现。

3.编程输入一行文字,找出其中的大写字母,小写字母,空格,数字,及其他字符的个数,用指针实现。

第四次实验

1.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。

2.写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

3.写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个

数,在主函数中输入字符串及输出上述的结果。

c语言课程设计设计报告 篇6

C语言是一门通用计算机编程语言,应用广泛。下面是小编为大家整理的关于c语言课程设计的设计报告,欢迎大家的阅读。

高等职业教育的目标及侧重点不同于普通高等教育,其培养的学生在毕业后应能直接上岗,具有熟练的实践操作技能。教育部《关于以就业为导向深化高等职业教育改革的若干意见》中指出,高职教育应“坚持培养面向生产、建设、管理、服务第一线需要的‘下得去、留得住、用得上’,实践能力强、具有良好职业道德的高技能人才”。

因此,加强实践性课程教学,对保证人才培养质量显得尤为重要。我院为贯彻《关于全面提高高等职业教育教学质量的若干意见》精神,针对区域经济发展的要求,灵活调整和设置专业课程,以就业为导向,加快专业课程对应的课程设计改革。目前,我院按照由浅入深、不断深化的教学规律,构建了实践教学三层次四环节的实践课程体系。实践教学三层次包括基本技能、专业拓展、综合创新,四环节包括实验、实习实训、设计和课外实践。“C语言课程设计”是我院信息类专业的必修专业基础课程设计,在“C语言程序设计”课程教学结束后的下一学期进行,历时2周,40学时。课程开设的目的在于培养学生分析问题和解决问题的能力,为学生提供一个动手、动脑、独立实践的机会。

21项目教学法“项目教学法”是基于建构主义教学理论的一种教和学的模式。著名的瑞士心理学家皮亚杰认为,知识不是通过教师传授得到的,而是学生在一定的情境下,借助他人的帮助,利用必要的学习资料,通过意义建构的方式而获得的。美国项目管理专家约翰·宾认为:“项目是要在一定时间里,在预算规定范围内需达到预定质量水平的一项一次性任务。”

“项目教学法”是通过实施一个完整的项目而进行的教学活动,旨在把学生融入有意义的任务完成的过程中,让学生积极地学习,自主地进行知识的建构,在课堂教学中把理论与实践教学有机地结合起来,充分发掘学生的创造潜能,提高学生解决实际问题的综合能力。因此,在教学活动中,教师将需要解决的问题或需要完成的任务以项目的形式交给学生,在教师的指导下,以小组工作方式,由学生自己按照实际工作的完整程序,共同制定计划,共同或分工完成整个项目。

在项目教学中,学习过程成为一个人人参与的创造实践活动,注重的不是最终的结果,而是完成项目的过程。在高等职业技术教育中,项目是指以生产或制作一样具体的、具有实际应用价值的产品的工作任务。在技术领域,很多小产品或一些复杂产品的模型都可以作为项目,如:在信息类专业,可以开展微机组装、网站建设、信息管理系统开发、局域网构建、单片机制作、多媒体课件制作等项目;在电子类专业,可以开展报警器、LED、门铃、家电组装等项目;在商业、财会和服务行业,所有具有整体特性并有可见成果的工作也都可以作为项目,如商品展示、产品广告设计、营销策划等。

22项目教学法的基本特征项目教学法与传统的教学法相比,有很大的区别,主要表现在改变了传统的3个中心:以教师为中心转变为以学生为中心;以课本为中心转变为以“项目”为中心;以课堂为中心转变为以实际经验为中心。项目教学法具有以下特点:

实践性。项目“源”于企业,项目的主题与真实世界密切联系,由浅入深,选择的项目具有典型性、实用性。

自主性。提供学生根据自己的兴趣选择内容和展示形式的决策机会,让学生能够自主地进行学习,从而有效地促进学生创造能力的发展。

发展性。长期项目与阶段项目相结合,构成了实现教学目标的认知过程。

评价特殊性。项目型教学的评价注重学生在项目活动中能力发展的过程,测评内容包括学生参与活动各环节的表现及作业质量,避免了传统的一张试卷定成绩的弊端。测评可以采用自评、小组评、教师综合评等方法。教师只有明确并抓住项目化教学特点,才能更好地完成教学目标。

31教学内容为了更好地开展课程设计教学,经过多次实践和摸索,总结出学生在具体实施项目中一般存在2个方面的知识不足:

第一,在教学内容上,由于前导课程在教学上受学时影响,很多教师对指针、结构体、共用体和文件基本操作的知识介绍不甚完善、系统,更难谈上辅以实例加以消化。对此,针对学生在这些知识点上的掌握程度,利用4~6个学时,实施区别式的、辅导性的、实例化教学。

第二,学生对项目管理知识知之甚少,针对此情况,采用2个阶段实施有别于常规教学的补课行动。第1阶段为项目准备阶段,利用2~4个学时,安排曾经做过项目且做得比较好的学生,现身介绍项目的准备工作、项目实施过程要完成的工作、项目验收及作业提交的工作等。在学生介绍中,教师穿插讲解,辅以点评。第2阶段为项目实施阶段,教师应针对学生发生的问题,及时给予指导,直到学生弄懂为止。

32教学要求切实保证教学质量和教学效果,本着“学以致用”的原则,要求学生做到以下3点:第一要做到“学有三备”,即:在项目实施前做好知识储备,在项目实施中做好安全防备,项目结束时做好被评准备。第二要写好“三书一报告”。“三书”即每个项目组要做需求规格说明书、概要设计说明书、详细设计说明书,“一报告”即人人都要做课程设计报告。第三要做“四自”参与者。“一自”即自律,要求学生自觉履行学生守则和项目实施有关规则,不迟到、不早退、不缺席,实施点名制度,若无特殊原因,有5次旷课者自愿以重修论处;“二自”即自尊,要求学生尊重知识、尊重学习规律、尊重项目组成员、尊重教师、尊重自己;“三自”即自信,要求学生相信自己能够按时、按量、按质完成工作内容,遇到困难时,沉着、冷静,理性地寻找问题解决的办法;“四自”即自强,要求学生不满足自己已有的成绩和以往与课题项目组共同取得的成绩,用创新和超越的思想,做出比以前哪怕是前进一小步的事情。同时也要求教师做好相应的工作,如做好项目整体规划、精心准备、努力激发学生参与行为、为人师表、表扬为主、批评为辅、多分析、精点评等。

33项目实施进程项目教学法是一种生动、灵活、多样化的教学方法。在项目实施过程中,既不能生搬硬套地利用一个时间标准,又不能影响项目实施的整体进程,因此对时间的灵活处理是非常关键的,也是值得商榷的。

34明确项目内容,帮助学生立项立项首先要审题。当学生拿到项目列表时,最不能忽略的问题,就是提醒学生审题。审题恰当对学生以后开展各项工作是关键。审题时,学生首先要考虑自己的长、缺处,做到扬长避短,也就是说审题就是学生自己审自己完成该项目有多大的能力,有没有信心。只有学生明白自己,才可以避免以后实施项目过程中走弯路。同时既要建议学生在组建项目组时,考虑所在组的其他学生的长处和短处,又要尽量避免使被学生认定的差等学生没人愿意与其组合,而成绩好的学生又抱团的现象发生。

根据近几年带课程设计的经验,关于如何合理选择项目,建议教师应从学生的角度考虑以下4个因素,协助学生做好选题:

规模。项目规模太大会影响项目的完整性,项目规模太小难以体现课程的实践性。

难度。项目难度一定要适中,既要激发学生学习的兴趣又不能影响学生的自信心。

实用性。项目的选择应该是现实世界真实的工作任务,具有一定的现实和实用性。

利用反汇编手段解析C语言函数 篇7

函数是C语言中的重要概念。利用好函数能够充分利用系统库的功能写出模块独立、易于维护和修改的程序。

函数并不是C语言独有的概念,其他语言中的方法、过程等本质上都是函数。可见函数在教学中的重要意义。

在教学中一般采用画简单的堆栈图的方式描述函数调用,但由于学生对堆栈没有直观认识,难以深入理解,因此教学效果往往并不理想,从而限制了对模块化程序设计思想的理解和应用。

2 解决方法

在《微机原理》课程介绍了堆栈、汇编语言等必要的相关知识之后,通过在高级语言开发环境下反汇编C语言程序代码,使得学生通过分析汇编代码来理解函数调用中的堆栈变化,可以在实践中理解高级语言和低级语言的底层映射关系,理解函数调用的实质。

本文通过在Visual C++6.0下反汇编一个32位C语言程序的部分代码来解析解释函数调用的具体过程。

3 函数调用过程

函数调用过程主要由参数传递、地址跳转、局部变量分配和赋初值、执行函数体,结果返回等几个步骤组成[1]。

3.1 参数传递及函数跳转

参数由实参传递给形参。在底层实现上,即是实参按照函数调用规定压入堆栈。参数传递完成后就通过CALL指令由当前程序跳转到子程序处。

3.2 局部变量分配并赋值

函数的“{”被认为是分配局部变量空间的时机。在汇编层面局部变量分配体现为堆栈中以EBP寄存器为基址向低地址端分配的一个连续区域,通过EBP寄存器的相对寻址方式来寻址函数内的局部变量。

由于堆栈增长的方向是高地址端到低地址端,因此函数中先定义的局部变量地址较大,后定义的变量地址逐渐变小,相邻定义的变量其地址一定相邻[2]。由于全局数据和局部数据定义在不用的数据区而并不与局部变量相邻,根据程序局部性原理,相邻的数据会被缓存,因此对相同的运算,局部变量作为操作数的运算效率就可能高于有全局变量参与的运算。同时,局部变量分配和回收只需要移动堆栈指针ESP,因此效率最高。

3.3 寻址函数的参数

参数存放在以EBP为基址的高地址端。对参数的访问同样是通过EBP寄存器相对寻址操作来实现。

3.4 执行函数体内的语句

函数内和具体功能相关的语句被转化成一系列汇编语句。

3.5 返回值

return语句将返回值返回到主调函数。在底层,参数是通过EAX寄存器或EDX寄存器传递给主调函数。

3.6 返回主调函数

函数的“}”被解释为函数体已经执行完。遇到“}”时,会将堆栈中的局部变量、程序中压入堆栈的寄存器的值全部弹出,将之前CALL指令执行时压入堆栈的函数返回地址弹到指令指针寄存器EIP,从而返回到主调函数。

3.7 堆栈平衡

堆栈平衡指的是将函数调用前压入堆栈的参数弹出堆栈,使堆栈恢复到其调用前的状态[3]。由于函数调用完成后,参数就是无用的数据了,因此需要将其移出堆栈。

在C语言中不需要进行堆栈平衡。而在汇编层面上却根据调用约定来确定由主调函数或是被调函数完成堆栈平衡。

C语言函数调用堆栈常见形式如图1所示[4]:

参数由主调函数压入堆栈,CALL指令将函数返回地址入栈。进入子函数后,需要保存EBP原值、分配局部变量空间、保存寄存器初始值。函数内通过“EBP-位移量”方式访问局部变量,通过“EBP+位移量”方式访问参数[5]。

每发生一次函数调用,就会在堆栈中建立一个栈帧,栈帧在函数调用后释放。但是系统的堆栈资源有限,因此如果函数调用(如递归调用)层数过多,则可能发生堆栈溢出错误。

4 反汇编代码分析

以下将函数function的调用相关代码在Visual C++6.0 Debug模式反汇编,通过对汇编代码的分析揭示函数调用的关键点和细节。完整的C语言程序代码如图2所示:

Function(i,&j)语句的反汇编代码如图3所示:

先找到主函数中的局部变量i,j(其在堆栈中位置为EBP-8和EBP-4),将其压入堆栈。Visual C/C++的编译器对C语言程序的默认函数约定为_cdecl[6]。此参数入栈约定为自右向左,并且对函数名前加“_”修饰符。先将j的地址压入堆栈,后将i的值压入堆栈。通过call指令调用函数。从Call指令可见fuction函数编译后加了“_”修饰符。Call指令执行时自动将函数的返回地址入栈,之后转到function定义处开始执行此函数。

对funciton函数的“{”的反汇编结果如图4所示:

在函数内,遇到“{”时分配局部空间。在Debug模式下,这个区域大小为“40H字节+局部变量总字节数”,并用值“0xCCH”进行初始化。未在定义时初始化的局部变量其初值就与“0xCCH”相关。因此int类型变量由于占四个字节,其初值为-858993460(0xCCCCC-CCCH);两个连续的0xCCH对应汉字“烫”字,因此当以字符形式显示函数内未初始化的变量时会显示为“烫烫…”;指针类型变量就指向了地址为0xCCCC-CCH的内存。由此在调试模式下能很容易发现未初始化的变量。

堆栈基本的存储单位为四字节,对于小于四字节的数据按四字节对齐方式分配空间。因此char类型变量ch虽然数据本身需要两个字节,也分配了四个字节空间。array字节数组分配空间时每个字符占一个字节,不够四个字符时按四字节对齐存放。因此局部变量空间总数为40H+4+4×2+4=50H。局部变量ch的地址为EBP-4,a、b的地址分别为EBP-8,EBP-0CH,array数组的地址为EBP-10h。

函数左括号右括号间的所有的语句反汇编结果如图5所示:

若变量有初值,则反汇编就会为其生成一条Mov指令为其赋值。对于没有初值的变量其每个字节都为0x CCH。对于字符数组,情况稍微复杂一些。字符串常量“abc”被存放在全局数据区中。当需要引用其值对数组进行初始化时,实际是将全局数据拷贝到堆栈中的局部数组array里。由于寄存器是32位,每次最多只能赋值4个字符,因此对数组赋初值的语句反汇编后可能产生一至多条汇编语句。

对数组内容的访通过[“EBP+数组首地址+偏移量]的寄存器间址来完成,因此局部数组初始化费时但访问时的效率高。

在函数内访问局部变量和参数通过[EBP+位移量/-位移量]来完成。

函数返回值被放到EAX寄存器中供主调函数使用。

可见,在汇编层面上,函数内部并不存储局部变量,局部变量只有当函数调用发生时才会在栈上为函数分配空间。因此当函数调用后返回局部变量的值是错误的。

遇到函数“{”时的操作如图6所示:

将寄存器EDI、ESI、EBX恢复原值;将ESP调回到EBP处;将EBP原值弹出。此时ESP指向函数返回地址。执行出栈指令,将函数的返回地址弹入EIP寄存器返回到主调函数。

此时堆栈中只残留有调用函数时压入的参数还没有清理。

主调函数中的堆栈平衡语句如图7所示:

根据_cdecl约定,需要由主调函数完成堆栈平衡。主调函数根据压入堆栈的参数的数目2和参数大小,利用指令add ESP,8将参数全部弹出。此时堆栈就恢复到其调用前的状态。一个完整的函数调用过程完成。

5 教学效果

通过对比和实践使学生深刻理解了所学概念,提高了学习兴趣,在实践中找到高级语言中部分约定的底层根源,从而在程序书写中自觉避免相关错误的发生,提升了综合素质。

6 结束语

通过在VC6.0环境下对一个C语言程序反汇编代码、堆栈变化过程的详细分析,揭示了函数调用过程中的几个关键点。对深入了解函数调用、变量分配机制和调试排错起到一定程度的帮助作用。

参考文献

[1]苏小红,陈惠鹏,孙志岗,等.C语言大学实用教程[M].电子工业出版社,2004.

[2]周荷琴,吴秀清.微型计算机原理与接口技术[M].2010.

[3]俞甲子,石凡,潘爱民.程序员的自我修养-链接装载与库[M].电子工业出版社,2009.

[4]李肖坚,钟达夫,夏冰,等.缓冲区溢出原理及植入代码的分析研究[J].计算机应用研究,2007(1):163-166.

[5]李毅超,刘丹,韩宏,等.缓冲区溢出漏洞研究与进展[J].计算机科学,2008(1):87-90.

C语言程序设计课程的教学探索 篇8

关键词: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语言程序设计》学习心得 篇9

通过这一阶段网络的学习,我总结出以下几点,在今后的教学过程中可以尝试加以注重:

(一)激励学生学习兴趣,充分调动学生学习积极性

学习兴趣就是学生在心理上对学习活动产生爱好、追求和向往的倾向,是推动学生积极主动学习的直接动力。爱因斯坦说过:“兴趣是最好的老师,真正有价值的东西,并非仅仅从责任感产生,而是从对客观事物的爱与热忱中产生”。我国古代教育家孔子也说:“知之者不如好之者,好之者不如乐之者。”只有“好之”、“乐之”方能有高涨的学习热情和富有创造性地去完成学习任务。明确学习目的,激发学习兴趣

只有学习思想端正,学习目的明确,学生才会有学习的动力,才会有学习的自觉性。有的学生认为C语言已经落伍了,没有什么用,我们要使每个学生明确即将学习的知识与社会的关系,告诉学生学习C语言是建立程序设计思想,学习程序设计的各种基本概念、方法、技巧,培养良好的程序设计风格。在讲C语言程序设计课程前,收集大量招聘C语言编程人员的就业信息及毕业生从事C语言编程工作的收入、工作条件、工作岗位等学生十分关注的重要信息。同时,也列举了大量用C语言完成商业性软件工程,以激发学生学习C语言的动机的热情。学生有了主动性,才会自觉地学习这门课。

(二)设计问题,开发智力,引导学生自己解决实际问题

在教学过程中,我们提倡学生在课堂上发现问题、提出问题,对于学生在练习中所遇到的问题,教师不能马上告诉答案,应当适当的启发和引导让学生自己找到答案,培养他们的思考能力。同时教师要精心设计一些富有启发性的问题,达到开发学生智力的目的。这样做有两方面的意义:一是为了引人入胜,激发学生的学习兴趣;二是对知识本身提出疑问,加深对问题的认识和讨论,这也是推动 C 语言课程教学艺术化的途径之一。

(三)强化课程设计,加强学生能力培养

课程设计是整个课程学习的总结与提高,通过必要的课程设计,切实加强学生的能力培养,通常课程设计贯串整个教学环节,设计内容以具体的软件系统的开发为基础,重点让学生掌握软件开发的基本思路与方法。课程设计必须以学生为主,教师的指导重点放在总体方案制定、设计进度上。教师在课程设计过程中应经常到学生中去答疑,检查学生设计进度与设计方案、设计结果的正确性,及时发现问题并辅助解决。课程设计尽量做到每个学生的设计有所差别,并要求学生独立完成设计环节。对学生的设计方案不追求最优,只要合理就支持学生坚持完成,最后在考评阶段进行重点点评。

课程设计结束时学生必须上交课程设计说明书,同时还要进行答辩。学生答辩结束教师给予正确引导,指出设计中存在的问题,并指导学生如何完善。答辩前学生要事先准备大量的知识点,答辩过程不但锻炼学生的表达能力,还能使学生认识到自己的设计的优缺点,也了解了别人的设计思想,开阔了视野。总结

c语言程序设计怎么学习 篇10

1.在编写各类单片机功能程序时,不要急于书写,一定要先想出一个很好的结构和方法,虽然你写出来的程序可以正常运行,但是你是否想到了它的可维护性,可阅读性等等一些很重要的因素呢?所以一定要先想出一个很好的架构在来开始编写。

2.c文件,和h文件设计的要求。C语言显得非常的自由,但我们在工作中为了程序软件的种种原因,一定要规范自己的写法,这对自己和他人都是有利的。在单片机的程序中,我们应该把一个模块功能建立一个单独的C文件,这一C文件中包含和该模块功能全部相关的函数体,同样把和该C文件相关的常量,表达式等等也单独的建立一个h文件,最好是只让它对应的C文件引用,不要让其它的C文件进行引用,这样很好的体现程序的模块化和内聚性。在对单片机的内部寄存器进行操作的程序,我们应该单独的建立一个文件,只允许MCU内部的寄存器名出现在该文件中,你试想一个,在你的所有文件中这这里出现一个寄存器名,那里出现一个寄存器名,是不是可读性不好,没有实现程序的模块化呢?在程序过程中我们应该把多次用到的变量和常量最好的定义为宏,这样当这些变量 ,常量要更改时,就可以很方便的更改,不用大量的去寻找。在使用文件包含时,一定要注意路径的选择,什么时候用,“ ”,不用出现重复编译的情况,有时重复编译可能编译器没有报错,但是这样明显不好。要学会很好的使用条件编译语句,这对我们的程序很有用,在很多小型的操作系统中,都有硬件裁减的功能选择,这正是利用了条件编译,需要这一功能时我们就定义它,不需要时就不去定义,显得很方便。

3.指针的妙用。C语言的特色就在于它的指针。很好的使用指针能让我们的程序更加的有条理性,同样它也是C语言中语法最难的一点了,所以在使用时一定要注意。具体的好处太多了,在这就不在多说了,大家自己体会就能很好的明白了。

c语言程序设计解析 篇11

《C语言程序设计》教学内容枯燥抽象,学生不容易理解,加上编者对教材的处理上过于注重实践技能的培养,采用“任务驱动”法组织教材内容,通过一些实际案例阐述各章节的重要知识点,又通过案例延伸对相关知识点进行了扩展和延伸,使得各知识点都融合在各案例当中。这样虽然达到了各教学知识点的有机统一,但从知识点的连贯性和层次性上来讲,不容易被学生理解掌握。同时,该教材用学生信息管理项目案例作为主线,对于毫无编程经验的职专生来说,起点过高。

C语言程序设计的学习,主要涉及到C语言基础知识框架的建立和算法思想的培养,算法思想即是数学建模的过程,而且c语言的编写都是用英语字符来完成的,这就需要学生在数学和英语两科的综合运用能力上达到一定的要求,而职业类学校的学生恰恰在这两个科目上弱项,这就进步增大了教学的难度。在教学实际过程中,可能遇到无论教师怎么解释,学生都不知所云的情况。

同时,在c语言的学习程当中,也往往要涉及很多计算机硬件原理的知识,对于处于高二的职专生来讲,对一些计算机基础知识还不能达到融会贯通的程度,计算机知识不系统,这就更加增大了实际教学的难度。

针对以上教材的情况以及学生的实际接受能力,经过教学实践的摸索探讨,我总结出了如下“C语言程序教学”的方法 。

1.在教材的处理上,结合学生实际,做到有针对性地制定教学目标,提高学生的接受能力。

我在实际教学过程中,还是以本教材为主,但在知识结构上做了一些细化。在给学生分析完教材中的案例后,对涉及到的相关知识点进一步完善和系统,使学生整体上掌握住案例的实质。例如;在讲“变量”的过程当中,变量值的储存是一个访问内存物理地址的过程。在这里,就需要对学生扩展一些关于内存物理地址方面的知识点,让学生对整个变量值的储存过程能够清楚明亮,从而提高学生对知识点的接受能力和牢固度。

在备课过程中,在意识地在每课时的教案中穿插一些计算机小知识,以激发学生学习的兴趣,提高学生学习程序涉及的积极性。

2.把教授的专业性知识与学生熟悉的相关常识相联系。

在C语言授课过程中,可能会遇到一些专业性的术语,学生从来没接触过,不知道为何物。这种情况下,授课老师可以列举一些与之有联系的比较实际的常识来做类比。比如我在给学生讲授C语言程序的基本构成单位为“函数”时,因为C语言中的“函数”和数学中“函数”不是一种概念,而是完成一个相应功能的程序模块,学生容易混淆。所以我把C语言中的“函数”比作是人体里的各种器官,其最大的作用就是完成相应的功能,我们人体是各个器官的组合体,而C语言程序就是各个“函数”的组合体,这样,学生对函数的概念就会明了很多。

3.采用“自主——合作——探究”式的学习方式。

教材的编者在出版说明中谈到,要强调学生学习的自主性,强调以学生的团队学习为主,让学生分成小组共同就某些问题讲行探讨,使学生最大限度的自主掌握知识。当然,这是一种理想化的教学方式,但在实际教学过程中也不是不能实现,最起码在一定程度上可以实现,所以任课教师可以试着去培养学生的这种能力。

一些教師在教学设计中虽能体现出学生“自主—— 合作 ——探究”的意识,但在具体操作中形式化严重,实效性不强。

兴趣是学生的最好老师,大部分学生还是比较喜欢计算机这个专业的,我们应该充分抓住学生的这一特点,发挥他们的主体作用,让他们自主探索,自主学习。职校二年级的学生已经有了较好的判断、推理和逻辑思维能力。我在教学过程中,经常采取提取问题-探索问题-解决问题的方法。老师可以自行出个例子,设置疑问,让学生自主学习,这样的教学效果要比在课堂上死讲要好的多。比如,在讲解条件和循环语句,多配以流程图来增强学生直观性和理解性。在讲数组时,采用图例分析,让学生对数组各元素分布情况,产生准确的认识和理解。现在的高中学生,很自我,独立意识和接触新鲜事物的能力非常强,让学生自行分组设计一些小课题,即提高了学生的自主能力,也让同学之间也不由自主的互相帮助起来。最主要的是让学生自己发现问题并解决问题。这时候老师就要做好引路人,在学生自主学习的时候,给予适当帮助。

4.精讲多练,加强实践。在学生理解项目思想,确定项目的算法后,有针对性地对项目中涉及的知识点进行讲解,对于那些学生自己能完成的内容,少讲,只做提示,甚至不讲。课堂上留足够的时间,让学生多进行实践操作,同时加强巡查辅导,及时发现和纠正学生的错误。

总之,在难度较大的课程教学过程中,不仅要备好课,还需要用创新精神探究各种教学方法,培养学生的实践能力。作为年轻老师,我们应该一丝不苟地去面对学生,面对教材,面对自己这神圣的职业。

上一篇:心怀感恩珍惜拥有下一篇:2024年乡村少年宫活动计划