函数:为了完成某些功能而编写若干行代码的集合。可以供同一个程序或其他程序调用。
主要是帮助我们解决一些需要重复使用的代码动作,使之更方便,更优化,页面更整洁
函数分为系统本身的函数和我们自定义的函数
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); } } |