函数的解析

函数:为了完成某些功能而编写若干行代码的集合。可以供同一个程序或其他程序调用。

主要是帮助我们解决一些需要重复使用的代码动作,使之更方便,更优化,页面更整洁

函数分为系统本身的函数和我们自定义的函数

math.h

系统本身的函数,今天主要了解了math.h函数库

在引用这些函数库中的函数时,需要在代码的最前端添加#include <math.h>,这样才可以合理的被利用

Math函数库中,比较常见的函数,天花板数double ceil(double x) 返回不小于x的最小整数,地板数double floor(double x) 返回不大于x的最大整数.

比如:

  printf("%lf",ceil(12.1));//13,比12.1大的最小整数

  printf("%lf",ceil(12.8));//13

  printf("%lf",ceil(-12.1));//12

  printf("%lf",ceil(-12.8));//12

  printf("%lf",floor(12.1));//12

  printf("%lf",floor(12.8));//12

  printf("%lf",floor(-12.1));//-13

  printf("%lf",floor(-12.8));//-13

天花板数就相当于,在它头顶比它大的离它最近那个整数

地板数就相当于,在它脚下比它小的离它最近那个整数,这样就很好理解了

还有常见的int rand()随机数,随机获取一个0-32768之间的int类型的值。需要注意的是它不是真正的随机数,只是一个伪随机数,为什么这样说呢,请看下面:

  int i;
  for(i=0;i<10;i++){
  printf("%d\t",rand()%100);
  }

结果:41      67      34      0       69      24      78      58      62      64

第二次运行:

结果:41      67      34      0       69      24      78      58      62      64

这两个一模一样,随机出来的固定了,因为rand()在运行的时候系统给一个默认的种子,在这个种子的基础上随机,随机结果就会固定如何改变呢?

那就让它的种子处于变化中,在前面for循环上面加上一句srand((unsigned)time(NULL))这表示种子是当前时间的到电脑公元时间1970-01-01-00-00-00之间的毫秒数,时间处于变化之中,随机数就必然改变

还有很多函数,比如double pow(double x,double y) 返回x^y的值,等等,比较常用的就是随机数了 

自定义函数:

函数的自定义格式:

返回值类型 函数名称(数据类型 参数1,数据类型,参数2,...)...

举个最常见的例子 void main(){}

返回值类型void(空的)参数名称main,参数列表为空

自定义函数使用的规范就是先在开头使用函数原型 返回值类型 函数名(参数列表);需要注意的是可以不使用参数列表中的参数名

比如

#include <stdio.h>
int pieAdd(int);
void main(){
  int i,n;

  printf("请输入数字:\n");

  scanf("%d",&n);
  i=pieAdd(n);
  printf("结果是%d",i);

}

int pieAdd(int n){
  int i,sum=0;
  for(i=1;i<=n;i++){
  sum+=i;
}
  return sum;
}

这个函数pieAdd(int n)求的是1+2+...+n之间的和,使用之前现在开头加上int pieAdd(int),然后在main函数之中调用,这样以后有这种求和的情况,可以直接调用这个函数,而不是麻烦的再去写循环,有这个思路在就解决了很多不必要的重复代码

写一个函数void rose(int n),判断某一个四位数是不是玫瑰花数(所谓玫瑰花数即该四位数各位数字的四次方和恰好等于该数本身。比如:1634=1^4+6^4+3^4+4^4

void rose(int n);//判断N是否为玫瑰花数

void main()

{

   rose(1634);//函数调用

}

void rose(int n){

int ge,shi,bai,qian,sum;

//获取个位  //1234===>1234%10==>4

ge=n%10;

//获取十位 //1234==>1234/10==>123%10==>3

   shi=n/10%10;

//获取百位 //1234==>1234/10==>123/10==>12%10==>2

bai=n/10/10%10;

//获取千位 //1234/10==>123/10==>12/10==>1

    qian=n/1000;

    sum=pow(ge,4)+pow(shi,4)+pow(bai,4)+pow(qian,4);

    if(sum==n){

        printf("%d是一个玫瑰花数\n",n);

    }else{

        printf("%d不是一个玫瑰花数\n",n);  

    }

}

函数还有一种经典用法,递归调用

函数的递归调用:函数自身调用自身。

使用递归实现计算N的阶乘

#include <stdio.h>

int factorinal(int a);//函数递归调用实现计算阶乘

void main()

{

  int sum = factorinal(5);

  printf("5的阶乘为%d",sum);

}

//计算a的阶乘

int factorinal(int a)

{

if(a==1){

  return 1;

}else{

  return a*factorinal(a-1);

}

}

还有最有名的菲波那切数列: 1  1  2  3   5   8  13   21.... 

公式:f(n)=f(n-1)+f(n-2); n>2

下面关于递归表达菲波那切数列最经典的例子

不死神兔:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月,后每个月又生一对兔子,假如兔子都不死,1年后总共有多少对兔子?

#include <stdio.h>

int fibonacii(int n);//斐波那契数列

void main()

{

int num = fibonacii(12);

printf("1年后共有%d对兔子",num);

}

int fibonacii(int n){

if(n==1||n==2){

return 1;

}else{

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

}

}

原文地址:https://www.cnblogs.com/jiawenxu/p/6606676.html