论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> 复习资料 >> IT正文
程序员考试补课笔记-第七天
 作者:佚名     2007-3-15 14:58:29        来源:不详  浏览次数:
今天终于都讲到C语言比较后的范围了,"函数"说是C语言的一切真的没错(可能有吧,我不知道)。很多书上都说着函数是C语言根本,就是说函数是构成C语言的。看以下这个程序:

main()

{

  printf("Hello World");

}

  main()就是C语言里最特殊的一个函数,是构成整个程序的关键。在C编译器里首先就是要找出这个主函数才开始执行编译,好了,说了一些书上原来的东西。现在我们就来看看C语言里的函数究竟是怎么的,如果我们从基础的说起也没有什么意思。那么我们就从函数的另一个特点说起,"递归函数"相信很多人都知道这个吧,看过老潭的教程应该都知道他经典的第一个递归程序吧:

int abc(int n)

{

  int s;

  if(n >1) s= n*abc(n-1);

  else s=1;

  return (s);

}

  从这个源程序很容易就看出有一个同自己名字的函数在里面,所以以后我们看到一个函数里面调用自己就是递归函数了。而且我们看一个递归函数就主要就是看它是否一个返回的条件,就好像一条又黑又深的山洞,我们前去探险如果往到底就一定要回头,就算是更深的也要返回啊!所以我们判定一个递归函数是否成立也常常是看它的返回条件。至于上面的那个源程序我也不想多说了,应该大家也看得明白。

这里就看看另一个利用递归函数做的题目吧,就是诺汉塔(老潭的书上也是有的)。

#include <stdio.h> 

void move(char x,char y) 

{

  printf("%c-->%c\n",x,y);

void hanoi (int n,char one ,char two,char three) 

{

  if(n==1) move (one ,three); 

  else 

  {

    hanoi (n-1,one,three,two); 

    move(one,three); 

    hanoi(n-1,two,one,three); 

  } 

main() 

  int m; 

  printf("input the number of diskes:"); 

  scanf("%d",&m); 

  printf("the step to moving %3d diskes:\n",m); 

  hanoi(m,'A','B','C'); 

/*运行情况如下: 

input the number of diskes:3 回车 

the step to moving 3 diskes: 

A-->C 

A-->B 

C-->B 

A-->C 

B-->A 

B-->C 

A-->C 

书上说hanoi(n-1,one,three,two);是把"one"上的n-1个往"two"上移,接着move(one,three);然后是hanoi(n-1,two,one,three)即把"two"上的n-1个往"three"上移;

|h(2,1,3,2)|h(1,1,2,3)=>move(1,3) <-----1------ 

|      | move(1,2) <-----2------ 

|      |h(1,3,1,2)=>move(3,2) <-----3------ 

|move(1,3) <-----4------ 

h(3,1,2,3) | |h(1,2,3,1)=>move(2,1) <-----5------ 

|       h(2,2,1,3)|move(2,3) <-----6------- 

|       |h(1,1,2,3)=>move(1,3) <-----7------ 

*/

  注意以上是网上一个网友写的,并不是我写的。诺汉塔最不同的就是它多次调用自己,所以看起来也比较复杂一点。当时我在看这条程序的时候也是看了老半天也看不懂,最好我在网上看到一位朋友说他自己是真的拿了一些碟子自己试着移来看看,后来我也自己试着看,效果真的挺好(我当然没有笨那这么大的碟子啦,用我的光盘写上大、中、小),大家不访也试试看。加上看了上面这个图我也比较清晰了,我要感谢那位网友才行,你们说是吗?这个程序一定要自己慢慢去理解它,祝大家早日理解它吧。递归函数部份我因为不太懂也不能说些什么了,现在来看看函数的另一个内容吧,就是函数的参数调用。我这里先给出一个程序先吧: 

int abc(int a,int b)

{

  a=a=b; return( a+b );

}

main()

{

  int xy[]={3,5};

  int s;

  s=abc(xy[0],xy[1]);

}

  这里的将xy[0]和xy[1]分别传入形参里,这里要说的一点就是和其它高级语言不同的,C语言的函数调用都是单向传递的。限实参传了给形参之后并不会返回到传进来的实参的,所以我们务必记住这点。又如下面一题: 

int abc(int a[])

{

  int i,j; 

  /* 排序 */

}

main()

{

  int x[5]={3,5,1,2,4}

  abc(x);

/* 输出 */

}

  这条源程序可为什么会改变实参的数值呢?老潭的书里说的很明白,说是因为这是地址传递,但是我们老师不太认同这点,他说这个也应该是值传递,只不过这个值是比较特殊的一个值,是地址,所以传到形参时可以通过调用这个地址指向的元素而已。如果按老潭的这样说以下这条程序都叫地址传递啦?

int abc(int *p)

{

  *p=10;

}

main()

{

  int a=20,*w;

  w=&a;

  abc(w); /*abc(&a)*/

  printf("%d",a);

}

  指针P也只是一个值而已,这个值是地址。如果说这是地址传递,那不是应该w的地址传给形参吗?剩下来的大家自己想想吧。(这里也不能够说谁对谁错)

  接下来说说变量的存储类别,其实这个知识点也挺容易理解的,不过可能给C语言太多的这样的关系弄的糊涂了。C语言里有变量的类型,变量的存储类别,变量的全局性还是局部性,是静态的还是动态的呢。一切都是C语言变量的东西,我们这回也该好好的结束了它。(我们大家一齐看书吧)

  很对不起大家,因为今天我的眼有点问题(可能看电脑看太久了)。所以不要再继续和大家进一步讲讲存储类别,这里有一条源程序大家看看吧,我不行了,我要好好休息一下才行了。

int abc(int a)

{

int i,j;

scanf("%d%d",&i,&j);

if(i>j)

{

int k=1,i=2,j=3;

pirntf("%d\n",i*3);

printf("%d\n",j*10);

}

printf("%d",k);

}

责任编辑:lss
  相关新闻
程序员考试:数据结构笔记
2006年上半年《程序员》试题分析
2005年下半年程序员考试试题结构分析
为什么要学习Java,成为Java程序员
思科证书到期了怎么办—再认证程序介绍
经典的C程序案例
程序员考试补课笔记-第九天
2006程序员第一章系统基础知识[讲义]
程序员考试补课笔记-第六天
2006年软考程序员数据结构复习笔记
为什么要学习Java,成为Java程序员
C++程序设计从零开始之何谓
信息系统管理工程师、信息系统运行管理员考试说明
由“电脑盲”成为高级程序员的语文教师
程序员考试补课笔记-第一天
程序员考试补课笔记-第三天
程序员考试补课笔记-第二天
程序员考试补课笔记-第四天
程序员考试补课笔记-第六天
程序员考试补课笔记-第八天
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号