码迷,mamicode.com
首页 > 编程语言 > 详细

C语言基础-第五课-函数

时间:2017-08-02 14:22:38      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:而在   end   down   自定义函数   代码   意思   次方   binary   斐波那契   

1   函数

1.1   函数的原型和调用

在使用函数前必须定义或者声明函数

double circle(double r);

int main()

{

    double length = circle(10);

    printf("length = %f\n", length);

    return 0;

}

 

double circle(double r)

{

    return 2 * 3.14 * r;

}

 

1.2   函数的形参与实参

在调用函数的时候,函数大多数都有参数,主调函数和被调用函数之间需要传递数据。

在定义函数时函数名后面括弧中的变量名称为“形式参数”,简称形参。在调用函数时,函数名后面括号中的变量或表达式称为“实际参数”,简称实参。

1形参在未出现函数调用时,他们并不占用内存单元,只有在发生函数调用的时候形参才被分配内存,函数调用完成后,形参所占的内存被释放

2实参可以是变量,常量或者表达式

3在定义函数时,一定要指定形参的数据类型

4形参与实参的数据类型一定要可兼容

5在C语言中,实参与形参的数据传递是“值传递”,即单向传递,只由实参传递给形参,而不能由形参传递给实参。

如果函数的参数是个数组,那么是可以通过形参修改实参的值的

1.3   函数的返回类型与返回值

1函数的返回值通过函数中的return获得,如果函数的返回值为void可以不需要return语句。

2函数return语句中的返回值数据类型应该与函数定义时相同。

3如果函数中没有return语句,那么函数将返回一个不确定的值。

1.4   main函数与exit函数与函数的return语句

int test1()

{

   printf("111111\n");

 

   //return 0;

   exit(0);//在子函数中调用exit同样代表程序终止,但在子函数中调用return只是子函数终止,程序正常执行

 

   printf("222222\n");

}

 

int main()

{

   test1();

   printf("AAAAAA\n");

   exit(100);//exit是C语言的库函数,调用exit的结果就是程序终止

   return 100;//在main函数中调用exit与调用return是一样的

   printf("CCCCCCC\n");

 

   return 0;//main函数return代表程序终止

   printf("BBBBBB\n");

}

 

1.5   多个源代码文件程序的编译

1.5.1   头文件的使用

如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,那么就需要在第一个文件中声明函数原型。

如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了。把函数声明放入头文件是很好的习惯。

1.5.2   #include与#define的意义

#include就是简单的文件内容替换

#define就是简单的文本替换而已

1.5.3   #ifndef与#endif

#ifndef的意思就是条件预编译,如果#ifndef 后面的条件成立,那么就预编译从#ifndef开始到#endif之间的代码,否则不会去预编译这段代码

1.6   函数的递归

函数可以调用自己,这就叫函数的递归

void recurse(int i)

{

    if (i > 0)

    {

       recurse(i - 1);

    }

    printf("i = %d\n", i);

}

 

int main()

{

    recurse(10);

    return 0;

}

 

1.6.1   递归的过程分析

void up_down(int  n)

{

    printf("in %d, location %p\n", n, &n);

    if (n < 4)

       up_down((n + 1));

    printf("out %d, location %p\n", n, &n);

}

 

int main()

{

    up_down(1);

    return 0;

}

技术分享

技术分享

技术分享

有n个人排成一队,问第n个人多少岁,他回答比前面一个人大2岁,再问前面一个人多少岁,他回答比前面一个人大2岁,一直问到最后问第一个人,他回答10岁

int age(int n)

{

   int i;

   if (n == 1)

      i = 10;

   else

      i = age(n - 1) + 2;

   return i;

}

 

10进制数转化为二进制数的例子

234在十进制下为2 * 10的2次方 + 3 * 10的1次方 + 4*10的0次方。

奇数的二进制最后一位一定是1,偶数的二进制最后一位一定是0。

可以通过 number % 2 得到二进制形式的最后一位,如果要将一个完整的整数转化为二进制就需要用到递归函数。

在递归调用之前,计算 number % 2的值,然后在递归调用语句之后进行输出,这样计算出的第一个数值反而在最后一个输出。

为了得出下一个数,需要把原数除以2,这种计算相当于十进制下把小数点左移一位,如果此时得出的数是偶数,,则下一个二进制的数值是0,如果得出的是奇数,那么下一个二进制数为1。

直到被2除的结果小于2,就停止递归。

void to_binary(unsigned int n)

{

   unsigned int i = n % 2;

   if (n >= 2)

      to_binary(n / 2);

   printf("%c", i + 0x30);

}

 

斐波那契数列例子

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

第0项是0,第1项是第一个1。

这个数列从第2项开始,每一项都等于前两项之和。

int fib(int n)

{

   if (n == 0)

      return 0;

   if (n == 1)

      return 1;

   if (n > 1)

      return fib(n - 1) + fib(n - 2);

}

 

1.6.2   递归的优点

递归给某些编程问题提供了最简单的方法

1.6.3   递归的缺点

一个有缺陷的递归会很快耗尽计算机的资源,递归的程序难以理解和维护。

C语言基础-第五课-函数

标签:而在   end   down   自定义函数   代码   意思   次方   binary   斐波那契   

原文地址:http://www.cnblogs.com/dante617/p/7273602.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!