首页 > 其他分享 >8.函数上

8.函数上

时间:2022-10-06 16:55:42浏览次数:35  
标签:return 函数 递归 int printf main

函数

函数的原型和调用

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

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实参可以是变量,常量或者表达式

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

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

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

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

函数的返回类型与返回值

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

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

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

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");
}

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

头文件的使用

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

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

#include与#define的意义

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

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

#ifndef与#endif

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

函数的递归

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

void recurse(int i){	
    if (i > 0)	{		
        recurse(i - 1);
    }	
    printf("i = %d\n", i);
} 
int main(){	
    recurse(10);	
    return 0;
}

递归的过程分析

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;
}

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml9124\wps1.jpg)

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml9124\wps2.jpg)

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml9124\wps3.jpg)

有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);
}

递归的优点

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

递归的缺点

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

标签:return,函数,递归,int,printf,main
From: https://www.cnblogs.com/sys2410/p/16757958.html

相关文章

  • C语言:三角函数的参数为弧度,通常的角度值需要转化为弧度
    #include<stdio.h>#include<math.h>//三角函数的参数为弧度,是角度必须转化为弧度//3.14=180,1度=3.14/180,转化方法:(3.14/180)*角度值main(){floata,b,c;......
  • 对于函数递归的理解
    递归的代码操作就是在自己未完成的函数之中调用自己这样看起来是并不合理的,因为在一个为完成的东西之中使用他自己,是不太现实的但是如果从代码执行的逻辑来进行理解的话,......
  • 网络字节序与主机字节序的转换函数实践。
    为了进行转换,BSDsocket提供了转换的函数,有下面四个:(BSDSocket是UNIX系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制)头文件:#inc......
  • 分组函数
    多行处理函数多行处理函数的特点:输入多行,最终输出一行count计数sum求和avg平均值max最大值min最小值注意:分组函数在使用的时候必须先进行分组,然后才能用如......
  • SQL 标量函数-----日期函数 day() 、month()、year()
      selectday(createtime)fromlife_unite_product    --取时间字段的天值selectmonth(createtime)fromlife_unite_product  --取时间字段的月值selec......
  • JZOJ 7685. 【2022.10.06冲剌NOIP2022模拟】奇怪的函数(function)
    \(\text{Solution}\)观察到关于\(x\)的函数在\(n\)个操作之后一定是这样的:一段水平直线加上一段斜率为\(1\)的直线再加上一段水平直线于是线段树维护这个分段函数......
  • 2022牛客OI赛前集训营-提高组(第一场) 奇怪的函数 根号很好用
    奇怪的函数考虑暴力,每次查询\(O(n)\)扫所有操作,修改\(O(1)\)这启发我们平衡复杂度,考虑分块。观察题目性质,可以发现,经过若干次操作后得到的结果一定是一个关于\(x\)的分......
  • 网络字节序与主机字节序的转换函数实践
    1.什么是字节序字节序是处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。简单来说,就是指超过一个字节的数据类型在内存中的存储的顺序。那么很明显,像......
  • TCP与UDP的联系与区别,网络字节序与主机字节序的转换函数实践
     (1)TCP与UDP的联系与区别:TCP是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接,一个TCP连接必须要经过三次“对话”才能建立起来。UDP是与TCP相对应的协......
  • mysql count函数
    1.count(1)andcount(字段)两者的主要区别是(1) count(1) 会统计表中的所有的记录数,包含字段为null 的记录。(2) count(字段) 会统计该字段在表中出现的次数,忽略字段......