查看全部128种考试
软件水平考试
 考试动态 报考指南 历年真题 模拟试题 复习资料 心得技巧 专业英语 技术文章 软考论坛 考试用书
 程序员 软件设计师 网络管理员 网络工程师 系统分析师 数据库系统工程师
1
2
3
4
5
6
7
8
9
10
Exam8.com  
【字体: 程序员考试补课笔记-第七天
程序员考试补课笔记-第七天
spks.exam8.com 来源:考试吧(Exam8.com) 更新:2004-12-27 13:28:00 软件水平考试 考试论坛
今天终于都讲到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);

}

转帖于:软件水平考试_考试吧
文章搜索  
看了本文的网友还看了:
·程序员考试补课笔记-第九天  (2004-12-29 23:59:00)
·程序员考试补课笔记-第八天  (2004-12-27 13:29:00)
·程序员考试补课笔记-第六天  (2004-12-27 13:27:00)
·程序员考试补课笔记-第四天  (2004-12-27 13:26:00)
·程序员考试补课笔记-第三天  (2004-12-26 13:21:00)
·程序员考试补课笔记-第二天  (2004-12-26 13:20:00)
软件水平考试权威辅导教材: 订书电话:010-62168566  更多>>>
网友评论
昵 称: *  评 分: 1分 2分 3分 4分 5分
标题:   匿名发表    (共有条评论)查看全部评论>>
版权声明 -------------------------------------------------------------------------------------
  如果软件水平考试网所转载内容不慎侵犯了您的权益,请与我们联系,我们将会及时处理。如转载本软件水平考试网内容,请注明出处。
关于本站  网站声明  广告服务  联系方式  付款方式  站内导航  客服中心  友情链接  考试论坛  网站地图
Copyright © 2004-2008 考试吧软件水平考试网 All Rights Reserved    
中国科学院研究生院权威支持(北京) 电 话:010-62168566 传 真:010-62192699
百度大联盟黄金认证  十佳网络教育机构  经营许可证号:京ICP060677