论文部分内容阅读
摘 要: 在C语言的教学当中,利用Sleep()等函数通过更加直观的显示效果,来使循环嵌套的层次更加清晰,break和continue等作用更加直观;通过硬件思维中的内存结构可以使初学者对指针有一个最根本也是最直接的认识,从而学生无论是对指针的认知还是使用,都将变得非常容易。
关键词: Sleep;循环;硬件思维;指针
中图分类号:TP312.1 文献标识码:A 文章编号:1671-7597(2012)0210144-01
0 引言
循环嵌套对于初学者来说是个难以理清的知识点,尤其是内层循环和外层循环之间的关系也只能是靠多加练习来体会;虽然断点测试可以清晰的看到运行情况,但是复杂的地址和中间值对于初学者来说更难理解。我们这里借用一些辅助函数,比如说Sleep函数,来使嵌套的层次更加清晰,使break和contimue的对循环的影响更加清楚。指针更是让许多学生望而怯步,归根到底是学生对于硬件知识的缺乏,我们这里采用先对学生讲解内存存储原理的方式,是学生对指针的认识更加直接和深入。
1 Sleep函数在循环嵌套中的妙用
在学习循环嵌套的时候,我们往往都是写完代码后一次性将最终结果显示在窗口,或者一次性将所有的结果显示在窗口,这样就很难看清每次循环所做的具体事情。虽然我们可以用断点测试来看程序运行的具体情况,但是断点测试对于初学者来说太过复杂。在这里我们用一个比较直观的例子,再加上一些辅助函数来了解循环和循环嵌套的详细过程。
例1:用C语言实现一个格式为“分:秒:毫秒”,范围为00:00:00~19:59:99。
我们这里首先根据题意分析可得,1秒=1000毫秒,这里我们毫秒采用两位,即99代表990毫秒。我们采用6个int类型变量m1(分的十位),m2(分的个位),s1(秒的十位),s2(秒的个位),ms1(毫秒的百位),ms2(毫秒的十位),他们之间的进位关系为:1m1=10m2,1m2=6s2,1s1=10s2,s2=10ms1,1ms1=10ms2,利用这些变量之间的进制关系,我们采用6层for循环嵌套来实现,循环部分的核心代码如下:
这样实现的结果根本做不到秒表读秒的效果,也看不出循环执行的具体层次。所以我们引入Sleep函数,并利用“ ”来打到比较好的读秒效果。在VC里面加上头文件#include,便可利用Sleep函数将程序挂起(暂停)一段时间,时间长短取决于Sleep(unsigned long)函数中的参数,其参数代表毫秒,Sleep(1)表示将程序在此挂起1毫秒,在本例题里,我们采用Sleep(10)表示将程序每执行一次printf函数就挂起10毫秒,刚好和秒表的右边第一位跳一次的时间相等。利用“
”返回行首,这样我们改造后的代码为:
return 0;}如此一来,我们就实现了秒表的效果。通过秒表的贴近日程生活的进位显示现象,我们可以非常清晰的看出循环嵌套之间的层次,从而对循环嵌套有一个一步到位的清楚认识;并通过添加Sleep函数的使用,还对学生自主拓展知识有一定的引导作用。
2 硬件思维在理解指针中的妙用
语言课是学生的入门课,由于没有地址的概念,所以对于指针的认知一直都是难点。我们这里先向学生介绍内存及内存地址的组织情况,从内存地址的角度来讲解指针,这将是学生对指针的认识和掌握有个一步到位的认识。
所谓指针,其实就是所需的操作数的地址,我们这里以简单的直接一次间接寻址为例,我们先看一下内存和内存地址的简单组织情况:
我们举一个简单的例子来说明,例如有如下定义:
int a=1000,*p;
p=&a;
这里的内存和内存地址结构我们就以上面简单的形式组织,以典型的32位字长为例,变量值和指针(地址)均可放到内存单元中。刚开始定义变量a并赋予其初始值1000的时候,我们是将变量a的值1000存到000号单元中,然后定义指针变量p时是将008号单元分配给指针变量p,也就是说008单元中放的是指针变量p;p=&a操作是让指针变量p指向变量a,也就是将008单元中的指针变量值具体化为000,在以后的通过指针p引用变量a的时候,*p中的*的意思是指:取指针变量p的值(000)作为地址去找操作数,而000号单元中放的就是变量a。这也就是在引用时,*p和a是等价的。
利用内存结构还很容易在函数中用指针传参能改变变量的值,而通过普通变量传参因为作用域的问题而无法改变变量值。例如有如下代码:
输出结果中,a=1b=4,在调用函数fun的时候,第一个参数传的是变量a的值,但是main函数中的a和fun函数中的a并不是一个变量,000单元中的变量a是main函数中的a,003中的a是fun函数中的a,a=3是对fun中的a赋值,并未对main函数中的a做出任何改变;但fun函数中的*q=4是对q中的地址001中的变量b进行赋值,而001中的变量b刚好是main函数中的b,所以main函数中的printf语句输出的a还是1,而b则变成了3。
以上就是硬件思维在指针学习中的作用。
参考文献:
[1]谭浩强,C程序设计(第四版),北京:清华大学出版社,2009.
[2]蒋本珊,计算机组成原理(第二版),北京:清华大学出版社,2010.
关键词: Sleep;循环;硬件思维;指针
中图分类号:TP312.1 文献标识码:A 文章编号:1671-7597(2012)0210144-01
0 引言
循环嵌套对于初学者来说是个难以理清的知识点,尤其是内层循环和外层循环之间的关系也只能是靠多加练习来体会;虽然断点测试可以清晰的看到运行情况,但是复杂的地址和中间值对于初学者来说更难理解。我们这里借用一些辅助函数,比如说Sleep函数,来使嵌套的层次更加清晰,使break和contimue的对循环的影响更加清楚。指针更是让许多学生望而怯步,归根到底是学生对于硬件知识的缺乏,我们这里采用先对学生讲解内存存储原理的方式,是学生对指针的认识更加直接和深入。
1 Sleep函数在循环嵌套中的妙用
在学习循环嵌套的时候,我们往往都是写完代码后一次性将最终结果显示在窗口,或者一次性将所有的结果显示在窗口,这样就很难看清每次循环所做的具体事情。虽然我们可以用断点测试来看程序运行的具体情况,但是断点测试对于初学者来说太过复杂。在这里我们用一个比较直观的例子,再加上一些辅助函数来了解循环和循环嵌套的详细过程。
例1:用C语言实现一个格式为“分:秒:毫秒”,范围为00:00:00~19:59:99。
我们这里首先根据题意分析可得,1秒=1000毫秒,这里我们毫秒采用两位,即99代表990毫秒。我们采用6个int类型变量m1(分的十位),m2(分的个位),s1(秒的十位),s2(秒的个位),ms1(毫秒的百位),ms2(毫秒的十位),他们之间的进位关系为:1m1=10m2,1m2=6s2,1s1=10s2,s2=10ms1,1ms1=10ms2,利用这些变量之间的进制关系,我们采用6层for循环嵌套来实现,循环部分的核心代码如下:
这样实现的结果根本做不到秒表读秒的效果,也看不出循环执行的具体层次。所以我们引入Sleep函数,并利用“ ”来打到比较好的读秒效果。在VC里面加上头文件#include
return 0;}如此一来,我们就实现了秒表的效果。通过秒表的贴近日程生活的进位显示现象,我们可以非常清晰的看出循环嵌套之间的层次,从而对循环嵌套有一个一步到位的清楚认识;并通过添加Sleep函数的使用,还对学生自主拓展知识有一定的引导作用。
2 硬件思维在理解指针中的妙用
语言课是学生的入门课,由于没有地址的概念,所以对于指针的认知一直都是难点。我们这里先向学生介绍内存及内存地址的组织情况,从内存地址的角度来讲解指针,这将是学生对指针的认识和掌握有个一步到位的认识。
所谓指针,其实就是所需的操作数的地址,我们这里以简单的直接一次间接寻址为例,我们先看一下内存和内存地址的简单组织情况:
我们举一个简单的例子来说明,例如有如下定义:
int a=1000,*p;
p=&a;
这里的内存和内存地址结构我们就以上面简单的形式组织,以典型的32位字长为例,变量值和指针(地址)均可放到内存单元中。刚开始定义变量a并赋予其初始值1000的时候,我们是将变量a的值1000存到000号单元中,然后定义指针变量p时是将008号单元分配给指针变量p,也就是说008单元中放的是指针变量p;p=&a操作是让指针变量p指向变量a,也就是将008单元中的指针变量值具体化为000,在以后的通过指针p引用变量a的时候,*p中的*的意思是指:取指针变量p的值(000)作为地址去找操作数,而000号单元中放的就是变量a。这也就是在引用时,*p和a是等价的。
利用内存结构还很容易在函数中用指针传参能改变变量的值,而通过普通变量传参因为作用域的问题而无法改变变量值。例如有如下代码:
输出结果中,a=1b=4,在调用函数fun的时候,第一个参数传的是变量a的值,但是main函数中的a和fun函数中的a并不是一个变量,000单元中的变量a是main函数中的a,003中的a是fun函数中的a,a=3是对fun中的a赋值,并未对main函数中的a做出任何改变;但fun函数中的*q=4是对q中的地址001中的变量b进行赋值,而001中的变量b刚好是main函数中的b,所以main函数中的printf语句输出的a还是1,而b则变成了3。
以上就是硬件思维在指针学习中的作用。
参考文献:
[1]谭浩强,C程序设计(第四版),北京:清华大学出版社,2009.
[2]蒋本珊,计算机组成原理(第二版),北京:清华大学出版社,2010.